package it.sephiroth.android.library.bottomnavigation; import android.animation.ArgbEvaluator; import android.animation.ObjectAnimator; import android.animation.ValueAnimator; import android.annotation.SuppressLint; import android.content.res.Resources; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.PorterDuff; import android.support.v4.view.ViewCompat; import android.view.animation.DecelerateInterpolator; import android.view.animation.Interpolator; import it.sephiroth.android.library.bottonnavigation.R; /** * Created by alessandro on 4/3/16 at 10:55 PM. * Project: MaterialBottomNavigation */ @SuppressLint ("ViewConstructor") public class BottomNavigationTabletItemView extends BottomNavigationItemViewAbstract { private static final String TAG = BottomNavigationTabletItemView.class.getSimpleName(); private final int iconSize; private final Interpolator interpolator = new DecelerateInterpolator(); private long animationDuration; private final int colorActive; private final int colorInactive; private final int colorDisabled; private final ArgbEvaluator evaluator; public BottomNavigationTabletItemView(final BottomNavigation parent, boolean expanded, final MenuParser.Menu menu) { super(parent, expanded, menu); this.evaluator = new ArgbEvaluator(); final Resources res = getResources(); this.iconSize = res.getDimensionPixelSize(R.dimen.bbn_tablet_item_icon_size); this.animationDuration = menu.getItemAnimationDuration(); this.colorActive = menu.getColorActive(); this.colorInactive = menu.getColorInactive(); this.colorDisabled = menu.getColorDisabled(); } @Override protected void onStatusChanged(final boolean expanded, final int size, final boolean animate) { if (!animate) { updateLayoutOnAnimation(1, expanded); return; } final ValueAnimator animator = ObjectAnimator.ofFloat(0, 1); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(final ValueAnimator animation) { updateLayoutOnAnimation(animation.getAnimatedFraction(), expanded); } }); animator.setDuration(animationDuration); animator.setInterpolator(interpolator); animator.start(); } private void updateLayoutOnAnimation(final float fraction, final boolean expanded) { final boolean enabled = isEnabled(); final int dstColor = enabled ? (expanded ? colorActive : colorInactive) : colorDisabled; final int srcColor = enabled ? (expanded ? colorInactive : colorActive) : colorDisabled; final int color = (Integer) evaluator.evaluate(fraction, srcColor, dstColor); icon.setColorFilter(color, PorterDuff.Mode.SRC_ATOP); icon.setAlpha(Color.alpha(color)); ViewCompat.postInvalidateOnAnimation(this); } @Override protected void onLayout(final boolean changed, final int left, final int top, final int right, final int bottom) { super.onLayout(changed, left, top, right, bottom); if (null == this.icon) { this.icon = getItem().getIcon(getContext()).mutate(); this.icon.setColorFilter( isExpanded() ? (isEnabled() ? colorActive : colorDisabled) : (isEnabled() ? colorInactive : colorDisabled), PorterDuff.Mode.SRC_ATOP ); this.icon.setAlpha(Color .alpha(isExpanded() ? (isEnabled() ? colorActive : colorDisabled) : (isEnabled() ? colorInactive : colorDisabled))); this.icon.setBounds(0, 0, iconSize, iconSize); } if (changed) { final int w = right - left; final int h = bottom - top; final int centerX = (w - iconSize) / 2; final int centerY = (h - iconSize) / 2; icon.setBounds(centerX, centerY, centerX + iconSize, centerY + iconSize); } } @Override protected void onDraw(final Canvas canvas) { super.onDraw(canvas); icon.draw(canvas); drawBadge(canvas); } }