private void animateToolbar() { // this is gross but toolbar doesn't expose it's children to animate them :( View t = toolbar.getChildAt(0); if (t != null && t instanceof TextView) { TextView title = (TextView) t; // fade in and space out the title. Animating the letterSpacing performs horribly so // fake it by setting the desired letterSpacing then animating the scaleX ¯\_(ツ)_/¯ title.setAlpha(0f); title.setScaleX(0.8f); title.animate() .alpha(1f) .scaleX(1f) .setStartDelay(300) .setDuration(900) .setInterpolator(AnimUtils.getFastOutSlowInInterpolator(this)); } View amv = toolbar.getChildAt(1); if (amv != null & amv instanceof ActionMenuView) { ActionMenuView actions = (ActionMenuView) amv; popAnim(actions.getChildAt(0), 500, 200); // filter popAnim(actions.getChildAt(1), 700, 200); // overflow } }
private void animateToolbar() { if (Build.VERSION.SDK_INT >= 21) { // this is gross but toolbar doesn't expose it's children to animate them :( View t = toolbar.getChildAt(0); if (t != null && t instanceof TextView) { TextView title = (TextView) t; // fade in and space out the title. Animating the letterSpacing performs horribly so // fake it by setting the desired letterSpacing then animating the scaleX ¯\_(ツ)_/¯ title.setAlpha(0f); title.setScaleX(0.8f); title.animate() .alpha(1f) .scaleX(1f) .setStartDelay(300) .setDuration(900) .setInterpolator(AnimUtils.getFastOutSlowInInterpolator(this)); } View amv = toolbar.getChildAt(1); if (amv != null & amv instanceof ActionMenuView) { ActionMenuView actions = (ActionMenuView) amv; popAnim(actions.getChildAt(0), 500, 200); // filter popAnim(actions.getChildAt(1), 700, 200); // overflow } } }
private void processMenuView(ViewGroup viewGroup) { for (int i = 0; i < viewGroup.getChildCount(); i++) { View child = viewGroup.getChildAt(i); try { if (child instanceof ActionMenuView) { processActionMenuView((ActionMenuView) child); } else if (child instanceof android.support.v7.widget.ActionMenuView) { processSupportActionMenuView((android.support.v7.widget.ActionMenuView) child); } } catch (NoClassDefFoundError e) { // not a error com.android.support:appcompat-v7 is not used in project } } }
@BindingAdapter("menu") public static void inflateMenu(final ActionMenuView amv, final @MenuRes int old_menu, final @MenuRes int new_menu) { if (SDK_INT < LOLLIPOP) return; if (new_menu == old_menu) return; final Menu menu = amv.getMenu(); menu.clear(); new MenuInflater(amv.getContext()).inflate(new_menu, menu); }
/** * Use this method to colorize toolbar icons to the desired target color * * @param toolbarView toolbar view being colored * @param toolbarIconsColor the target color of toolbar icons * @param activity reference to activity needed to register observers */ public static void colorizeToolbar(Toolbar toolbarView, int toolbarIconsColor, Activity activity) { final PorterDuffColorFilter colorFilter = new PorterDuffColorFilter(toolbarIconsColor, PorterDuff.Mode.MULTIPLY); for (int i = 0; i < toolbarView.getChildCount(); i++) { final View v = toolbarView.getChildAt(i); //Step 1 : Changing the color of back button (or open drawer button). if (v instanceof ImageButton) { //Action Bar back button ((ImageButton) v).getDrawable().setColorFilter(colorFilter); } if (v instanceof ActionMenuView) { for (int j = 0; j < ((ActionMenuView) v).getChildCount(); j++) { //Step 2: Changing the color of any ActionMenuViews - icons that //are not back button, nor text, nor overflow menu icon. final View innerView = ((ActionMenuView) v).getChildAt(j); if (innerView instanceof ActionMenuItemView) { int drawablesCount = ((ActionMenuItemView) innerView).getCompoundDrawables().length; for (int k = 0; k < drawablesCount; k++) { if (((ActionMenuItemView) innerView).getCompoundDrawables()[k] != null) { final int finalK = k; //Important to set the color filter in seperate thread, //by adding it to the message queue //Won't work otherwise. innerView.post(new Runnable() { @Override public void run() { ((ActionMenuItemView) innerView).getCompoundDrawables()[finalK].setColorFilter(colorFilter); } }); } } } } } //Step 3: Changing the color of title and subtitle. toolbarView.setTitleTextColor(toolbarIconsColor); toolbarView.setSubtitleTextColor(toolbarIconsColor); //Step 4: Changing the color of the Overflow Menu icon. setOverflowButtonColor(activity, colorFilter); } }
private void processSupportActionMenuView(android.support.v7.widget.ActionMenuView menuView) { Menu menu = menuView.getMenu(); processMenu(menu); }
@TargetApi(21) private void processActionMenuView(ActionMenuView menuView) { Menu menu = menuView.getMenu(); processMenu(menu); }