当前位置: 首页 > 科技观察

Android支持设计中的CoordinatorLayout和行为初探

时间:2023-03-12 11:04:04 科技观察

AndroidMPreview发布后,我们得到了一个新的支持库——AndroidDesignSupportLibrary,用于实现Google的MaterialDesign,提供一系列符合设计的控件标准。其中有很多控件,最复杂和功能最强大的是CoordinatorLayout,顾名思义,它是一个父视图,用于组织其子视图之间的协作。CoordinatorLayout默认可以理解为一个FrameLayout,其布局方式默认是逐层堆叠。那么,CoordinatorLayout的神奇之处就在于Behavior对象。查看CoordinatorLayout.Behavior对象的OverviewInteractionbehaviorpluginforchildviewsofCoordinatorLayout.Behavioriimplementsoneormoreinteractionsthatausercantakeonchildview。这些交互可能包括拖动、滑动、挥动或任何其他手势。可以看出,Behavior对象是用来和CoordinatorLayout的子view进行交互的。Behavior接口有很多方法,我们以AppBarLayout为例。AppBarLayout中有两个Behavior,一个是自己用的,一个是给它的兄弟节点用的。让我们关注AppBarLayout.ScrollingViewBehavior类。我们看一下这个类中的以下几个方法:0.dependencypublicbooleanlayoutDependsOn(CoordinatorLayoutparent,Viewchild,Viewdependency){returndependencyinstanceofAppBarLayout;}这个方法告诉CoordinatorLayout这个view依赖AppBarLayout,后续的父类可以通过这个方法找到所有依赖的兄弟这个子节点。1.measurepublicbooleanonMeasureChild(CoordinatorLayoutparent,Viewchild,intparentWidthMeasureSpec,intwidthUsed,intparentHeightMeasureSpec,intheightUsed)这是CoordinatorLayout在测量过程中使用Behavior对象测量子视图尺寸的方法。在这个方法中,我们可以通过parent.getDependencies(child);获取到child依赖的view;这个方法,然后通过获取child依赖的view的size来确定自己的size。2、layout方法publicbooleanonLayoutChild(CoordinatorLayoutparent,Viewchild,intlayoutDirection)用于子视图自己布局。如果依赖其他view,系统会先调用publicbooleanonDependentViewChanged(CoordinatorLayoutparent,Viewchild,Viewdependency)方法。你可以在这个回调中记录一些依赖的位置信息,在onLayoutChild中使用保存的信息进行计算,然后得到自己的具体位置。3.nestedscrollpublicbooleanonStartNestedScroll(CoordinatorLayoutcoordinatorLayout,AppBarLayoutchild,ViewdirectTargetChild,Viewtarget,intnestedScrollAxes)publicvoidonNestedPreScroll(CoordinatorLayoutcoordinatorLayout,AppBarLayoutchild,Viewtarget,intdx,intdy,int[]consumed)publicvoidonNestedScroll(CoordinatorLayoutcoordinatorLayout,AppBarLayoutchild,Viewtarget,intdxConsumed,intdyConsumed,intdxUnconsumed,intdyUnconsumed)publicvoidonStopNestedScroll(CoordinatorLayoutcoordinatorLayout,AppBarLayoutchild,Viewtarget)这些方法是不是特别眼熟?我在Android的嵌套滑动机制(NestedScrolling)中介绍过。这些方法恰好是NestedScrollingParent的方法,它是CoordinatorLayout的代理(Proxy),即CoordinatorLayout本身不处理这些消息,而是传递给子视图。行为,进行处理。利用这种方法,实现视图与视图之间的交互和视觉协调(布局、滑动)。综上所述,我们可以看到CoodinatorLayout已经为我们实现了一个可以由子视图代理实现的布局。这与传统的ViewGroup不同,子视图之间相互知道对方的存在,一个子视图的变化可以通知另一个子视图。CoordinatorLayout的作用是充当沟通桥梁,连接不同的视图。使用行为对象进行通信。我们的具体实现可以参考Android官方文档讲述的各个方法的功能进行改写,实现我们想要的各种复杂功能。https://developer.android.com/reference/android/support/design/widget/...有了这样一套机制,实现组件间的交互就更方便快捷了~