1、首先导入依赖
compile 'com.android.support:design:22.2.1'
2、CoordinatorLayout能做什么
在学习CoordinatorLayout
之前,很有必要了解CoordinatorLayout
能帮我们做什么,从名字上可以看出,就是帮我们协调子View
的。
怎么个协调法呢?就是它根据我们的定制,帮助我们协调各个子View
的布局。
3、CoordinatorLayout的使用
CoordinatorLayout
的使用核心是Behavior
,Behavior
就是执行你定制的动作。在讲Behavior
之前必须先理解两个概念:Child
和Dependency
,什么意思呢?Child
当然是子View
的意思了,是谁的子View
呢,当然是CoordinatorLayout
的子View
;其实Child
是指要执行动作的CoordinatorLayout
的子View
。
而Dependency
是指Child
依赖的View
。比如上面的gif图中,蓝色的View
就是Dependency
,黄色的View
就是Child
,因为黄色的View的动作是依赖于蓝色的View
。简而言之,就是如过Dependency
这个View发生了变化,那么Child
这个View
就要相应发生变化。发生变化是具体发生什么变化呢?
这里就要引入Behavior
,Child
发生变化的具体执行的代码都是放在Behavior
这个类里面。
怎么使用Behavior
呢,首先,我们定义一个类,继承CoordinatorLayout.Behavior<T>
,其中,泛型参数T是我们要执行动作的View
类,也就是Child
。然后就是去实现Behavior
的两个方法:
<code class="language-java hljs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-javadoc" style="color: rgb(136, 0, 0); box-sizing: border-box;">/**
* 判断child的布局是否依赖dependency
*/</span>
<span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@Override</span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">boolean</span> <span class="hljs-title" style="box-sizing: border-box;">layoutDependsOn</span>(CoordinatorLayout parent, T child, View dependency) {
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">boolean</span> rs;
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//根据逻辑判断rs的取值</span>
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//返回false表示child不依赖dependency,ture表示依赖</span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> rs;
}
<span class="hljs-javadoc" style="color: rgb(136, 0, 0); box-sizing: border-box;">/**
* 当dependency发生改变时(位置、宽高等),执行这个函数
* 返回true表示child的位置或者是宽高要发生改变,否则就返回false
*/</span>
<span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@Override</span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">boolean</span> <span class="hljs-title" style="box-sizing: border-box;">onDependentViewChanged</span>(CoordinatorLayout parent, T child, View dependency) {
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//child要执行的具体动作</span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">true</span>;
}</code>