虽然Behavior的机制已经出现很久了,但是以前就只是听过,所以这几天趁有空闲时间稍微进行一下了解。
在正文之前,需要着重声明的一点就是:
开始,是通过这一篇文章进行基本的了解CoordinatorLayout高级用法-自定义Behavior 对Behavior有了一个基本的使用了解。
之后又稍微进一步了解,我是基于这一篇文章(深入理解CoordinatorLayout.Behavior 涉及了相关的Android源码)进行的(同时也参考了该篇文章学习CoordinatorLayout你需要知道的那些事),里面提及的一般内容我就不再赘述了,而是在写下一些关于学习该篇博客之后的见解与想法。
1、首先是在实现“某个view监听另一个view的状态变化”的过程中,使用到了自定义属性(个人揣测该属性应该自定义为auchor_id的,因为不存在aucher的单词写法,原谅我强迫症犯了):
app:aucher_id
<declare-styleable name="MyCustomStyle">
<attr name="anchor_id" format="integer|reference"/>
</declare-styleable>
之所以用到这一属性,是为了在layoutDependsOn(CoordinatorLayout parent, View child, View dependency)
方法中实现对目标View的依赖。在本次的代码实例中,是为了实现底部的LinearLayoutLin布局对于AppBarLayout的依赖。
<LinearLayout
......
app:anchor_id="@id/appbar"
app:layout_behavior="com.example.zero.behaviortest.MyCustomBehavior">
......
</LinearLayout>
可以看到在LinearLayout布局中使用了app:anchor_id
属性,并设置为AppBarLayout的id,之后在自定义的MyCustomBehavior中获取该属性的值,然后就可以在layoutDependsOn(CoordinatorLayout parent, View child, View dependency)
中进行比较判定。
当然,正如那篇文章中提到的,
如果直接return dependency instanceof AppBarLayout
,就不需要再如上述情况使用aucher_id
了。
还有一点需要注意的是,在实现底部导航栏的滑动隐藏时,直接依赖于AppBarLayout的,而AppBarLayout又是依赖于NestedScrollView的,但AppBarLayout的隐藏是已经实现封装好了的
所以不要再另外去像上面一样实现了(只需要在Toolbar中设置app:layout_scrollFlags属性),而底部导航栏的隐藏就只能自己去实现了。因此,有些人不要疑惑,为什么AppBarLayout会自动隐藏了,而LinearLayout布局又需要如此去实现隐藏。
2、有关某个view监听CoordinatorLayout内NestedScrollingChild的接口实现类的滑动状态
这一部分的讲解,说得白话一点,举个例子如果想要监听某一个CoordinatorLayout的直接子View的滚动状态,从而实现AppBarLayout的隐藏或显示的话,则该View需要实现NestedScrollingChild接口,否则,是无法正常实现的,就如滑动一个WebView时,是无法正常实现前面所说的情形的,因此可以嵌套一个NestedScrollView。