summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJin Cao <jinyan@google.com>2014-11-02 19:20:29 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2014-11-02 19:20:29 +0000
commitefff586a4b650b55e4952fac0cbeb9cf7cbc08a1 (patch)
treeee513081bf3bd500c61efddd1f8807b12ea05602
parent44e7692134ecffba7f8a88bd3f1c21f80b61b2be (diff)
parent927029c5c5e65a622f13bbd662c5ec7f193d28ed (diff)
downloadUnifiedEmail-efff586a4b650b55e4952fac0cbeb9cf7cbc08a1.tar.gz
am 927029c5: am 3983afc4: Merge "Hardware accelerate drawer cross-fade" into ub-gmail-ur14-dev
* commit '927029c5c5e65a622f13bbd662c5ec7f193d28ed': Hardware accelerate drawer cross-fade
-rw-r--r--src/com/android/mail/ui/FolderListFragment.java130
1 files changed, 85 insertions, 45 deletions
diff --git a/src/com/android/mail/ui/FolderListFragment.java b/src/com/android/mail/ui/FolderListFragment.java
index c631b6355..6acd39d39 100644
--- a/src/com/android/mail/ui/FolderListFragment.java
+++ b/src/com/android/mail/ui/FolderListFragment.java
@@ -19,6 +19,7 @@ package com.android.mail.ui;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
+import android.animation.ObjectAnimator;
import android.app.Activity;
import android.app.ListFragment;
import android.app.LoaderManager;
@@ -220,36 +221,13 @@ public class FolderListFragment extends ListFragment implements
// TODO: but Material account switcher doesn't recycle...
private int mMiniDrawerAvatarDecodeSize;
- private AnimatorListenerAdapter mMiniDrawerFadeOutListener = new AnimatorListenerAdapter() {
- private boolean mCanceled;
+ private AnimatorListenerAdapter mMiniDrawerFadeOutListener;
+ private AnimatorListenerAdapter mListViewFadeOutListener;
+ private AnimatorListenerAdapter mMiniDrawerFadeInListener;
+ private AnimatorListenerAdapter mListViewFadeInListener;
- @Override
- public void onAnimationCancel(Animator animation) {
- mCanceled = true;
- }
-
- @Override
- public void onAnimationEnd(Animator animation) {
- if (!mCanceled) {
- mMiniDrawerView.setVisibility(View.INVISIBLE);
- }
- }
- };
- private AnimatorListenerAdapter mListViewFadeOutListener = new AnimatorListenerAdapter() {
- private boolean mCanceled;
-
- @Override
- public void onAnimationCancel(Animator animation) {
- mCanceled = true;
- }
-
- @Override
- public void onAnimationEnd(Animator animation) {
- if (!mCanceled) {
- mListView.setVisibility(View.INVISIBLE);
- }
- }
- };
+ private ObjectAnimator mCurrentMiniDrawerAnimator;
+ private ObjectAnimator mCurrentListViewAnimator;
/**
* Constructor needs to be public to handle orientation changes and activity lifecycle events.
@@ -516,6 +494,12 @@ public class FolderListFragment extends ListFragment implements
mMiniDrawerView = (MiniDrawerView) rootView.findViewById(R.id.mini_drawer);
+ // Create default animator listeners
+ mMiniDrawerFadeOutListener = new FadeAnimatorListener(mMiniDrawerView, true /* fadeOut */);
+ mListViewFadeOutListener = new FadeAnimatorListener(mListView, true /* fadeOut */);
+ mMiniDrawerFadeInListener = new FadeAnimatorListener(mMiniDrawerView, false /* fadeOut */);
+ mListViewFadeInListener = new FadeAnimatorListener(mListView, false /* fadeOut */);
+
return rootView;
}
@@ -809,34 +793,53 @@ public class FolderListFragment extends ListFragment implements
mIsMinimized = minimized;
+ // Cancel any current running animation if exists
+ if (mCurrentMiniDrawerAnimator != null) {
+ mCurrentMiniDrawerAnimator.cancel();
+ }
+ if (mCurrentListViewAnimator != null) {
+ mCurrentListViewAnimator.cancel();
+ }
+
+ Utils.enableHardwareLayer(mMiniDrawerView);
+ Utils.enableHardwareLayer(mListView);
if (mIsMinimized) {
// From the current state (either maximized or partially dragged) to minimized.
final float startAlpha = mListView.getAlpha();
final long duration = (long) (startAlpha * DRAWER_FADE_VELOCITY_MS_PER_ALPHA);
mMiniDrawerView.setVisibility(View.VISIBLE);
- mMiniDrawerView.animate()
- .alpha(1f)
- .setDuration(duration)
- .setListener(null);
- mListView.animate()
- .alpha(0f)
- .setDuration(duration)
- .setListener(mListViewFadeOutListener);
+
+ // Animate the mini-drawer to fade in.
+ mCurrentMiniDrawerAnimator = createFadeAnimation(mMiniDrawerView, 1f, duration,
+ mMiniDrawerFadeInListener);
+ // Animate the list view to fade out.
+ mCurrentListViewAnimator = createFadeAnimation(mListView, 0f, duration,
+ mListViewFadeOutListener);
} else {
// From the current state (either minimized or partially dragged) to maximized.
final float startAlpha = mMiniDrawerView.getAlpha();
final long duration = (long) (startAlpha * DRAWER_FADE_VELOCITY_MS_PER_ALPHA);
- mMiniDrawerView.animate()
- .alpha(0f)
- .setDuration(duration)
- .setListener(mMiniDrawerFadeOutListener);
mListView.setVisibility(View.VISIBLE);
- mListView.animate()
- .alpha(1f)
- .setDuration(duration)
- .setListener(null);
mListView.requestFocus();
+
+ // Animate the mini-drawer to fade out.
+ mCurrentMiniDrawerAnimator = createFadeAnimation(mMiniDrawerView, 0f, duration,
+ mMiniDrawerFadeOutListener);
+ // Animate the list view to fade in.
+ mCurrentListViewAnimator = createFadeAnimation(mListView, 1f, duration,
+ mListViewFadeInListener);
}
+
+ mCurrentMiniDrawerAnimator.start();
+ mCurrentListViewAnimator.start();
+ }
+
+ private ObjectAnimator createFadeAnimation(View v, float alpha, long duration,
+ AnimatorListenerAdapter listener) {
+ final ObjectAnimator anim = ObjectAnimator.ofFloat(v, "alpha", alpha);
+ anim.setDuration(duration);
+ anim.addListener(listener);
+ return anim;
}
public void onDrawerDrag(float percent) {
@@ -1721,4 +1724,41 @@ public class FolderListFragment extends ListFragment implements
return mMiniDrawerAccountsAdapter;
}
+ private static class FadeAnimatorListener extends AnimatorListenerAdapter {
+ private boolean mCanceled;
+ private final View mView;
+ private final boolean mFadeOut;
+
+ FadeAnimatorListener(View v, boolean fadeOut) {
+ mView = v;
+ mFadeOut = fadeOut;
+ }
+
+ @Override
+ public void onAnimationStart(Animator animation) {
+ if (!mFadeOut) {
+ mView.setVisibility(View.VISIBLE);
+ }
+ mCanceled = false;
+ }
+
+ @Override
+ public void onAnimationCancel(Animator animation) {
+ mCanceled = true;
+ }
+
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ if (!mCanceled) {
+ // Only need to set visibility to INVISIBLE for fade-out and not fade-in.
+ if (mFadeOut) {
+ mView.setVisibility(View.INVISIBLE);
+ }
+ // If the animation is canceled, then the next animation onAnimationEnd will disable
+ // the hardware layer.
+ mView.setLayerType(View.LAYER_TYPE_NONE, null);
+ }
+ }
+ }
+
}