皮皮网
皮皮网

【告白特效网页源码】【福利网站源码】【玩图集源码】nestedscrolling嵌套源码

来源:资金短线操盘源码 发表时间:2024-12-22 15:54:15

1.在CordinatorLayout中使用Webview
2.[Android]CoordinatorLayout 与 Behavior
3.NestedScrollView使用和理解

nestedscrolling嵌套源码

在CordinatorLayout中使用Webview

        为了实现webview向上滑动可以隐藏title栏,目前最简便的方法就是使用CordinatorLayout,要在CordinatorLayout中使用Webview,就必须使Webview实现NestedScrollingChild接口或者将WebView嵌套在实现了NestedScrollingChild接口的View(例如NestedScrollView,RecylerView)中。

        先贴一下布局文件

        此时webview的高度为当前页面全部内容的高度,由于硬件性能限制,图层绘制的高度有最大值,超过最大值会造成无法绘制图层异常,同时如果没有crash,也会因为滑动被NestedScrollView拦截无法判断内容是否滑到底部去加载更多;如果尝试在页面加载完成后重新绘制Webview的大小以避免上述异常,则会因为滑动操作被NestedScrollView拦截而网页内容无法滑动,因此,Google给出的建议是不要将Webview放在NestedScrollView中。

        参考: /issues/

        如果要在CordinatorLayout中使用Webview,Google推荐的方法是使用NestedScroll机制,从 Android 5.0 Lollipop 开始提供一套 API 来支持嵌入的滑动效果。同样在最新的 Support V4 包中也提供了前向的兼容。NestedScrolling提供了一套父 View 和子 View 滑动交互机制。要完成这样的交互,父 View 需要实现 NestedScrollingParent 接口,而子 View 需要实现 NestedScrollingChild 接口。

          接下来简单的介绍一下这两个类:

        由于CordinatorLayout是支持NestedScrollingParent的,所以一般情况下直接使用就可以了,只需要webview或自定义view等不支持NestedScrollingChild的view继承NestedScrollingChild并实现接口中的方法,如以下示例:

        在布局文件中,NestedWebView直接作为Cordinatorlayout的子控件并设置属性app:layout_behavior="@string/appbar_scrolling_view_behavior"就可以支持正常的嵌套滑动。

          其实NestedScrolling最核心的内容就是对滑动事件重新分配根据滑动位置将动作分发到对应的控件并由对应控件消费以达到嵌套滑动的连带效果。

        参考:

        1. /reference/android/support/v4/view/NestedScrollingParent.html

        2. /takahirom/webview-in-coordinatorlayout/tree/master/app/src/main/java/com/github/takahirom/webview_in_coodinator_layout

[Android]CoordinatorLayout 与 Behavior

       CoordinatorLayout是套源一种增强版的FrameLayout,主要应用于构建具有交互效果的套源布局。它的套源使用场景通常包括与AppBarLayout、CollapsingToolbarLayout和Toolbar的套源结合,为应用增添更多的套源动态与交互性。布局结构的套源告白特效网页源码示意图如下所示,显示了这些组件之间的套源关系。

       在CoordinatorLayout中,套源几个常用的套源属性和布局元素被提及,如app:layout_behavior、套源app:layout_anchor、套源app:layout_anchorGravity等。套源app:layout_behavior用于指定子视图的套源福利网站源码行为,而app:layout_anchor和app:layout_anchorGravity则用于指定锚点和布局重心。套源

       AppBarLayout通常作为CoordinatorLayout的套源直接子类使用,其子视图通过设置自身的scrollFlags来实现期望的滑动行为。如果将AppBarLayout放置在普通的ViewGroup中而非CoordinatorLayout中,其功能将不会生效。

       CollapsingToolbarLayout是玩图集源码一个实现了折叠功能的视图,用于包裹Toolbar,并作为AppBarLayout的子视图使用。它提供了折叠模式、内容遮罩等功能,为应用提供更具吸引力的界面体验。

       Behavior是片源码率用于协调CoordinatorLayout内子视图交互的关键概念。如果要对CoordinatorLayout内部的滑动视图进行特定交互操作,需要设置Behavior。默认情况下,CoordinatorLayout内部的滑动视图已提供了相应的Behavior,如设置为app:layout_behavior="@string/appbar_scrolling_view_behavior"。

       Behavior的查询类源码方法分为几类:布局相关、事件处理、滑动事件、以及依赖于特定View的方法。了解这些方法在自定义Behavior时至关重要。

       CoordinatorLayout与Behavior的关系在源码层面体现为,CoordinatorLayout在处理测量、布局、触摸事件时会调用Behavior的相关方法。这使得Behavior能够影响子视图的行为,实现更复杂且定制化的交互效果。

       CoordinatorLayout实现了NestedScrollingParent2接口,支持嵌套滑动。在处理嵌套滑动时,CoordinatorLayout会将滑动事件分发至相应的Behavior方法,如onStartNestedScroll、onInterceptTouchEvent等,从而实现层次化的滑动处理。

       在处理AppBarLayout的滑动时,可以自定义AppBarStateChangeListener来监听其状态变化,例如展开、折叠和闲置状态,并相应地调整布局。

       值得注意的是,正确使用CoordinatorLayout与Behavior需要深入理解其工作原理和方法,以充分利用它们提供的功能和特性,从而实现更丰富、更流畅的用户界面和交互体验。

NestedScrollView使用和理解

        NestedScrollView 即 支持嵌套滑动的 ScrollView 。

        因此,我们可以简单的把 NestedScrollView 类比为 ScrollView ,其作用就是作为控件父布局,从而具备(嵌套)滑动功能。

        NestedScrollView 与 ScrollView 的区别就在于 NestedScrollView 支持 嵌套滑动 ,无论是作为父控件还是子控件,嵌套滑动都支持,且默认开启。

        因此,在一些需要支持嵌套滑动的情景中,比如一个 ScrollView 内部包裹一个 RecyclerView ,那么就会产生滑动冲突,这个问题就需要你自己去解决。而如果使用 NestedScrollView 包裹 RecyclerView ,嵌套滑动天然支持,你无需做什么就可以实现前面想要实现的功能了。

        举个例子:

        我们通常为 RecyclerView 增加一个 Header 和 Footer 的方法是通过定义不同的 viewType来区分的,而如果使用 NestedScrollView ,我们完全可以把 RecyclerView 当成一个单独的控件,然后在其上面增加一个控件作为 Header,在其下面增加一个控件作为 Footer。

        具体布局如下所示:

        注:NestedScrollView 与 ScrollView 一样,内部只能容纳一个子控件。

        效果如下所示:

        ps:虽然 NestedScrollView 内嵌 RecyclerView 和其他控件可以实现 Header 和 Footer,但还是不推荐上面这种做法(建议还是直接使用 RecyclerView 自己添加 Header 和 Footer),因为虽然 NestedScrollView 支持嵌套滑动,但是在实际应用中,嵌套滑动可能会带来其他的一些奇奇怪怪的副作用,Google 也推荐我们能不使用嵌套滑动就尽量不要使用。

        如果想知道 NestedScrollView 嵌套其他控件可能带来的问题,可以查看: NestedScrollView、RecycleView、ViewPager 等布局方面的常见问题汇总,及解决

        我们知道,Android 的事件分发机制中,只要有一个控件消费了事件,其他控件就没办法再接收到这个事件了。因此,当有嵌套滑动场景时,我们都需要自己手动解决事件冲突。而在 Android 5.0 Lollipop 之后,Google 官方通过 嵌套滑动机制解决了传统 Android 事件分发无法共享事件这个问题。

        嵌套滑动机制的基本原理可以认为是事件共享,即当子控件接收到滑动事件,准备要滑动时,会先通知父控件( startNestedScroll );然后在滑动之前,会先询问父控件是否要滑动( dispatchNestedPreScroll );如果父控件响应该事件进行了滑动,那么就会通知子控件它具体消耗了多少滑动距离;然后交由子控件处理剩余的滑动距离;最后子控件滑动结束后,如果滑动距离还有剩余,就会再问一下父控件是否需要在继续滑动剩下的距离( dispatchNestedScroll )...

        上面其实就是 嵌套滑动机制的工作原理,那么如果想让我们自定义的 View 或者 ViewGroup 实现嵌套滑动功能,应该怎样做呢?

        其实,在 Android 5.0 之后,系统自带的 View 和 ViewGroup 都增加了 嵌套滑动机制相关的方法了(但是默认不会被调用,因此默认不具备嵌套滑动功能),所以如果在 Android 5.0 及之后的平台上,自定义 View 只要覆写相应的 嵌套滑动机制相关方法即可;但是为了提供低版本兼容性,Google 官方还提供了两个接口,分别作为 嵌套滑动机制父控件接口和子控件接口:

        前面我们说过 NestedScrollView 无论是作为父控件还是子控件都支持嵌套滑动,就是因为它同时实现了 NestedScrollingParent 和 NestedScrollingChild 。文档如下所示:

        查看详细分析:/p/fabca

相关栏目:焦点