diff options
author | Jin Cao <jinyan@google.com> | 2014-11-02 19:20:29 +0000 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2014-11-02 19:20:29 +0000 |
commit | efff586a4b650b55e4952fac0cbeb9cf7cbc08a1 (patch) | |
tree | ee513081bf3bd500c61efddd1f8807b12ea05602 | |
parent | 44e7692134ecffba7f8a88bd3f1c21f80b61b2be (diff) | |
parent | 927029c5c5e65a622f13bbd662c5ec7f193d28ed (diff) | |
download | UnifiedEmail-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.java | 130 |
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); + } + } + } + } |