Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(53)

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuAdapter.java

Issue 388803006: Add per-item animations to the menu (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuAdapter.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuAdapter.java
index d31dcf4bb0c4013e64a052da29bc36a6d255d92f..760dbb1f2c9d44a6c71a9241e8f19e2b92431957 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuAdapter.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuAdapter.java
@@ -4,14 +4,20 @@
package org.chromium.chrome.browser.appmenu;
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.AnimatorSet;
+import android.animation.ObjectAnimator;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
+import android.view.animation.DecelerateInterpolator;
import android.widget.BaseAdapter;
import android.widget.ImageButton;
+import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
@@ -43,16 +49,25 @@ class AppMenuAdapter extends BaseAdapter {
*/
private static final int FOUR_BUTTON_MENU_ITEM = 3;
+ /** MenuItem Animation Constants */
+ private static final int ENTER_ITEM_DURATION_MS = 500;
+ private static final int ENTER_ITEM_BASE_DELAY_MS = 100;
+ private static final int ENTER_ITEM_ADDL_DELAY_MS = 70;
+ private static final float ENTER_STANDARD_ITEM_OFFSET_Y_DP = -10.f;
+ private static final float ENTER_STANDARD_ITEM_OFFSET_X_DP = 10.f;
+
private final AppMenu mAppMenu;
private final LayoutInflater mInflater;
private final List<MenuItem> mMenuItems;
private final int mNumMenuItems;
+ private final float mDpToPx;
public AppMenuAdapter(AppMenu appMenu, List<MenuItem> menuItems, LayoutInflater inflater) {
mAppMenu = appMenu;
mMenuItems = menuItems;
mInflater = inflater;
mNumMenuItems = menuItems.size();
+ mDpToPx = inflater.getContext().getResources().getDisplayMetrics().density;
}
@Override
@@ -104,6 +119,10 @@ class AppMenuAdapter extends BaseAdapter {
holder.text = (TextView) convertView.findViewById(R.id.menu_item_text);
holder.image = (AppMenuItemIcon) convertView.findViewById(R.id.menu_item_icon);
convertView.setTag(holder);
aurimas (slooooooooow) 2014/07/15 01:37:25 Should we set a key for this tag? I am not sure ho
David Trainor- moved to gerrit 2014/07/15 20:53:38 We don't need one. getTag()/setTag(Object) store
aurimas (slooooooooow) 2014/07/16 17:03:42 Acknowledged.
+ convertView.setTag(R.id.menu_item_enter_anim_id,
+ buildStandardItemEnterAnimator(convertView, position));
+ convertView.setTag(R.id.menu_item_exit_anim_id,
+ buildItemExitAnimator(convertView));
} else {
holder = (StandardMenuItemViewHolder) convertView.getTag();
}
@@ -133,16 +152,20 @@ class AppMenuAdapter extends BaseAdapter {
if (convertView == null) {
holder = new ThreeButtonMenuItemViewHolder();
convertView = mInflater.inflate(R.layout.three_button_menu_item, parent, false);
- holder.buttonOne = (ImageButton) convertView.findViewById(R.id.button_one);
- holder.buttonTwo = (ImageButton) convertView.findViewById(R.id.button_two);
- holder.buttonThree = (ImageButton) convertView.findViewById(R.id.button_three);
+ holder.buttons[0] = (ImageButton) convertView.findViewById(R.id.button_one);
+ holder.buttons[1] = (ImageButton) convertView.findViewById(R.id.button_two);
+ holder.buttons[2] = (ImageButton) convertView.findViewById(R.id.button_three);
convertView.setTag(holder);
+ convertView.setTag(R.id.menu_item_enter_anim_id,
+ buildIconItemEnterAnimator(holder.buttons, false));
+ convertView.setTag(R.id.menu_item_exit_anim_id,
+ buildItemExitAnimator(convertView));
} else {
holder = (ThreeButtonMenuItemViewHolder) convertView.getTag();
}
- setupImageButton(holder.buttonOne, item.getSubMenu().getItem(0));
- setupImageButton(holder.buttonTwo, item.getSubMenu().getItem(1));
- setupImageButton(holder.buttonThree, item.getSubMenu().getItem(2));
+ setupImageButton(holder.buttons[0], item.getSubMenu().getItem(0));
+ setupImageButton(holder.buttons[1], item.getSubMenu().getItem(1));
+ setupImageButton(holder.buttons[2], item.getSubMenu().getItem(2));
convertView.setFocusable(false);
convertView.setEnabled(false);
break;
@@ -152,18 +175,22 @@ class AppMenuAdapter extends BaseAdapter {
if (convertView == null) {
holder = new FourButtonMenuItemViewHolder();
convertView = mInflater.inflate(R.layout.four_button_menu_item, parent, false);
- holder.buttonOne = (ImageButton) convertView.findViewById(R.id.button_one);
- holder.buttonTwo = (ImageButton) convertView.findViewById(R.id.button_two);
- holder.buttonThree = (ImageButton) convertView.findViewById(R.id.button_three);
- holder.buttonFour = (ImageButton) convertView.findViewById(R.id.button_four);
+ holder.buttons[0] = (ImageButton) convertView.findViewById(R.id.button_one);
+ holder.buttons[1] = (ImageButton) convertView.findViewById(R.id.button_two);
+ holder.buttons[2] = (ImageButton) convertView.findViewById(R.id.button_three);
+ holder.buttons[3] = (ImageButton) convertView.findViewById(R.id.button_four);
convertView.setTag(holder);
+ convertView.setTag(R.id.menu_item_enter_anim_id,
+ buildIconItemEnterAnimator(holder.buttons, false));
+ convertView.setTag(R.id.menu_item_exit_anim_id,
+ buildItemExitAnimator(convertView));
} else {
holder = (FourButtonMenuItemViewHolder) convertView.getTag();
}
- setupImageButton(holder.buttonOne, item.getSubMenu().getItem(0));
- setupImageButton(holder.buttonTwo, item.getSubMenu().getItem(1));
- setupImageButton(holder.buttonThree, item.getSubMenu().getItem(2));
- setupImageButton(holder.buttonFour, item.getSubMenu().getItem(3));
+ setupImageButton(holder.buttons[0], item.getSubMenu().getItem(0));
+ setupImageButton(holder.buttons[1], item.getSubMenu().getItem(1));
+ setupImageButton(holder.buttons[2], item.getSubMenu().getItem(2));
+ setupImageButton(holder.buttons[3], item.getSubMenu().getItem(3));
convertView.setFocusable(false);
convertView.setEnabled(false);
break;
@@ -176,6 +203,10 @@ class AppMenuAdapter extends BaseAdapter {
holder.title = (TextView) convertView.findViewById(R.id.title);
holder.button = (ImageButton) convertView.findViewById(R.id.button);
convertView.setTag(holder);
+ convertView.setTag(R.id.menu_item_enter_anim_id,
+ buildStandardItemEnterAnimator(convertView, position));
+ convertView.setTag(R.id.menu_item_exit_anim_id,
+ buildItemExitAnimator(convertView));
} else {
holder = (TitleButtonMenuItemViewHolder) convertView.getTag();
}
@@ -222,22 +253,81 @@ class AppMenuAdapter extends BaseAdapter {
});
}
+ private Animator buildStandardItemEnterAnimator(final View view, int position) {
aurimas (slooooooooow) 2014/07/15 01:37:26 Please add some comments to these animator constru
David Trainor- moved to gerrit 2014/07/15 20:53:38 Will do.
+ final float offsetYPx = ENTER_STANDARD_ITEM_OFFSET_Y_DP * mDpToPx;
+ final int startDelay = ENTER_ITEM_BASE_DELAY_MS + ENTER_ITEM_ADDL_DELAY_MS * position;
+
+ AnimatorSet animation = new AnimatorSet();
+ animation.playTogether(
+ ObjectAnimator.ofFloat(view, View.ALPHA, 0.f, 1.f),
+ ObjectAnimator.ofFloat(view, View.TRANSLATION_Y, offsetYPx, 0.f));
+ animation.setDuration(ENTER_ITEM_DURATION_MS);
+ animation.setStartDelay(startDelay);
+ // TODO(dtrainor): Update to material interpolators.
+ animation.setInterpolator(new DecelerateInterpolator());
+
+ animation.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationStart(Animator animation) {
+ view.setAlpha(0.f);
+ }
+ });
+ return animation;
+ }
+
+ private Animator buildIconItemEnterAnimator(final ImageView[] views, boolean skipLastItem) {
+ final float offsetXPx = ENTER_STANDARD_ITEM_OFFSET_X_DP * mDpToPx;
+ final int maxViewsToAnimate = views.length - (skipLastItem ? 1 : 0);
+
+ AnimatorSet animation = new AnimatorSet();
+ AnimatorSet.Builder builder = null;
+ for (int i = 0; i < maxViewsToAnimate; i++) {
+ final int startDelay = ENTER_ITEM_ADDL_DELAY_MS * i;
+
+ Animator alpha = ObjectAnimator.ofFloat(views[i], View.ALPHA, 0.f, 1.f);
+ Animator translate = ObjectAnimator.ofFloat(views[i], View.TRANSLATION_X, offsetXPx, 0);
+ alpha.setStartDelay(startDelay);
+ translate.setStartDelay(startDelay);
+ alpha.setDuration(ENTER_ITEM_DURATION_MS);
+ translate.setDuration(ENTER_ITEM_DURATION_MS);
+
+ if (builder == null) {
+ builder = animation.play(alpha);
+ } else {
+ builder.with(alpha);
+ }
+ builder.with(translate);
+ }
+ animation.setStartDelay(ENTER_ITEM_BASE_DELAY_MS);
+ // TODO(dtrainor): Update to material interpolators.
+ animation.setInterpolator(new DecelerateInterpolator());
+
+ animation.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationStart(Animator animation) {
+ for (int i = 0; i < maxViewsToAnimate; i++) {
+ views[i].setAlpha(0.f);
+ }
+ }
+ });
+ return animation;
+ }
+
+ private Animator buildItemExitAnimator(View view) {
+ return ObjectAnimator.ofFloat(view, View.ALPHA, 1.f, 0.f).setDuration(0);
aurimas (slooooooooow) 2014/07/15 01:37:26 What does it mean to have an animation of length 0
David Trainor- moved to gerrit 2014/07/15 20:53:38 It means right now they just hide immediately. Bu
aurimas (slooooooooow) 2014/07/16 17:03:42 Acknowledged.
+ }
+
static class StandardMenuItemViewHolder {
public TextView text;
public AppMenuItemIcon image;
}
static class ThreeButtonMenuItemViewHolder {
- public ImageButton buttonOne;
- public ImageButton buttonTwo;
- public ImageButton buttonThree;
+ public ImageButton[] buttons = new ImageButton[3];
}
static class FourButtonMenuItemViewHolder {
- public ImageButton buttonOne;
- public ImageButton buttonTwo;
- public ImageButton buttonThree;
- public ImageButton buttonFour;
+ public ImageButton[] buttons = new ImageButton[4];
}
static class TitleButtonMenuItemViewHolder {

Powered by Google App Engine
This is Rietveld 408576698