在我们使用CoordinateLayout 嵌套AppBarLayout 做滑动时,当在fling过程中会出现抖动情况,而不是直接惯性流畅的滑动过去。
解决方案
通过重写Behavior来实现,具体实现:
public class FixBehavior extends AppBarLayout.Behavior {
/**
* 是否处于惯性滑动状态
*/
private boolean isFlinging = false;
public FixBehavior() {}
public FixBehavior(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public void onStopNestedScroll(CoordinatorLayout coordinatorLayout, AppBarLayout abl, View target, int type) {
//如果不是惯性滑动,让他可以执行紧贴操作
if (!isFlinging) {
super.onStopNestedScroll(coordinatorLayout, abl, target, type);
}
}
@Override
public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target, int dx, int dy, int[] consumed, int type) {
super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed, type);
//type==1时处于非惯性滑动
if (type == 1) {
isFlinging = false;
}
}
@Override
public boolean onNestedFling(@NonNull CoordinatorLayout coordinatorLayout, @NonNull AppBarLayout child, @NonNull View target, float velocityX, float velocityY, boolean consumed) {
//惯性滑动的时候设置为true
isFlinging = true;
return super.onNestedFling(coordinatorLayout, child, target, velocityX, velocityY, consumed);
}
}
使用也很简单,在嵌套滑动布局中使用我们自定义的Behavior.
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#ffffff"
app:elevation="0dp"
app:layout_behavior="对应包名.FixBehavior">
希望可以解决您的问题
网友评论