如何仅在RecyclerView滚动时触发AppBarLayout上滑,触摸AppBarLayout不触发?
解决AppBarLayout触摸不触发滚动,仅RecyclerView滚动联动的问题
这个需求很常见,核心思路就是拦截AppBarLayout及其子区域的触摸事件,不让这些触摸操作触发AppBar的滚动行为,只保留RecyclerView滚动时的联动效果。下面给你两种可行的实现方案:
方案一:自定义AppBarLayout(推荐,无交互View场景)
如果你的AppBar里只有ImageView这类不需要用户交互的View,直接自定义AppBarLayout拦截所有触摸事件是最简单的方式:
- 创建自定义AppBarLayout类:
public class NonScrollableAppBarLayout extends AppBarLayout { public NonScrollableAppBarLayout(Context context) { super(context); } public NonScrollableAppBarLayout(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { // 拦截所有触摸事件,阻止AppBar处理滚动逻辑 return true; } @Override public boolean onTouchEvent(MotionEvent ev) { // 消费触摸事件,避免事件传递到父布局引发意外滚动 return true; } }
- 修改布局文件,替换原有的
AppBarLayout为自定义类:
<com.your.package.name.NonScrollableAppBarLayout android:id="@+id/appBarLayout" android:layout_width="match_parent" android:layout_height="wrap_content" android:overScrollMode="ifContentScrolls"> <android.support.design.widget.CollapsingToolbarLayout android:layout_width="match_parent" android:layout_height="wrap_content" app:layout_scrollFlags="scroll|exitUntilCollapsed"> <FrameLayout android:id="@+id/img_video_view" android:layout_width="match_parent" android:layout_height="wrap_content"> <ImageView android:id="@+id/cropper_view" android:layout_width="match_parent" android:layout_height="250dp" android:background="#ff282828" android:visibility="visible"/> </FrameLayout> </android.support.design.widget.CollapsingToolbarLayout> </com.your.package.name.NonScrollableAppBarLayout>
方案二:设置触摸监听器(适用于AppBar内有交互View场景)
如果你的AppBar里有按钮等需要交互的View,不能全部拦截事件,可以给AppBarLayout设置OnTouchListener,只拦截滚动相关的触摸操作:
AppBarLayout appBarLayout = findViewById(R.id.appBarLayout); appBarLayout.setOnTouchListener((v, event) -> { // 只拦截ACTION_MOVE事件,阻止滚动触发;其他事件(如点击)正常传递 return event.getAction() == MotionEvent.ACTION_MOVE; });
额外注意事项
确保你的RecyclerView已经正确设置了联动Behavior,也就是布局里的:
app:layout_behavior="@string/appbar_scrolling_view_behavior"
这个属性是RecyclerView和AppBarLayout联动的关键,你的原布局已经配置正确,不需要修改。
这样设置后,只有当用户触摸并滚动RecyclerView时,AppBarLayout才会向上滚动折叠;触摸AppBarLayout区域的任何操作都不会触发滚动,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Fahime Ghasemi
相关产品推荐
相关产品推荐

