专栏首页非著名程序员CoordinatorLayout的使用如此简单

CoordinatorLayout的使用如此简单

曾在网上找了一些关于CoordinatorLayout的教程,大部分文章都是把CoordinatorLayout、AppbarLayout、CollapsingToolbarLayout 以及Toolbar等一起使用来介绍,这让我不知不觉在心中认为把这几个布局要一起使用,而且只是用于那种场景中。其实CoordinatorLayout的功能并不是局限于与AppBarLayout一起使用,它的功能强大着呢,本文主要对CoordinatorLayout的使用进行介绍,后面再写一篇文章将AppBarLayout和CollapsingToolBarLayout整合CoordinatorLayout一起。那么到底CoordinatorLayout有多好用,请往下感受吧~

CoordinatorLayout能做什么 在学习CoordinatorLayout之前,很有必要了解CoordinatorLayout能帮我们做什么,从名字上可以看出,就是帮我们协调子View的。怎么个协调法呢?就是它根据我们的定制,帮助我们协调各个子View的布局。我们先看一组动画图~

CoordinatorLayout演示

CoordinatorLayout演示截图

稍微解释一下这个动画,蓝色的矩形是我们一个普通View,黄色的Hello是一个Button。我们水平拖动蓝色矩形时,黄色Button沿着与蓝色矩形相反方向移动;竖直移动蓝色矩形时,黄色也跟着竖直。简而言之:它们在竖直方向同步移动,在水平方向相反。 这个效果如果让你不用CoordinatorLayout去实现,应该没有任何问题,但是代码的耦合度应该非常大,你的代码必须要持有2个View的引用,然后在onTouchEvent里面做各种判断。如果我们想要实现的功能是,有更多的View要根据蓝色的View的移动相应作出响应,那么那就得在蓝色View的onTounchEvent里面针对其他的View处理各种逻辑。这耦合度未免太伤感了~ 而CoordinatorLayout既然号称能帮我们协调子View的布局,我们接下来看看CoordinatorLayout如何实现~

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的两个方法:

有了上面的概念后,我们看看具体怎么去实现吧~ 为了响应跟随手指移动的操作,我们定义一个非常简单的View,这个View只响应跟随手指移动,将这个View作为Dependency。由于过于简单,这个View源码不粘贴,我们只需知道这个View的类名叫:TempView。 我们看看Behavior的使用:

OK,现在我们为Button类指定了Dependency,并且定义好了跟随Dependency一直变化的动作(Behavior),接下来我们就要指定好为哪个具体的Button实例来绑定这些。方法很简单,直接在布局文件指定就好:

是不是很简单呢?我们只需关注Behavior的编写就好了,把Child和Dependency之间的关系完全解耦了~ 附上源码地址:http://download.csdn.net/detail/huachao1001/9537636

作者简介:huachao1001,武汉大学计算机学院硕士,他的CSDN博客和简书里的技术文章都非常有深度,非常好,欢迎大家去浏览学习。

简书地址:http://www.jianshu.com/users/0a7e42698e4b/latest_articles

CSDN博客地址:http://blog.csdn.net/huachao1001

写在最后,本来今天是打算推送Android Material Design系列第六篇来,但是偶然看到这篇文章,写的实在太好了,而且跟第六篇有关系,所以先让大家看这篇,熟悉一下CoordinatorLayout,对下篇的推送有帮助。

本文分享自微信公众号 - 非著名程序员(non-famous-coder),作者:huachao1001

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-07-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 自封装Android软键盘工具类ImeUtil

    在我们的开发过程中,键盘的显示和隐藏是经常遇到的,因为在该显示的时候显示,该隐藏的时候隐藏是非常人性化的表现,不用用户再次的点击触发。为此,我专门写了一个工具类...

    非著名程序员
  • Android主题换肤 无缝切换

    ? 投稿作者:_SOLID/简书 原文链接: http://www.jianshu.com/p/740c64ba15ac 今天再给大家带来一篇干货。 An...

    非著名程序员
  • 教你步步为营掌握自定义ViewGroup

    本篇是《教你步步为营掌握自定义View》一文的姊妹篇。自定义ViewGroup的文章很多,但都有一个缺点,没有回应用户关切,比如我在读那些文章时,就很想知道,自...

    非著名程序员
  • 斯诺登再爆料:美国重点监控中国

    大数据文摘
  • 4.2 期权估值

    标准差越高,股票涨跌的离差(dispersion)就越高,因此在二叉树里评估each time period股票的价格时,就可以捕获波动率。

    rocket
  • ECCV 2020 的对抗相关论文(对抗生成、对抗攻击)

    本文汇总了ECCV 2020上部分对抗相关论文,后续公众号会随缘对一些paper做解读。感兴趣的同学,可先自行根据标题,搜索对应链接(有些paper可能未公布)...

    公众号机器学习与生成对抗网络
  • 《Drools7.0.0.Final规则引擎教程》番外实例篇——默认条件的陷阱

    场景 今天向大家介绍一个典型的具有陷阱的场景,虽然不常用,但是如果错误使用的话也会导致莫名其妙的问题。当我们向session中插入多个对象,如果这多个对象匹配到...

    用户1161110
  • 快速学习FreeMarker-FreeMarker简介

    FreeMarker 是一款模板引擎:一种基于模板的、用来生成输出文本(任何来自于 HTML格式的文本用来自动生成源代码)的通用工具。它是为 Java 程序员提...

    cwl_java
  • Kotlin初级(4)- - - 字符串和字符.md

    Hankkin
  • NSA在两个RSA加密产品中植入了后门

    根据路透社的独家报道,NSA 在安全行业领导企业RSA的两个加密产品都植入了随机数生成器后门,而不只是此前斯诺登爆料的一个。 2013年12月路透社曾...

    静一

扫码关注云+社区

领取腾讯云代金券