Android 一步一步解析CoordinatorLayout.Behavior(上)


回复1024 随机给你一个惊喜

嗨,好久不见!中秋节远离魔都,回了趟老家,看看山,玩玩水,权当旅游了,今归来。不知大家中秋过得如何,是否此刻感受雷同:根本无心工作学习,只想尽快为祖亲庆生。。。


回归正题,本文继续介绍MD系列控件的学习,鉴于微信公众号文章长度有限,关于文中提到的Nested机制,将推送至下篇文章中介绍,欢迎伙伴儿积极留言交流哈。 

在MD系列的前几篇文章中,通过基础知识和实战案例配合讲解的形式介绍了CoordinatorLayoutAppBarLayoutToolbarCollapsingToolbarLayout的使用,并实现了几种MD风格下比较炫酷的交互效果。学会怎么用之后,我们再想想,为什么它们之间能够产生这样的交互行为呢?其实就是因为CoordinatorLayout.Behavior的存在,这也是本文所要讲述的内容。至此,Android Material Design系列的学习已进行到第八篇,大家可以点击以下链接查看之前的文章:

关于Behavior

官网对于CoordinatorLayout.Behavior的介绍已经将它的作用说明得很清楚了,就是用来协调CoordinatorLayout的Child Views之间的交互行为:

Interaction behavior plugin for child views of CoordinatorLayout.

A Behavior implements one or more interactions that a user can take on a child view. These interactions may include drags, swipes, flings, or any other gestures.

之前学习CoordinatorLayout的使用案例时,用的都是系统的特定控件,比如design包中的FloatingActionButtonAppBarLayout等,而不是普通的控件,如ImageButton之类的,就是因为design包中的这些特定控件已经被系统默认定义了继承自CoordinatorLayout.Behavior的各种Behavior,比如FloatingActionButton.Behavior
AppBarLayout.Behavior。而像系统的ToolBar控件就没有自己的Behavior,所以只能将其搁置到AppBarLayout容器里才能产生相应的交互效果。

看到这里就能清楚一点了,如果我们想实现控件之间任意的交互效果,完全可以通过自定义Behavior的方式达到。看到这里大家可能会有一个疑惑,就是CoordinatorLayout如何获取Child Views的Behavior的呢,为什么在布局中,有些滑动型控件定义了app:layout_behavior属性而系统类似FloatingActionButton的控件则不需要明确定义该属性呢?看完CoordinatorLayout.Behavior的构造函数就明白了。


CoordinatorLayout.Behavior有两个构造函数,注意看第二个带参数的构造函数的注释,里面提到,在这个构造函数中,Behavior会解析控件的特殊布局属性,也就是通过parseBehavior方法获取对应的Behavior,从而协调Child Views之间的交互行为,可以在CoordinatorLayout类中查看,具体源码如下:


parseBehavior方法告诉我们,给Child Views设置Behavior有两种方式:

  1. app:layout_behavior布局属性
    在布局中设置,值为自定义Behavior类的名字字符串(包含路径),类似在AndroidManifest.xml中定义四大组件的名字一样,有两种写法,包含包名的全路径和以”.”开头的省略项目包名的路径。

  2. @CoordinatorLayout.DefaultBehavior类注解
    在需要使用Behavior的控件源码定义中添加该注解,然后通过反射机制获取。这个方式就解决了我们前面产生的疑惑,系统的AppBarLayoutFloatingActionButton都采用了这种方式,所以无需在布局中重复设置。

看到这里,也告诉我们一点,在自定义Behavior时,一定要重写第二个带参数的构造函数,否则这个Behavior是不会起作用的。

根据CoordinatorLayout.Behavior提供的方法,这里将自定义Behavior分为两类来讲解,一种是dependent机制,一种是nested机制,对应着不同的使用场景。

dependent机制

这种机制描述的是两个Child Views之间的绑定依赖关系,对应需要实现的方法常见有两个:



具体含义在注释中已经很清楚了,layoutDependsOn()方法用于决定是否产生依赖行为,onDependentViewChanged()方法在依赖的控件发生大小或者位置变化时产生回调。dependent机制最常见的案例就是FloatingActionButtonSnackBar的交互行为,效果如下:


系统的FloatingActionButton已经默认定义了一个Behavior来协调交互,如果不用系统的FAB控件,比如改用GitHub上的一个库futuresimple/android-floating-action-button,再通过自定义一个Behavior,也能很简单的实现与SnackBar的协调效果:


很简单的一个自定义Behavior处理,然后再为对应的Child View设置该属性即可。由于这里我们用的是第三方库,采用远程依赖的形式引入的,无法修改源码,所以不方便使用注解的方式为其设置Behavior,所以在布局中为其设置,并且使用了省略包名的方式:


这样,采用dependent机制自定义Behavior,与使用系统FAB按钮一样,即可与SnackBar控件产生如上图所示的协调交互效果。

示例源码

我在GitHub上建立了一个Repository,用来存放整个Android Material Design系列控件的学习案例,会伴随着文章逐渐更新完善,欢迎大家补充交流,Star地址:

https://github.com/Mike-bel/MDStudySamples

 火热推荐 

程序员客栈——程序员的经纪人,主要以中小型互联网企业和团队为服务对象,通过高门槛筛选、签约BAT级开发者,根据企业具体的开发需求,24小时内精准对接,同时提供资金担保,100%资金安全,实现企业和程序员双边获利,体现优秀程序员的自身价值。目前程序员客栈拥有优秀程序员50,000多名,优秀企业方近1000多家,完成交易项目800多个,可能(这俩字很重要)是目前国内最大的中高端程序员共享工作平台。

(据说,视屏有妹纸!!!)


热门推文

Android 利用Gradle实现app的环境分离

Android Studio 使用Gradle引入第三方库文件的总结

TAB|每一个移动开发者都应该有一个自己做主的App

这「非常7+1」条小贴士,助你Coding水平再提一阶!

推荐|一张思维导图,告诉你Android新手如何快速入门


阅读原文 进入【程序员客栈】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值