返回
让你的AppBarLayout飞起来,体验顺滑的惯性滑动
Android
2023-09-30 19:41:54
自定义AppBarLayout
为了让AppBarLayout能够实现惯性滑动,我们需要自定义一个ScrollingViewBehavior。这是一个抽象类,它定义了嵌套滚动视图的行为。我们要做的就是重写其中的几个方法。
public class FlingAwareScrollingViewBehavior extends ScrollingViewBehavior {
private int flingVelocityY;
@Override
public void fling(CoordinatorLayout coordinatorLayout, NestedScrollView target, float velocityX, float velocityY, boolean consumed) {
flingVelocityY = (int) velocityY;
super.fling(coordinatorLayout, target, velocityX, velocityY, consumed);
}
@Override
public boolean onNestedFling(CoordinatorLayout coordinatorLayout, NestedScrollView child, View target, float velocityX, float velocityY, boolean consumed) {
if (flingVelocityY > 0) {
// 向上滑动,折叠AppBarLayout
AppBarLayout appBarLayout = (AppBarLayout) child.getParent();
appBarLayout.setExpanded(false, true);
return true;
} else {
// 向下滑动,展开AppBarLayout
AppBarLayout appBarLayout = (AppBarLayout) child.getParent();
appBarLayout.setExpanded(true, true);
return true;
}
}
}
在上面的代码中,我们重写了fling()方法,在其中捕捉Fling事件并记录fling的速度和距离。然后,我们在onNestedFling()方法中根据fling的速度和距离来实现惯性滑动。
使用自定义AppBarLayout
现在,我们可以将自定义的AppBarLayout添加到我们的布局文件中。
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary" />
<androidx.core.widget.NestedScrollView
android:id="@+id/nested_scroll_view"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?" />
</androidx.core.widget.NestedScrollView>
<androidx.appcompat.widget.AppBarLayout
android:id="@+id/app_bar_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_scrollFlags="scroll|enterAlways">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary" />
</androidx.appcompat.widget.AppBarLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
在上面的布局文件中,我们使用FlingAwareScrollingViewBehavior作为AppBarLayout的ScrollingBehavior。
app:layout_behavior="com.example.myapplication.FlingAwareScrollingViewBehavior"
这样,我们的AppBarLayout就可以实现惯性滑动效果了。
结论
通过自定义AppBarLayout的ScrollingViewBehavior,我们实现了AppBarLayout的惯性滑动效果。这使得我们的AppBarLayout在快速滑动时更加流畅,也更加符合用户的操作习惯。