diff --git a/eclair-mr1/android/support/design/widget/FloatingActionButtonEclairMr1.java b/eclair-mr1/android/support/design/widget/FloatingActionButtonEclairMr1.java index 3e36a14d9..657ad19be 100644 --- a/eclair-mr1/android/support/design/widget/FloatingActionButtonEclairMr1.java +++ b/eclair-mr1/android/support/design/widget/FloatingActionButtonEclairMr1.java @@ -158,8 +158,8 @@ class FloatingActionButtonEclairMr1 extends FloatingActionButtonImpl { @Override void hide() { - if (mIsHiding) { - // There is currently an hide animation running, return + if (mIsHiding || mView.getVisibility() != View.VISIBLE) { + // A hide animation is in progress, or we're already hidden. Skip the call return; } @@ -184,11 +184,17 @@ class FloatingActionButtonEclairMr1 extends FloatingActionButtonImpl { @Override void show() { - Animation anim = android.view.animation.AnimationUtils.loadAnimation( - mView.getContext(), R.anim.design_fab_in); - anim.setDuration(SHOW_HIDE_ANIM_DURATION); - anim.setInterpolator(AnimationUtils.FAST_OUT_SLOW_IN_INTERPOLATOR); - mView.startAnimation(anim); + if (mView.getVisibility() != View.VISIBLE || mIsHiding) { + // If the view is not visible, or is visible and currently being hidden, run + // the show animation + mView.clearAnimation(); + mView.setVisibility(View.VISIBLE); + Animation anim = android.view.animation.AnimationUtils.loadAnimation( + mView.getContext(), R.anim.design_fab_in); + anim.setDuration(SHOW_HIDE_ANIM_DURATION); + anim.setInterpolator(AnimationUtils.FAST_OUT_SLOW_IN_INTERPOLATOR); + mView.startAnimation(anim); + } } private void updatePadding() { diff --git a/honeycomb-mr1/android/support/design/widget/FloatingActionButtonHoneycombMr1.java b/honeycomb-mr1/android/support/design/widget/FloatingActionButtonHoneycombMr1.java index 62da58ec0..72ae009bc 100644 --- a/honeycomb-mr1/android/support/design/widget/FloatingActionButtonHoneycombMr1.java +++ b/honeycomb-mr1/android/support/design/widget/FloatingActionButtonHoneycombMr1.java @@ -18,6 +18,7 @@ package android.support.design.widget; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; +import android.support.v4.view.ViewCompat; import android.view.View; class FloatingActionButtonHoneycombMr1 extends FloatingActionButtonEclairMr1 { @@ -30,44 +31,67 @@ class FloatingActionButtonHoneycombMr1 extends FloatingActionButtonEclairMr1 { @Override void hide() { - if (mIsHiding) { - // A hide animation is in progress, skip the call + if (mIsHiding || mView.getVisibility() != View.VISIBLE) { + // A hide animation is in progress, or we're already hidden. Skip the call return; } - mView.animate() - .scaleX(0f) - .scaleY(0f) - .alpha(0f) - .setDuration(SHOW_HIDE_ANIM_DURATION) - .setInterpolator(AnimationUtils.FAST_OUT_SLOW_IN_INTERPOLATOR) - .setListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationStart(Animator animation) { - mIsHiding = true; - } + if (!ViewCompat.isLaidOut(mView) || mView.isInEditMode()) { + // If the view isn't laid out, or we're in the editor, don't run the animation + mView.setVisibility(View.GONE); + } else { + mView.animate() + .scaleX(0f) + .scaleY(0f) + .alpha(0f) + .setDuration(SHOW_HIDE_ANIM_DURATION) + .setInterpolator(AnimationUtils.FAST_OUT_SLOW_IN_INTERPOLATOR) + .setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationStart(Animator animation) { + mIsHiding = true; + mView.setVisibility(View.VISIBLE); + } - @Override - public void onAnimationCancel(Animator animation) { - mIsHiding = false; - } + @Override + public void onAnimationCancel(Animator animation) { + mIsHiding = false; + } - @Override - public void onAnimationEnd(Animator animation) { - mIsHiding = false; - mView.setVisibility(View.GONE); - } - }); + @Override + public void onAnimationEnd(Animator animation) { + mIsHiding = false; + mView.setVisibility(View.GONE); + } + }); + } } @Override void show() { - mView.animate() - .scaleX(1f) - .scaleY(1f) - .alpha(1f) - .setDuration(SHOW_HIDE_ANIM_DURATION) - .setInterpolator(AnimationUtils.FAST_OUT_SLOW_IN_INTERPOLATOR) - .setListener(null); + if (mView.getVisibility() != View.VISIBLE) { + if (ViewCompat.isLaidOut(mView) && !mView.isInEditMode()) { + mView.setAlpha(0f); + mView.setScaleY(0f); + mView.setScaleX(0f); + mView.animate() + .scaleX(1f) + .scaleY(1f) + .alpha(1f) + .setDuration(SHOW_HIDE_ANIM_DURATION) + .setInterpolator(AnimationUtils.FAST_OUT_SLOW_IN_INTERPOLATOR) + .setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationStart(Animator animation) { + mView.setVisibility(View.VISIBLE); + } + }); + } else { + mView.setVisibility(View.VISIBLE); + mView.setAlpha(1f); + mView.setScaleY(1f); + mView.setScaleX(1f); + } + } } } diff --git a/src/android/support/design/widget/FloatingActionButton.java b/src/android/support/design/widget/FloatingActionButton.java index df73ac82c..9a7b72725 100644 --- a/src/android/support/design/widget/FloatingActionButton.java +++ b/src/android/support/design/widget/FloatingActionButton.java @@ -239,13 +239,7 @@ public class FloatingActionButton extends ImageView { *

This method will animate it the button show if the view has already been laid out.

*/ public void show() { - if (getVisibility() == VISIBLE) { - return; - } - setVisibility(VISIBLE); - if (ViewCompat.isLaidOut(this)) { - mImpl.show(); - } + mImpl.show(); } /** @@ -253,14 +247,7 @@ public class FloatingActionButton extends ImageView { *

This method will animate the button hide if the view has already been laid out.

*/ public void hide() { - if (getVisibility() != VISIBLE) { - return; - } - if (ViewCompat.isLaidOut(this) && !isInEditMode()) { - mImpl.hide(); - } else { - setVisibility(GONE); - } + mImpl.hide(); } final int getSizeDimension() { @@ -338,7 +325,6 @@ public class FloatingActionButton extends ImageView { private static final boolean SNACKBAR_BEHAVIOR_ENABLED = Build.VERSION.SDK_INT >= 11; private Rect mTmpRect; - private float mTranslationY; @Override public boolean layoutDependsOn(CoordinatorLayout parent, @@ -366,10 +352,15 @@ public class FloatingActionButton extends ImageView { if (dependency instanceof Snackbar.SnackbarLayout) { // If the removed view is a SnackbarLayout, we will animate back to our normal // position - ViewCompat.animate(child) - .translationY(0f) - .setInterpolator(AnimationUtils.FAST_OUT_SLOW_IN_INTERPOLATOR) - .setListener(null); + if (ViewCompat.getTranslationY(child) != 0f) { + ViewCompat.animate(child) + .translationY(0f) + .scaleX(1f) + .scaleY(1f) + .alpha(1f) + .setInterpolator(AnimationUtils.FAST_OUT_SLOW_IN_INTERPOLATOR) + .setListener(null); + } } } @@ -408,13 +399,7 @@ public class FloatingActionButton extends ImageView { } final float translationY = getFabTranslationYForSnackbar(parent, fab); - if (translationY != mTranslationY) { - // First, cancel any current animation - ViewCompat.animate(fab).cancel(); - // Else we'll set use setTranslationY - ViewCompat.setTranslationY(fab, translationY); - mTranslationY = translationY; - } + ViewCompat.setTranslationY(fab, translationY); } private float getFabTranslationYForSnackbar(CoordinatorLayout parent,