3.1.源代码如下。
// FAB 行为控制器
public class ScaleDownShowBehavior extends FloatingActionButton.Behavior {
public ScaleDownShowBehavior(Context context, AttributeSet attrs) {
super();
}
@Override
public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout,
FloatingActionButton child, View directTargetChild,
View target, int nestedScrollAxes) {
if (nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL){
return true;
}
return super.onStartNestedScroll(coordinatorLayout, child, directTargetChild,
target, nestedScrollAxes);
}
private boolean isAnimateIng = false; // 是否正在动画
private boolean isShow = true; // 是否已经显示
public void onNestedScroll(CoordinatorLayout coordinatorLayout, FloatingActionButton child,
View target, int dxConsumed, int dyConsumed,
int dxUnconsumed, int dyUnconsumed) {
if ((dyConsumed > 0 || dyUnconsumed > 0) && !isAnimateIng && isShow) {// 手指上滑,隐藏FAB
AnimatorUtil.translateHide(child, new StateListener() {
@Override
public void onAnimationStart(View view) {
super.onAnimationStart(view);
isShow = false;
}
});
} else if ((dyConsumed < 0 || dyUnconsumed < 0 && !isAnimateIng && !isShow)) {
AnimatorUtil.translateShow(child, new StateListener() {
@Override
public void onAnimationStart(View view) {
super.onAnimationStart(view);
isShow = true;
}
});// 手指下滑,显示FAB
}
}
class StateListener implements ViewPropertyAnimatorListener {
@Override
public void onAnimationStart(View view) {
isAnimateIng = true;
}
@Override
public void onAnimationEnd(View view) {
isAnimateIng = false;
}
@Override
public void onAnimationCancel(View view) {
isAnimateIng = false;
}
}
}
3.2.构造函数。
这里继承了浮动按钮的行为FloatingActionButton.Behavior,构造函数直接继承基类即可。
3.3.这里重写第一个函数onStartNestedScroll
这里还是主要继承原来的即可。
3.4.定义两个变量
3.5.监听手指上滑和手指下滑
手指上滑是通过dyConsumed>0判断的,执行AnimatorUtil隐藏函数即可。
手指下滑是通过dyConsumed<0判断的,执行AnimatorUtil显示函数即可。
3.6.AnimatorUtil自定义类函数需要传入一个监听器
如果动画开始,则设置是否正在动画为true
如果动画结束,则设置是否正在动画为false
如果动画取消,则设置是否正在动画为false