Android Support Design 中 CoordinatorLayout 与 Behaviors 初探

移动开发 Android
其中有众多的控件,其中最复杂,功能最强大的就是CoordinatorLayout,顾名思义,它是用来组织它的子views之间协作的一个父view。CoordinatorLayout默认情况下可理解是一个FrameLayout,它的布局方式默认是一层一层叠上去。

在Android M Preview发布后,我们获得了一个新的support library —— Android Design Support Library 用来实现Google的Material Design 提供了一系列符合设计标准的控件。

其中有众多的控件,其中最复杂,功能***大的就是CoordinatorLayout,顾名思义,它是用来组织它的子views之间协作的一个父view。CoordinatorLayout默认情况下可理解是一个FrameLayout,它的布局方式默认是一层一层叠上去。

那么,CoordinatorLayout的神奇之处就在于Behavior对象了。

看下CoordinatorLayout.Behavior对象的 Overview

  1. Interaction behavior plugin for child views of CoordinatorLayout. 
  2.  
  3.  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. 

可知Behavior对象是用来给CoordinatorLayout的子view们进行交互用的。

Behavior接口拥有很多个方法,我们拿AppBarLayout为例。AppBarLayout中有两个Behavior,一个是拿来给它自己用的,另一个是拿来给它的兄弟结点用的,我们重点关注下AppBarLayout.ScrollingViewBehavior这个类。

我们看下这个类中的以下方法

0. dependency

  1. public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) { 
  2. return dependency instanceof AppBarLayout; 

这个方法告诉CoordinatorLayout,这个view是依赖AppBarLayout的,后续父亲可以利用这个方法,查找到这个child所有依赖的兄弟结点。

1. measure

  1. public boolean onMeasureChild(CoordinatorLayout parent, View child, int parentWidthMeasureSpec, int widthUsed, int parentHeightMeasureSpec, int heightUsed) 

这个是CoordinatorLayout在进行measure的过程中,利用Behavior对象对子view进行大小测量的一个方法。

在这个方法内,我们可以通过parent.getDependencies(child);这个方法,获取到这个child依赖的view,然后通过获取这个child依赖的view的大小来决定自身的大小。

2. layout

  1. public boolean onLayoutChild(CoordinatorLayout parent, View child, int layoutDirection) 

这个方法是用来子view用来布局自身使用,如果依赖其他view,那么系统会首先调用

public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency)

这个方法,可以在这个回调中记录dependency的一些位置信息,在onLayoutChild中利用保存下来的信息进行计算,然后得到自身的具体位置。

3. nested scroll

  1.  public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child, View directTargetChild, View target, int nestedScrollAxes) 
  2.  
  3. public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target, int dx, int dy, int[] consumed) 
  4.  
  5. public void onNestedScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) 
  6.  
  7. public void onStopNestedScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target) 

这几个方法是不是特别熟悉?我在Android嵌套滑动机制(NestedScrolling) 介绍过,这几个方法刚好是NestedScrollingParent的方法,也就是对CoodinatorLayout进行的一个代理(Proxy),即CoordinatorLayout自己不对这些消息进行处理,而是传递给子view的Behavior,进行处理。利用这样的方法,实现了view和view之间的交互和视觉的协同(布局、滑动)。

总结

可以看到CoodinatorLayout给我们实现了一个可以被子view代理实现方法的一个布局。这和传统的ViewGroup不同,子view从此知道了彼此之间的存在,一个子view的变化可以通知到另一个子view。CoordinatorLayout所做的事情就是当成一个通信的桥梁,连接不同的view。使用Behavior对象进行通信。

我们具体的实现可以参照 Android官方文档告诉我们的每一个方法的作用 进行重写,实现自己想要的各种复杂的功能。

https://developer.android.com/reference/android/support/design/widget/...

有了这么一套机制,想实现组件之间的交互,就更加方便快捷啦~

责任编辑:chenqingxiang 来源: Gemini
相关推荐

2013-05-21 09:17:16

Android DesHolo Theme卡片式设计

2018-04-25 09:06:32

Chrome浏览器语言

2015-08-07 10:24:17

AndroidMaterialDes

2011-06-16 10:25:29

AndroidAIR

2012-07-09 10:22:28

Mono for An

2011-09-07 10:58:07

Android wid

2011-06-02 11:13:10

Android Activity

2023-10-24 19:37:34

协程Java

2011-05-26 16:28:08

Android jQuery

2013-11-14 16:03:23

Android设计Android Des

2009-11-05 15:50:25

WCF behavio

2017-11-07 12:53:28

Android支持库

2010-08-03 10:32:42

Android 3.0Android 3.0Android开发

2013-05-16 10:58:44

Android开发自动化测试

2020-04-22 13:23:46

智能合约区块链比特币

2022-04-19 09:24:18

QtC++框架

2017-02-14 13:35:15

AndroidMaterial De动画

2009-10-30 10:45:45

ScalaEclipseAndroid

2009-03-30 15:52:24

Windows Emb

2009-07-08 17:40:28

ScalaScala脚本
点赞
收藏

51CTO技术栈公众号