若是你已经很时髦的用上了AppBar
,TabLayout
,FloatActionButton
,以及Snackbar
的话,我想你多多少少确定知道CoordinatorLayout
这个东西。 它的神秘感来自于在布局文件 (xml) 和代码调用上彻底看不出和其余组件任何的耦合,却能作出一些神奇酷炫的交互效果。git
对,没错,今天咱们就着重讲一下CoordinatorLayout
是如何工做的,或者说,是如何让别的组件亲密无间的“合做”起来的(以及,顺便会打下一点点的广告)。github
顾名思义,CoordinatorLayout
专一于把它的子View链接起来,使他们之间相互很好的配合。数组
那么既然是合做,CoordinatorLayout
的职责充当了一个第三方的角色,通知各个子View之间状态的变换,的确,它也只干了这么一件事,很是纯洁&纯粹。布局
那么既然有通知,必定须要媒介,总不能把子View所有改形成适合如今这种模式的模样吧?这样也太不OO了,这里的介质就是Behavior
,Behavior
是CoordinatorLayout
用来和各个子View
通讯用的代理类。spa
注意箭头的走向,CoordinatorLayout
是经过Behavior
去控制子视图,也就表明Behavior
的数据传导基本上是单向的。当CoordinatorLayout
须要进行measure
,layout
的时候,都会经过behavior
询问子视图,是否须要进行相应的操做,若是不须要,就进行默认的行为,咱们来看下onLayoutChild
和onMeasureChild
两个再熟悉不过的行为。代理
能够看@return
的说明,若是Behavior
处理了相关的操做,那么就会覆盖CoordinatorLayout
默认的行为(其实它的默认行为和FrameLayout简直如出一辙)code
这一节简单的说了CoordinatorLayout
如何经过Behavior
来控制子View的布局相关的行为,接下来咱们看看重点的交互
部分。xml
CoordinatorLayout
的功能固然不只仅是经过Behavior
来控制子视图的布局,控制触摸的流程才是大头。对象
首先咱们知道,控制触摸事件,通常有2个:接口
onInterceptTouchEvent.
onTouchEvent
这里不解释他们之间的区别,咱们看到在Behavior
中也有这么两个方法。
若是你的View所拥有的Behavior
处理了相关的事件,那么接下去发到CoordinatorLayout
上的触摸事件就会像正常流程同样发到这个Behavior
中。
咱们终于能够实如今不子类化
View
的状况下,重写它的触摸事件啦。
这才是重点中的重点啊!!
首先,咱们来睁大眼睛看!
好,能够看见CoordinatorLayout
是实现了NestedScrollingParent
接口的,也就是说,要用到这个特性的话,默认不实现NestedScrollingChild
接口 (pre Lollipop) 且不调用dispatchNestedScroll
相关接口的View
靠一边去! 【ListView
哭晕在厕所】
CoordinatorLayout
正是从NestedScrollingParent
相关的接口中,获取到嵌套滚动相关的参数,再经过Behavior
传到各个子View
中,包含Behavior
的View
这时候才成为真正处理嵌套滚动的对象,消费掉一些滚动参数后,再把消费掉的数值传回到发生触摸事件的View
中,达到交互的目的。
consumed
这个数组能够在View0
中获取到,表示的意思是它的NestedScrollParent
消费了多少的滑动量,意味着它能使用的滑动量要减去数组里的值。
这样产生滑动的View
就经过CoordinatorLayout
和 其余的View
的Behavior
产生了交互,咱们能够在Behavior
中给View
生成一些位置的偏移量,达到视图上移动的效果。
布局依赖,这也是个很重要的东西,好比FAB
的位置须要在Snackbar
上边,须要依赖它来操做。
主要有2个接口(用的比较少的暂时忽略):
layoutDependsOn
onLayoutDependencyChanged
第二个接口一般在onPreDraw
或者onNestedScroll
系列的回调中 最后进行调用,注意:它并非在onLayout
过程当中回调的
第一个很显然是告诉CoordinatorLayout
,一个View是否依赖于另外一个View。
第二个是CoordinatorLayout
发现存在依赖的时候,把被依赖方
回调给依赖方
,由于这时候,layout
已经完成,咱们能够获取被依赖方
的全部布局信息,根据布局信息,使用offset
来决定依赖方的一些位置;同时在这个时候,你也能够调用requestLayout
进行从新布局。
好了, Guang Gao Time:
SegmentFault for Android 新版在奋力开发中,带着对
Material Design
的执着,强势归来!