韩国网站域名分类,幻灯片模板,手机版网页开发,沛县网站制作一、NestedScrollView
1. 什么是 NestedScrollView
NestedScrollView 是 Android 中一个用于处理垂直方向滚动的布局组件#xff0c;它继承自 FrameLayout#xff0c;同时支持嵌套滑动#xff08;Nested Scrolling#xff09;机制。相比于传统的 ScrollView#xff0c;N…一、NestedScrollView
1. 什么是 NestedScrollView
NestedScrollView 是 Android 中一个用于处理垂直方向滚动的布局组件它继承自 FrameLayout同时支持嵌套滑动Nested Scrolling机制。相比于传统的 ScrollViewNestedScrollView 专为解决嵌套滚动冲突问题设计能够与其他支持嵌套滑动的子视图如 RecyclerView、ViewPager 等协同工作。
2. 定义
NestedScrollView 是 Android Jetpack 中的组件用于容纳能够垂直滚动的视图。当页面布局的内容超过屏幕高度时可以通过滚动展示全部内容。同时NestedScrollView 在滚动的过程中与子视图可以进行事件协作。
3. 与ScrollView的区别
NestedScrollView 和 ScrollView 的主要区别在于它具备“嵌套滑动”Nested Scrolling功能。在 Android 中嵌套滑动是一种滚动冲突处理机制允许父视图和子视图协同工作共同处理滑动事件。这种机制非常有用特别是当你在一个滚动视图中嵌套另一个滚动视图时它能够有效避免滑动冲突。
ScrollView不支持嵌套滑动通常会出现父子滑动视图的事件冲突导致滑动体验不佳。NestedScrollView内置嵌套滑动机制能够更好地处理父子视图的滚动事件使页面更加流畅。
4. 常见使用场景
表单页面在一个页面中可能会有许多输入框、按钮等当这些内容超过屏幕时使用 NestedScrollView 可以让整个页面可滚动。嵌套滚动视图当你在一个滚动视图如 RecyclerView中嵌套了另一个滚动视图如 ViewPager 或 HorizontalScrollView时NestedScrollView 能避免滑动事件冲突。与 CoordinatorLayout 结合NestedScrollView 可以与 CoordinatorLayout 搭配使用处理如 CollapsingToolbarLayout、AppBarLayout 等复杂的滚动联动效果。
5. 简单使用方法
下面是一个CoordinatorLayout中使用NestedScrollView并嵌套RecyclerView的简单用法
androidx.coordinatorlayout.widget.CoordinatorLayout android:layout_widthmatch_parentandroid:layout_heightmatch_parentxmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoandroidx.core.widget.NestedScrollViewandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentapp:layout_behaviorstring/appbar_scrolling_view_behaviorLinearLayoutandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:orientationverticalandroidx.recyclerview.widget.RecyclerViewandroid:idid/recyclerViewandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:nestedScrollingEnabledfalse //LinearLayout/androidx.core.widget.NestedScrollView/androidx.coordinatorlayout.widget.CoordinatorLayoutCoordinatorLayout 是整个布局的容器用于协调多个滚动视图的交互尽管当前只涉及了 NestedScrollView。NestedScrollView 管理页面的垂直滚动并能够与其他支持嵌套滚动的视图配合使用。它容纳了 RecyclerView 并负责控制滚动。RecyclerView 展示的是具体的滚动内容使用 android:nestedScrollingEnabledfalse 让 NestedScrollView 完全负责滚动处理避免滚动冲突。
二、滚动冲突和滑动冲突
1. 区别
滚动冲突Scroll Conflict
滚动冲突发生在嵌套滚动视图中。例如一个 ScrollView 内部嵌套了一个 RecyclerView或者一个 ViewPager 内嵌了一个 ScrollView。当用户在一个滚动视图上滑动时系统需要决定哪个视图应该接收滚动事件从而可能导致滚动冲突。
滑动冲突Touch Conflict
滑动冲突通常发生在多个视图或组件尝试处理相同的触摸事件时。例如一个 ViewPager 和一个 RecyclerView 都可以响应滑动手势这会导致滑动冲突。滑动冲突通常涉及触摸事件的处理而不是滚动事件的嵌套。
2. 处理方式
处理滚动冲突
滚动冲突通常发生在嵌套的滚动视图中例如在一个 ScrollView 中嵌套了一个 RecyclerView。以下是几种常见的解决方法
禁用子视图的嵌套滚动 描述禁用子视图的嵌套滚动功能让父视图完全控制滚动行为。 示例 androidx.recyclerview.widget.RecyclerViewandroid:idid/recyclerViewandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:nestedScrollingEnabledfalse /自定义 Behavior 描述创建自定义的 Behavior 类控制滚动行为和滚动事件的传递。 示例 package com.example.nestedscrollviewtest;import android.content.Context;
import android.util.AttributeSet;
import android.view.View;import androidx.annotation.NonNull;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import androidx.core.view.ViewCompat;
import androidx.core.widget.NestedScrollView;public class CustomBehavior extends CoordinatorLayout.BehaviorNestedScrollView {public CustomBehavior() {super();}public CustomBehavior(Context context, AttributeSet attrs) {super(context, attrs);}Overridepublic boolean onStartNestedScroll(NonNull CoordinatorLayout coordinatorLayout, NonNull NestedScrollView child, NonNull View directTargetChild, NonNull View target, int axes, int type) {// 控制是否响应嵌套滑动return axes ViewCompat.SCROLL_AXIS_VERTICAL;}Overridepublic void onNestedPreScroll(NonNull CoordinatorLayout coordinatorLayout, NonNull NestedScrollView child, NonNull View target, int dx, int dy, NonNull int[] consumed, int type) {// 处理嵌套滑动前的事件}
} androidx.coordinatorlayout.widget.CoordinatorLayoutandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentxmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoandroidx.core.widget.NestedScrollViewandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentapp:layout_behaviorcom.example.nestedscrollviewtest.CustomBehaviorLinearLayoutandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:orientationverticalandroidx.recyclerview.widget.RecyclerViewandroid:idid/recyclerViewandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:nestedScrollingEnabledfalse //LinearLayout/androidx.core.widget.NestedScrollView/androidx.coordinatorlayout.widget.CoordinatorLayout
处理滑动冲突
1. 外部拦截onInterceptTouchEvent
作用用于拦截触摸事件决定是否由当前视图处理该事件。如何工作在父视图的 onInterceptTouchEvent 方法中父视图会决定是否拦截事件并交给自己处理。如果返回 true父视图将处理事件如果返回 false事件将传递给子视图处理。
NestedScrollView 中的外部拦截
NestedScrollView 作为一个容器视图通常会处理其内部的滚动事件。为了确保它能够正确处理滚动事件可以重写 NestedScrollView 的 onInterceptTouchEvent 方法来拦截触摸事件并决定是否让其处理
package com.example.nestedscrollviewtest;import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;import androidx.core.widget.NestedScrollView;public class CustomNestedScrollView extends NestedScrollView {public CustomNestedScrollView(Context context) {super(context);}public CustomNestedScrollView(Context context, AttributeSet attrs) {super(context, attrs);}public CustomNestedScrollView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {// 根据需要判断是否拦截事件// 例如可以根据事件的类型或滚动方向来决定是否拦截return super.onInterceptTouchEvent(ev);}
}2. 内部拦截onTouchEvent
作用用于处理视图接收到的触摸事件。如何工作在子视图的 onTouchEvent 方法中子视图会处理传递给它的事件。如果子视图无法处理事件它可以将事件传递给父视图或其他视图。
RecyclerView 的 onTouchEvent 方法负责处理其自己的触摸事件。通常你不需要对 RecyclerView 的 onTouchEvent 进行特别处理但要确保它正常工作。
public class CustomRecyclerView extends RecyclerView {public CustomRecyclerView(Context context) {super(context);}public CustomRecyclerView(Context context, AttributeSet attrs) {super(context, attrs);}public CustomRecyclerView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}Overridepublic boolean onTouchEvent(MotionEvent e) {// 默认情况下RecyclerView 处理自己的触摸事件return super.onTouchEvent(e);}
}
3.拦截机制
滚动冲突和拦截机制
当你处理滚动冲突时例如ScrollView 中嵌套 RecyclerView内部拦截和外部拦截的目的都是在父视图和子视图之间决定谁来处理滚动事件。在这种情况下使用拦截机制是为了解决多个滚动视图对事件的争夺。
内部拦截法子视图决定是否处理事件。 适用于子视图滚动逻辑复杂的情况通常用于滚动冲突。 外部拦截法父视图决定是否处理事件。 适用于父视图需要优先处理事件的情况常用于解决滚动冲突。
滑动冲突和拦截机制
滑动冲突是由多个视图组件对触摸事件的竞争引发的而不是滚动事件的嵌套。在滑动冲突的场景下拦截机制也同样适用。比如在ViewPager和RecyclerView这类视图中事件分发的冲突会涉及滑动方向和手势的识别。
内部拦截法子视图根据触摸事件的方向和类型决定是否继续处理触摸事件或传递给父视图。 适用于需要子视图有更多自定义处理的滑动场景。 外部拦截法父视图判断当前手势是否属于自己的处理范围例如 ViewPager 判断是水平滑动则拦截事件。 常用于父视图需要根据手势类型做判断的滑动冲突场景。
以上就是本篇博客的所有内容 已经到底啦