Last active
August 29, 2015 14:27
-
-
Save brucetoo/311dffd27d043b4aaef5 to your computer and use it in GitHub Desktop.
FAB使用在CoordinatorLayout的隐藏动画
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.support.android.designlibdemo; | |
import android.content.Context; | |
import android.os.Build; | |
import android.support.design.widget.CoordinatorLayout; | |
import android.support.design.widget.FloatingActionButton; | |
import android.support.v4.view.ViewCompat; | |
import android.support.v4.view.ViewPropertyAnimatorListener; | |
import android.support.v4.view.animation.FastOutSlowInInterpolator; | |
import android.util.AttributeSet; | |
import android.view.View; | |
import android.view.animation.Animation; | |
import android.view.animation.AnimationUtils; | |
import android.view.animation.Interpolator; | |
/** | |
* Created by Bruce Too | |
* On 6/2/15. | |
* At 09:14 | |
* 只需要在 layout 中 | |
* app:layout_behavior="com.support.android.designlibdemo.ScrollAwareFABBehavior" 使用就OK | |
*/ | |
public class ScrollAwareFABBehavior extends FloatingActionButton.Behavior { | |
private static final Interpolator INTERPOLATOR = new FastOutSlowInInterpolator(); | |
private boolean mIsAnimatingOut = false; | |
public ScrollAwareFABBehavior(Context context, AttributeSet attrs) { | |
super(); | |
} | |
/** | |
* 滚动开始的监听 | |
* @param coordinatorLayout | |
* @param child 设置了Behavior得子view | |
* @param directTargetChild | |
* @param target 需要滚动的子view | |
* @param nestedScrollAxes 滚动轴方向 SCROLL_AXIS_HORIZONTAL, SCROLL_AXIS_VERTICAL | |
* @return | |
*/ | |
@Override | |
public boolean onStartNestedScroll(final CoordinatorLayout coordinatorLayout, final FloatingActionButton child, | |
final View directTargetChild, final View target, final int nestedScrollAxes) { | |
// Ensure we react to vertical scrolling | |
return nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL | |
|| super.onStartNestedScroll(coordinatorLayout, child, directTargetChild, target, nestedScrollAxes); | |
} | |
/** | |
* 滚动时的监听 | |
* 每一个设置了Behavior 并且是 CoordinatorLayout的直接子view都会调用此方法 | |
* 比如 FloatActionButton,AppBarLayout | |
* @param coordinatorLayout the CoordinatorLayout parent of the view this Behavior is associated with | |
* @param child the child view of the CoordinatorLayout this Behavior is associated with | |
* @param target the descendant view of the CoordinatorLayout performing the nested scroll | |
* @param dxConsumed horizontal pixels consumed by the target's own scrolling operation | |
* @param dyConsumed vertical pixels consumed by the target's own scrolling operation | |
* @param dxUnconsumed horizontal pixels not consumed by the target's own scrolling operation, but requested by the user | |
*/ | |
@Override | |
public void onNestedScroll(final CoordinatorLayout coordinatorLayout, final FloatingActionButton child, | |
final View target, final int dxConsumed, final int dyConsumed, | |
final int dxUnconsumed, final int dyUnconsumed) { | |
super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed); | |
if (dyConsumed > 0 && !this.mIsAnimatingOut && child.getVisibility() == View.VISIBLE) { | |
// User scrolled down and the FAB is currently visible -> hide the FAB | |
animateOut(child); | |
} else if (dyConsumed < 0 && child.getVisibility() != View.VISIBLE) { | |
// User scrolled up and the FAB is currently not visible -> show the FAB | |
animateIn(child); | |
} | |
/** | |
* 如果>=V22.2.1' | |
* 可以使用系统预设的动画 | |
*/ | |
// if (dyConsumed > 0 && child.getVisibility() == View.VISIBLE) { | |
// // User scrolled down and the FAB is currently visible -> hide the FAB | |
// child.hide(); | |
// } else if (dyConsumed < 0 && child.getVisibility() != View.VISIBLE) { | |
// // User scrolled up and the FAB is currently not visible -> show the FAB | |
// child.show(); | |
// } | |
} | |
// Same animation that FloatingActionButton.Behavior uses to hide the FAB when the AppBarLayout exits | |
private void animateOut(final FloatingActionButton button) { | |
if (Build.VERSION.SDK_INT >= 14) { | |
ViewCompat.animate(button).scaleX(0.0F).scaleY(0.0F).alpha(0.0F).setInterpolator(INTERPOLATOR).withLayer() | |
.setListener(new ViewPropertyAnimatorListener() { | |
public void onAnimationStart(View view) { | |
ScrollAwareFABBehavior.this.mIsAnimatingOut = true; | |
} | |
public void onAnimationCancel(View view) { | |
ScrollAwareFABBehavior.this.mIsAnimatingOut = false; | |
} | |
public void onAnimationEnd(View view) { | |
ScrollAwareFABBehavior.this.mIsAnimatingOut = false; | |
view.setVisibility(View.GONE); | |
} | |
}).start(); | |
} else { | |
Animation anim = AnimationUtils.loadAnimation(button.getContext(), R.anim.fab_out); | |
anim.setInterpolator(INTERPOLATOR); | |
anim.setDuration(200L); | |
anim.setAnimationListener(new Animation.AnimationListener() { | |
public void onAnimationStart(Animation animation) { | |
ScrollAwareFABBehavior.this.mIsAnimatingOut = true; | |
} | |
public void onAnimationEnd(Animation animation) { | |
ScrollAwareFABBehavior.this.mIsAnimatingOut = false; | |
button.setVisibility(View.GONE); | |
} | |
@Override | |
public void onAnimationRepeat(final Animation animation) { | |
} | |
}); | |
button.startAnimation(anim); | |
} | |
} | |
// Same animation that FloatingActionButton.Behavior uses to show the FAB when the AppBarLayout enters | |
private void animateIn(FloatingActionButton button) { | |
button.setVisibility(View.VISIBLE); | |
if (Build.VERSION.SDK_INT >= 14) { | |
ViewCompat.animate(button).scaleX(1.0F).scaleY(1.0F).alpha(1.0F) | |
.setInterpolator(INTERPOLATOR).withLayer().setListener(null) | |
.start(); | |
} else { | |
Animation anim = AnimationUtils.loadAnimation(button.getContext(), R.anim.fab_in); | |
anim.setDuration(200L); | |
anim.setInterpolator(INTERPOLATOR); | |
button.startAnimation(anim); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment