@@ -80,10 +80,13 @@ public class NavigationTabBar extends View implements ViewPager.OnPageChangeList
8080 private final static int INVALID_INDEX = -1 ;
8181 public final static int AUTO_SIZE = -2 ;
8282 public final static int AUTO_COLOR = -3 ;
83+ public final static int AUTO_SCALE = -4 ;
8384
8485 private final static int DEFAULT_BADGE_ANIMATION_DURATION = 200 ;
8586 private final static int DEFAULT_BADGE_REFRESH_ANIMATION_DURATION = 100 ;
8687 private final static int DEFAULT_ANIMATION_DURATION = 300 ;
88+ private final static float DEFAULT_ICON_SIZE_FRACTION = 0.5F ;
89+ private final static float DEFAULT_TITLE_ICON_SIZE_FRACTION = 0.5F ;
8790
8891 private final static int DEFAULT_INACTIVE_COLOR = Color .parseColor ("#9f90af" );
8992 private final static int DEFAULT_ACTIVE_COLOR = Color .WHITE ;
@@ -97,10 +100,7 @@ public class NavigationTabBar extends View implements ViewPager.OnPageChangeList
97100 private final static int MAX_ALPHA = 255 ;
98101
99102 private final static float ACTIVE_ICON_SCALE_BY = 0.3F ;
100- private final static float ICON_SIZE_FRACTION = 0.45F ;
101-
102103 private final static float TITLE_ACTIVE_ICON_SCALE_BY = 0.2F ;
103- private final static float TITLE_ICON_SIZE_FRACTION = 0.45F ;
104104 private final static float TITLE_ACTIVE_SCALE_BY = 0.2F ;
105105 private final static float TITLE_SIZE_FRACTION = 0.2F ;
106106 private final static float TITLE_MARGIN_FRACTION = 0.15F ;
@@ -221,6 +221,7 @@ public class NavigationTabBar extends View implements ViewPager.OnPageChangeList
221221 // Variables for sizes
222222 private float mModelSize ;
223223 private float mIconSize ;
224+ private float mIconSizeFraction ;
224225 // Corners radius for rect mode
225226 private float mCornersRadius ;
226227
@@ -372,6 +373,12 @@ public NavigationTabBar(final Context context, final AttributeSet attrs, final i
372373 setCornersRadius (
373374 typedArray .getDimension (R .styleable .NavigationTabBar_ntb_corners_radius , 0.0F )
374375 );
376+ setIconSizeFraction (
377+ typedArray .getFloat (
378+ R .styleable .NavigationTabBar_ntb_icon_size_fraction ,
379+ AUTO_SCALE
380+ )
381+ );
375382
376383 // Init animator
377384 mAnimator .setFloatValues (MIN_FRACTION , MAX_FRACTION );
@@ -672,6 +679,16 @@ public void setCornersRadius(final float cornersRadius) {
672679 postInvalidate ();
673680 }
674681
682+ public float getIconSizeFraction () {
683+ return mIconSizeFraction ;
684+ }
685+
686+ // To reset scale fraction of icon to automatic just put in method AUTO_SCALE value
687+ public void setIconSizeFraction (final float iconSizeFraction ) {
688+ mIconSizeFraction = iconSizeFraction ;
689+ requestLayout ();
690+ }
691+
675692 public float getBadgeMargin () {
676693 return mBadgeMargin ;
677694 }
@@ -943,7 +960,8 @@ protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec
943960 float side = mModelSize > height ? height : mModelSize ;
944961 if (mIsBadged ) side -= side * TITLE_SIZE_FRACTION ;
945962
946- mIconSize = side * (mIsTitled ? TITLE_ICON_SIZE_FRACTION : ICON_SIZE_FRACTION );
963+ mIconSize = side * (mIconSizeFraction != AUTO_SCALE ? mIconSizeFraction :
964+ (mIsTitled ? DEFAULT_TITLE_ICON_SIZE_FRACTION : DEFAULT_ICON_SIZE_FRACTION ));
947965 if (mModelTitleSize == AUTO_SIZE ) mModelTitleSize = side * TITLE_SIZE_FRACTION ;
948966 mTitleMargin = side * TITLE_MARGIN_FRACTION ;
949967
@@ -967,7 +985,8 @@ protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec
967985 mIsBadged = false ;
968986
969987 mModelSize = (float ) height / (float ) mModels .size ();
970- mIconSize = (int ) ((mModelSize > width ? width : mModelSize ) * ICON_SIZE_FRACTION );
988+ mIconSize = (int ) ((mModelSize > width ? width : mModelSize ) *
989+ (mIconSizeFraction == AUTO_SCALE ? DEFAULT_ICON_SIZE_FRACTION : mIconSizeFraction ));
971990 }
972991
973992 // Set bounds for NTB
@@ -976,24 +995,6 @@ protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec
976995 final float barBadgeMargin = mBadgeGravity == BadgeGravity .TOP ? mBadgeMargin : 0.0F ;
977996 mBgBounds .set (0.0F , barBadgeMargin , mBounds .width (), mBounds .height () + barBadgeMargin );
978997
979- // Set main bitmap
980- mBitmap = Bitmap .createBitmap (width , height , Bitmap .Config .ARGB_8888 );
981- mCanvas .setBitmap (mBitmap );
982-
983- // Set pointer canvas
984- mPointerBitmap = Bitmap .createBitmap (width , height , Bitmap .Config .ARGB_8888 );
985- mPointerCanvas .setBitmap (mPointerBitmap );
986-
987- // Set icons canvas
988- mIconsBitmap = Bitmap .createBitmap (width , height , Bitmap .Config .ARGB_8888 );
989- mIconsCanvas .setBitmap (mIconsBitmap );
990-
991- // Set titles canvas
992- if (mIsTitled ) {
993- mTitlesBitmap = Bitmap .createBitmap (width , height , Bitmap .Config .ARGB_8888 );
994- mTitlesCanvas .setBitmap (mTitlesBitmap );
995- } else mTitlesBitmap = null ;
996-
997998 // Set scale fraction for icons
998999 for (Model model : mModels ) {
9991000 final float originalIconSize = model .mIcon .getWidth () > model .mIcon .getHeight () ?
@@ -1003,6 +1004,12 @@ protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec
10031004 (mIsTitled ? TITLE_ACTIVE_ICON_SCALE_BY : ACTIVE_ICON_SCALE_BY );
10041005 }
10051006
1007+ // Reset bitmap to init it onDraw()
1008+ mBitmap = null ;
1009+ mPointerBitmap = null ;
1010+ mIconsBitmap = null ;
1011+ if (mIsTitled ) mTitlesBitmap = null ;
1012+
10061013 // Set start position of pointer for preview or on start
10071014 if (isInEditMode () || !mIsViewPagerMode ) {
10081015 mIsSetIndexFromTabBar = true ;
@@ -1040,9 +1047,39 @@ protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec
10401047 @ SuppressWarnings ("ConstantConditions" )
10411048 @ Override
10421049 protected void onDraw (final Canvas canvas ) {
1043- if (mCanvas == null || mPointerCanvas == null ||
1044- mIconsCanvas == null || mTitlesCanvas == null )
1045- return ;
1050+ // Get height of NTB with badge on nor
1051+ final int mBadgedHeight = (int ) (mBounds .height () + mBadgeMargin );
1052+
1053+ // Set main canvas
1054+ if (mBitmap == null || mBitmap .isRecycled ()) {
1055+ mBitmap = Bitmap .createBitmap (
1056+ (int ) mBounds .width (), mBadgedHeight , Bitmap .Config .ARGB_8888
1057+ );
1058+ mCanvas .setBitmap (mBitmap );
1059+ }
1060+ // Set pointer canvas
1061+ if (mPointerBitmap == null || mPointerBitmap .isRecycled ()) {
1062+ mPointerBitmap = Bitmap .createBitmap (
1063+ (int ) mBounds .width (), mBadgedHeight , Bitmap .Config .ARGB_8888
1064+ );
1065+ mPointerCanvas .setBitmap (mPointerBitmap );
1066+ }
1067+ // Set icons canvas
1068+ if (mIconsBitmap == null || mIconsBitmap .isRecycled ()) {
1069+ mIconsBitmap = Bitmap .createBitmap (
1070+ (int ) mBounds .width (), mBadgedHeight , Bitmap .Config .ARGB_8888
1071+ );
1072+ mIconsCanvas .setBitmap (mIconsBitmap );
1073+ }
1074+ // Set titles canvas
1075+ if (mIsTitled ) {
1076+ if (mTitlesBitmap == null || mTitlesBitmap .isRecycled ()) {
1077+ mTitlesBitmap = Bitmap .createBitmap (
1078+ (int ) mBounds .width (), mBadgedHeight , Bitmap .Config .ARGB_8888
1079+ );
1080+ mTitlesCanvas .setBitmap (mTitlesBitmap );
1081+ }
1082+ } else mTitlesBitmap = null ;
10461083
10471084 // Reset and clear canvases
10481085 mCanvas .drawColor (0 , PorterDuff .Mode .CLEAR );
@@ -1188,14 +1225,17 @@ else if (i == mIndex)
11881225
11891226 // Draw original model icon
11901227 if (model .mSelectedIcon == null ) {
1191- mIconsCanvas .drawBitmap (model .mIcon , model .mIconMatrix , mIconPaint );
1228+ if (model .mIcon != null && !model .mIcon .isRecycled ())
1229+ mIconsCanvas .drawBitmap (model .mIcon , model .mIconMatrix , mIconPaint );
11921230 } else {
1193- if (mIconPaint .getAlpha () != MIN_ALPHA )
1231+ if (mIconPaint .getAlpha () != MIN_ALPHA
1232+ && model .mIcon != null && !model .mIcon .isRecycled ())
11941233 // Draw original icon when is visible
11951234 mIconsCanvas .drawBitmap (model .mIcon , model .mIconMatrix , mIconPaint );
11961235 }
11971236 // Draw selected icon when exist and visible
1198- if (model .mSelectedIcon != null && mSelectedIconPaint .getAlpha () != MIN_ALPHA )
1237+ if (mSelectedIconPaint .getAlpha () != MIN_ALPHA
1238+ && model .mSelectedIcon != null && !model .mSelectedIcon .isRecycled ())
11991239 mIconsCanvas .drawBitmap (
12001240 model .mSelectedIcon , model .mIconMatrix , mSelectedIconPaint
12011241 );
0 commit comments