ToB企服应用市场:ToB评测及商务社交产业平台

标题: 【Android】NestedScrollView的简单用法与滚动冲突、滑动冲突 [打印本页]

作者: 勿忘初心做自己    时间: 2024-9-16 19:44
标题: 【Android】NestedScrollView的简单用法与滚动冲突、滑动冲突
一、NestedScrollView

1. 什么是 NestedScrollView

NestedScrollView 是 Android 中一个用于处理垂直方向滚动的布局组件,它继续自 FrameLayout,同时支持嵌套滑动(Nested Scrolling)机制。相比于传统的 ScrollView,NestedScrollView 专为解决嵌套滚动冲突题目设计,能够与其他支持嵌套滑动的子视图(如 RecyclerView、ViewPager 等)协同工作。
2. 界说

NestedScrollView 是 Android Jetpack 中的组件,用于容纳能够垂直滚动的视图。当页面布局的内容超过屏幕高度时,可以通过滚动展示全部内容。同时,NestedScrollView 在滚动的过程中与子视图可以举行事件协作。
3. 与ScrollView的区别

NestedScrollView 和 ScrollView 的紧张区别在于它具备“嵌套滑动”(Nested Scrolling)功能。在 Android 中,嵌套滑动是一种滚动冲突处理机制,答应父视图和子视图协同工作,共同处理滑动事件。这种机制非常有用,特殊是当你在一个滚动视图中嵌套另一个滚动视图时,它能够有效避免滑动冲突。

4. 常见使用场景


5. 简单使用方法

下面是一个CoordinatorLayout中使用NestedScrollView并嵌套RecyclerView的简单用法:
  1. <androidx.coordinatorlayout.widget.CoordinatorLayout
  2.     android:layout_width="match_parent"
  3.     android:layout_height="match_parent"
  4.     xmlns:android="http://schemas.android.com/apk/res/android"
  5.     xmlns:app="http://schemas.android.com/apk/res-auto">
  6.     <androidx.core.widget.NestedScrollView
  7.         android:layout_width="match_parent"
  8.         android:layout_height="match_parent"
  9.         app:layout_behavior="@string/appbar_scrolling_view_behavior">
  10.         <LinearLayout
  11.             android:layout_width="match_parent"
  12.             android:layout_height="wrap_content"
  13.             android:orientation="vertical">
  14.             <androidx.recyclerview.widget.RecyclerView
  15.                 android:id="@+id/recyclerView"
  16.                 android:layout_width="match_parent"
  17.                 android:layout_height="wrap_content"
  18.                 android:nestedScrollingEnabled="false" />
  19.         </LinearLayout>
  20.     </androidx.core.widget.NestedScrollView>
  21. </androidx.coordinatorlayout.widget.CoordinatorLayout>
复制代码

二、滚动冲突和滑动冲突

1. 区别

滚动冲突(Scroll Conflict)
​ 滚动冲突发生在嵌套滚动视图中。比方,一个 ScrollView 内部嵌套了一个 RecyclerView,或者一个 ViewPager 内嵌了一个 ScrollView。当用户在一个滚动视图上滑动时,系统必要决定哪个视图应该接收滚动事件,从而可能导致滚动冲突。
滑动冲突(Touch Conflict)
​ 滑动冲突通常发生在多个视图或组件尝试处理相同的触摸事件时。比方,一个 ViewPager 和一个 RecyclerView 都可以响应滑动手势,这会导致滑动冲突。滑动冲突通常涉及触摸事件的处理,而不是滚动事件的嵌套。
2. 处理方式

处理滚动冲突

滚动冲突通常发生在嵌套的滚动视图中,比方在一个 ScrollView 中嵌套了一个 RecyclerView。以下是几种常见的解决方法:


处理滑动冲突

1. 外部拦截(onInterceptTouchEvent)


NestedScrollView 中的外部拦截
NestedScrollView 作为一个容器视图,通常会处理其内部的滚动事件。为了确保它能够精确处理滚动事件,可以重写 NestedScrollView 的 onInterceptTouchEvent 方法来拦截触摸事件,并决定是否让其处理:
  1. package com.example.nestedscrollviewtest;
  2. import android.content.Context;
  3. import android.util.AttributeSet;
  4. import android.view.MotionEvent;
  5. import androidx.core.widget.NestedScrollView;
  6. public class CustomNestedScrollView extends NestedScrollView {
  7.     public CustomNestedScrollView(Context context) {
  8.         super(context);
  9.     }
  10.     public CustomNestedScrollView(Context context, AttributeSet attrs) {
  11.         super(context, attrs);
  12.     }
  13.     public CustomNestedScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
  14.         super(context, attrs, defStyleAttr);
  15.     }
  16.     @Override
  17.     public boolean onInterceptTouchEvent(MotionEvent ev) {
  18.         // 根据需要判断是否拦截事件
  19.         // 例如,可以根据事件的类型或滚动方向来决定是否拦截
  20.         return super.onInterceptTouchEvent(ev);
  21.     }
  22. }
复制代码
2. 内部拦截(onTouchEvent)


RecyclerView 的 onTouchEvent 方法负责处理其自己的触摸事件。通常,你不必要对 RecyclerView 的 onTouchEvent 举行特殊处理,但要确保它正常工作。
  1. public class CustomRecyclerView extends RecyclerView {
  2.     public CustomRecyclerView(Context context) {
  3.         super(context);
  4.     }
  5.     public CustomRecyclerView(Context context, AttributeSet attrs) {
  6.         super(context, attrs);
  7.     }
  8.     public CustomRecyclerView(Context context, AttributeSet attrs, int defStyleAttr) {
  9.         super(context, attrs, defStyleAttr);
  10.     }
  11.     @Override
  12.     public boolean onTouchEvent(MotionEvent e) {
  13.         // 默认情况下,RecyclerView 处理自己的触摸事件
  14.         return super.onTouchEvent(e);
  15.     }
  16. }
复制代码
3.拦截机制

滚动冲突和拦截机制

当你处理滚动冲突时(比方ScrollView 中嵌套 RecyclerView),内部拦截和外部拦截的目标都是在父视图和子视图之间决定谁来处理滚动事件。在这种环境下,使用拦截机制是为了解决多个滚动视图对事件的夺取

滑动冲突和拦截机制

滑动冲突是由多个视图组件对触摸事件的竞争引发的,而不是滚动事件的嵌套。在滑动冲突的场景下,拦截机制也同样适用。比如在ViewPager和RecyclerView这类视图中,事件分发的冲突会涉及滑动方向和手势的识别。

以上就是本篇博客的所有内容

已经到底啦!!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4