聊聊Android嵌套滑动 最近工作中遇到了需求是使用 Bottom-Sheet 交互的弹窗,使用了 design 包里面的 CoordinatorLayout 和 BottomSheetBehavior...在嵌套滑动控件的场景中,可以在Android的事件分发机制本身做一些处理,外部拦截或者内部消化触摸事件。...如果是其他手势,滑动的时候拦截,不滑动的时候不拦截。如果滑动的时候不拦截的话,手势事件会交给子view去处理,如果子view是可以滚动的,这时候就会有冲突,所有滚动的时候事件要拦截下来交给自己处理。...接着分发嵌套滚动事件,中间还有一些针对 Scroll mode的处理,我们这里不关心: UP 的时候会根据距离判断是否需要消费快速滑动,如果不则会进行分发: 所以我们需要关注的就是: startNestedScroll...嵌套滚动方案的选择 有了这些接口之后,我们可以看到其实内置的Android 控件都支持了滑动嵌套,那么是否我们平时使用的方法都是正确的呢?
那么Android5.0也同时给出了相应的解决方案,即推出MaterialDesign库,通过该库中的AppBarLayout控件,对Toolbar加以包装,从而实现顶部工具栏的动态变化效果。..." /> android.support.design.widget.CoordinatorLayout> 嵌套滚动视图NestedScrollView 虽说通过AppBarLayout可实现Toolbar...下面是AppBarLayout结合NestedScrollView的布局文件代码例子: android.support.design.widget.CoordinatorLayout xmlns:android...> android.support.design.widget.CoordinatorLayout> 话说除了RecyclerView和NestedScrollView,还有哪些控件可以触发...这还得从CoordinatorLayout说起,查看CoordinatorLayout的源代码,发现它实现了接口NestedScrollingParent,奥秘就在其中,该接口定义了嵌套滚动的父辈行为,
/android.support.design.widget.CoordinatorLayout> 上述布局需要注意的是: 必须采用CoordinatorLayout作为外层包裹,至于原因是由于使用Behavior...app:layout_scrollFlags="scroll|exitUntilCollapsed" 表示CoordinatorLayout的依赖元素滚动的时候,进行折叠。...scroll - 想滚动就必须设置这个。...嵌套的listView滚动时无响应bug。...题外话3 23.2.0中在CoordinatorLayout中使用Toolbar ,toolbar无法与顶部对齐,即顶部存在垂直间距。
从官方文档中我们可以看到: CoordinatorLayout是一个增强型的FrameLayout。...滚动事件,那么在CoordinatorLayout布局里其它标记了app:layout_behavior的子View(LinearLayout、RecyclerView、NestedScrollView...滚动事件,那么当LinearLayout滚动时便可触发ToolBar中的layout_scrollFlags效果 即往上滑动隐藏ToolBar,下滑出现ToolBar,而不会隐藏TabLayout,因为...– (Tab的宽度平均分配),也实现了可滚动的选项卡 – (Tab宽度不固定,同时可以横向滚动),还实现了所有Tab居中显示。...并且给这些组件设置如下属性来告诉CoordinatorLayout,该组件是带有滑动行为的组件,然后CoordinatorLayout在接受到滑动时会通知AppBarLayout 中可滑动的Toolbar
nR\nS\nT\nU\nV\nW\nX\nY\nZ\nW\nX\nY\nZ" /> android.support.v4.widget.NestedScrollView> android.support.design.widget.CoordinatorLayout...snap: 代码中枚举SCROLL_FLAG_SNAP 在滚动结束后,如果view只是部分可见,它将滑动到最近的边界。...设置exitUntilCollapsed也就是为true的时候,任意向上的滚动都会让view(Toolbar)变为minHeight的高度可见,而不会全部消失 反之,不设置,也就是false,会全部消失...---- 中场小节 CoordinatorLayout中, 如果NestedScrollView要和Toolbar互动的话(CollapsingToolbarLayout等之后在了解,这里不涉及)...a5-2.gif 大体就这样了 代码见后面的地址 ---- 简单小节 CoordinatorLayout中,NestedScrollView和Toolbar联动 注意Toolbar外面要套AppBarLayout
在 Android 为实现 Material Design 提供的支持包 android support design 中,CoordinatorLayout 毫无疑问是最核心的,它通过子 View 对象配置的.../android.support.design.widget.CoordinatorLayout> 上面布局文件中,NestedScrollView 就是那个配套的滑动组件,它需要和 AppBarLayout...向上滑动的时候,Toolbar 先滑动,然后 NestedScrollView 中的内容再滑动。 向下滑动的时候,NestedScrollView 中的内容先滑动,然后 Toolbar 再一起滑动。...这里的主语是 AppBarLayout 中的内容,宾语是 CoordinatorLayout。 ?...> android.support.v4.widget.NestedScrollView> android.support.design.widget.CoordinatorLayout
:drawable/ic_dialog_email" /> android.support.design.widget.CoordinatorLayout> 这是上面布局引用的NestedScrollView...应该说在MD中,RecyclerView代替了ListView,而NestedScrollView代替了ScrollView,他们两个都可以用来跟ToolBar交互,实现上拉下滑中ToolBar的变化。...在NestedScrollView的名字中其实就可以看出他的作用了,Nested是嵌套的意思,而ToolBar基本需要嵌套使用。...> 响应滚动事件 首先,需要让Toolbar包裹在AppBarLayout中 android.support.design.widget.AppBarLayout android...在RecyclerView或者任意支持嵌套滚动的view比如NestedScrollView上添加app:layout_behavior。
其子View可以通过setScrollFlags()或在xml布局中通过app:layout_scrollFlags属性设置想要的滚动行为。...> android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/...> android.support.design.widget.CoordinatorLayout> 父布局是CoordinatorLayout,然后主要两个布局:AppBarLayout以及NestedScrollView...,NestedScrollView设置了layout_behavior属性,这样AppBarLayout里面的布局就可以跟着一起滚动,不过由于这里还没给AppBarLayout里面的scrollFlags...;不过需要注意的是,如果单独设置ImageView的为scroll,而不设置ToolBar,是没有效果的,因为ToolBar把ImageView给顶住了,只有下面的ScrollView会滚动。
最初想用 CoordinatorLayout 加 RecyclerView,但效果不好直接用,或者用 NestedScrollView 与 RecyclerView 组合使用。...但 NestedScrollView 与 RecyclerView 组合时怎么也不能使 RecyclerView 自己滑动,而 NestedScrollView 不滑动,事件拦截,禁止嵌套滑动,NestedScrollView...实现效果如下: 2019_05_19_16_07_00.gif 要让 CoordinatorLayout 一开始不滑动,然后可以滑动,再然后又不可以滑动,所以想自定义一个控件,重写 onNestedPreScroll...res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/coordinatorLayout...else { // 要吸顶的位置到了,让外面滚动,此时 appbarLayout.y 从 0 开始慢慢变小, // 变到 -barHeightDistance 时不再滑动
在没有ConstraintLayout的时候,要实现嵌套滚动布局,通常都是使用CoordinatorLayout来实现,但是这个东西的使用局限性比较大,能非常简单的实现的嵌套布局,就那么几种,如果要实现一些特别的滚动效果...在ConstraintLayout2.x中,有两种方式来实现嵌套滚动布局。...这种方案的布局结构如下: CoordinatorLayout --------AppBarLayout ----------------MotionLayout --------NestedScrollView...CoordinatorLayout,而仅使用MotionLayout来实现嵌套滚动效果,实现滚动布局的大一统。...这样一来,整个嵌套滚动的格局一下子就打开了,再也没了之前使用CoordinatorLayout的高度限制,效果限制,所有的内容,都可以通过约束来进行设置,再通过MotionLayout来进行动态约束,从而实现嵌套滚动布局
接着在AppBarLayout中再嵌套一个CollapsingToolbarLayout: android.support.design.widget.CoordinatorLayout xmlns..."> android.support.v4.widget.NestedScrollView> android.support.design.widget.CoordinatorLayout...> 我们知道ScrollView允许使用滚动的方式来查看屏幕以外的数据, 而NestedScrollView在此基础之上增加了嵌套响应滚动事件的功能。...由于CoordinatorLayout本身已经可以响应滚动事件了, 因此我们在它的内部就需要使用NestedScrollView或RecyclerView这样可以响应滚动事件的布局。...="wrap_content"> android.support.v4.widget.NestedScrollView> android.support.design.widget.CoordinatorLayout
在上一讲中我们讲了NestedScrolling机制,其实android很多有些常用的控件都是支持NestedScrolling机制的,如RecyclerView,NestedScrollView等,...> coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/...2 横向滚动1 * type 滑动类型touch 0手指按下 1手指松开 */ public boolean onStartNestedScroll(@NonNull CoordinatorLayout...target消耗的滚动时候触发,这个是水平滚动的实时距离 * dyUnconsumed view处于滚动状态,但是并不是由target消耗的滚动时候触发,这个是竖直滚动的实时距离 * type 同上 *...同上 * child 同上 * target 同上 * velocityX 水平加速度 * velocityY 竖直加速度 * consumed 同上 false不拦截 true则不会有惯性滑动,需要自己处理
译者:Feximin 总览 CoordinatorLayout 扩展了完成 Google's Material Design 中的多种滚动效果的能力。...在 RecyclerView 或其他类似 NestedScrollView 这样的可以嵌套滚动的 View 中加入 app:layout_behavior。...第一种是用 NestedScrollView,然后就简单地将内容嵌到里面。第二种是额外创建一个嵌入 CoordinatorLayout 中的 RecyclerView。...谨记 ScrollView 不能与 CoordinatorLayout 一起使用。你将需要像这个示例中展示的那样用 NestedScrollView 来代替。...将你的内容包含在 NestedScrollView 中,然后在其上添加 app:layout_behavior 就会使你的滚动行为预期工作。
为了使体现更好可以AppBarLayout下面放一个滚动条,不要用ScrollView而是NestedScrollView因为这里你是要联动的。...的总高度就会超过手机屏幕,形成滑动之后图片向上面展示的效果,其实加了NestedScrollView之后,即使里面什么东西都没有,你照样可以滚动,但是如果你用ScrollView就不行,它里面就必须要有东西才行...> android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/...> android.support.v4.widget.NestedScrollView android:layout_width="match_parent"....widget.NestedScrollView> android.support.design.widget.CoordinatorLayout> Github地址
直接的关系和使用 自定义Behavior的通用流程 了解 绑定的方式, 事件流 上一篇唯一的例子,是事件流中 CoordinatorLayout关联事件 而其中, 事件流中,嵌套滑动事件 中...---- 嵌套滑动事件 简单实例 注意: 这里是用 事件流中 嵌套滑动事件 去处理的 我们可以用NestedScrollView做事件发送,给外面的Parent发事件, 再传递给Behavior...具体只是2个方法有先后顺序而已 boolean onNestedFling 对应的滑动较快,也就是fling事件触发的时候调用 这里不能换成 onNestedPreFling,替换后,会有卡顿,暂时不纠结为什么...这里layout,也很简单 就CoordinatorLayout中,包含 2个 NestedScrollView , 一个Behavior activity_main4.xml android.support.v4.widget.NestedScrollView> android.support.design.widget.CoordinatorLayout
---- 概览 CoordinatorLayout实现了多种Material Design中提到的滚动效果。...在RecyclerView或者任意支持嵌套滚动的view比如NestedScrollView上添加app:layout_behavior。..."> 当CoordinatorLayout发现RecyclerView中定义了这个属性,它会搜索自己所包含的其他view,看看是否有view与这个behavior相关联。...CoordinatorLayout的工作原理是搜索定义了CoordinatorLayout Behavior 的子view,不管是通过在xml中使用app:layout_behavior标签还是通过在代码中对...当滚动发生的时候,CoordinatorLayout会尝试触发那些声明了依赖的子view。
一个问题NestedScrollView高度加上顶部AppBarLayout高度没超过屏幕高低滑动有问题(只能在AppBarLayout范围内才能滑动); android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/...parallax - 设置为这个模式时,在内容滚动时,CollapsingToolbarLayout中的View(比如ImageView)也可以同时滚动,实现视差滚动效果,通常和layout_collapseParallaxMultiplier....widget.NestedScrollView> android.support.design.widget.CoordinatorLayout> 里面的有个imageview,注释已经写的很清楚了...然后里面的NestedScrollView这货。 它和scrollview 基本上一样 但是它支持嵌套滚动 嵌套滚动默认是启用的。
最初的想法是自己去利用 Android 的嵌套滚动机制,去实现上面的嵌套滚动效果.但最后为了开发效率直接利用了 CollapsingToolbarLayout 和 CoordinatorLayout...="com.xf.mylab.activity.CollapsingToolbarLayoutTestActivity"> android.support.design.widget.CoordinatorLayout...> android.support.v4.widget.NestedScrollView android:id="@+id/subscription_show...夏洛克的猫" android:textSize="30sp" /> android.support.v4.widget.NestedScrollView...> android.support.design.widget.CoordinatorLayout> <LinearLayout android:layout_width
= 0; } onNestedPreScroll 这个方法是在准备滚动之前调用的,它带有滚动偏移量 dy。...滚动时,日历也向上滚动,最多到当前选中日期那一行,滚动范围和当前选中日期有关。...折叠过程中,要将偏移量消费掉,这就用到了 consumed 这个参数,它是一个长度为 2 的数组,存放的是要消费掉的 x 和 y 轴偏移量。..., View target, int dx, int dy, int[] consumed, int type) { // 列表未滑动到顶部时,不处理...> android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/
中,结合AppbarLayout, CollapsingToolbarLayout,Toolbar等可产生各种炫酷的效果。...( Android开发之CoordinatorLayout打造滑动越界弹性放大图片效果有解释 ) AppBarLayout必须是CoordinatorLayout的直接子View,不然他一点作用都发挥不出来...AppBarLayout下方与之并列的滑动控件有比如RecyclerView,NestedScrollView(与AppBarLayout同属于CoordinatorLayout的子View),这些并列的...作用View随着被依赖View状态的变化而变化,有点类似于观察模式中的观察者和被观察者。...内部的子View一般都要加上属性:app:layout_collapseMode="",常用值是parallax(视差滚动),pin(固定)。
领取专属 10元无门槛券
手把手带您无忧上云