阅读 96

vectornator中文教程,layout怎么出图

我的简单的书同时发表了。 CoordinatorLayout的使用方法这么简单

我在网上找过关于CoordinatorLayout的教程,大多数文章都是关于CoordinatorLayout、AppbarLayout、CollapsingToolbarLayout、Toolbar 我本以为这些布局应该一起使用,其实CoordinatorLayout的功能不限于和AppBarLayout一起使用,其功能很强大。 本文主要介绍CoordinatorLayout的使用,在后来撰写AppBarLayout与CollapsingToolBarLayout集成的文章中,请感受一下CoordinatorLayout到底有多好用

CoordinatorLayout能做什么在学习CoordinatorLayout之前,我们需要知道CoordinatorLayout能为我们做什么。 从名字就可以看出,它可以帮助您调整子View。 什么样的协调法? 那就是根据我们的定制,帮助我们调整各个子View的布局。 首先来看看一套动画吧~

稍微解释一下这个视频,蓝色的长方形是我们的普通View,黄色的Hello是Button。 我们水平拖动蓝色矩形时,黄色的Button正在向与蓝色矩形相反的方向移动; 垂直移动蓝色矩形时,黄色也会垂直。 简单来说,在垂直方向上同步移动,在水平方向上相反。

如果不用CoordinatorLayout实现这个效果应该没有问题,但是代码的结合度应该非常大。 代码有两个View的引用,必须在onTouchEvent中做出各种各样的判断。 为了实现根据蓝色View的运动而响应的View增加的功能,必须在蓝色View的onTounchEvent中对其他View处理各种逻辑。 这个结合度太悲伤了~

据说CoordinatorLayout可以调整子View的布局,接下来我们来看看CoordinatorLayout是如何实现的~

coordinatorlayoutcoordinatorlayout的使用核心是Behavior,Behavior是执行你定制的行为。 在说Behavior之前必须理解两个概念。 Child和Dependency,是什么意思? Child当然是子View的意思。 是谁的孩子View? 当然是CoordinatorLayout的孩子View。 实际上,Child是执行操作的CoordinatorLayout的子级View。 Dependency是Child所依赖的视图。 例如,在上面的gif图中,蓝色的View是Dependency,黄色的View是Child。 因为黄色View的动作依赖于蓝色View。 简单来说,就像名为Dependency的View发生了变化一样,名为Child的View必须发生变化。 发生变化具体会发生什么变化呢? 在这里导入Behavior。 Child发生变化的具体执行的代码都在名为Behavior的类中。

如何使用Behavior,首先是定义继承CoordinatorLayout.BehaviorT的类。 其中,通用参数t是执行操作的View类,即Child。 还有实现Behavior的两种方法:

/**child的布局为dependency */@ overridepublicbooleanlayoutdependson (coordinatorlayoutparent,T child, View dependency ) )进行判断//通过逻辑判断rs的可取值,如果返回false,则表示child不依赖于dependency,ture表示依赖于return rs; (/* *如果dependency发生更改(位置、宽度等),则执行此函数)并返回true,表示child的位置或宽度高度将发生更改。 否则,false */@ overridepublicbooleanondependentviewchanged (coordinatorlayoutparent,T child,View dependency )//child

定义一个非常简单的View来响应跟随手指移动的操作。 此View仅响应手指的移动,并将此View作为Dependency。 由于太简单了,所以无法粘贴此View源代码。 此View的类名为TempView。

让我们看看Behavior的使用:

package com.HC.studycoordinatorlayout; import android.content.Context; import Android.support.design.widget.coordinator layout; import Android.util.attributes et; import android.util.Display

Metrics;import android.view.View;import android.widget.Button;/** * Package com.hc.studyCoordinatorLayout * Created by HuaChao on 2016/6/1. */public class MyBehavior extends CoordinatorLayout.Behavior<Button> { private int width; public MyBehavior(Context context, AttributeSet attrs) { super(context, attrs); DisplayMetrics display = context.getResources().getDisplayMetrics(); width = display.widthPixels; } @Override public boolean layoutDependsOn(CoordinatorLayout parent, Button child, View dependency) { //如果dependency是TempView的实例,说明它就是我们所需要的Dependency return dependency instanceof TempView; } //每次dependency位置发生变化,都会执行onDependentViewChanged方法 @Override public boolean onDependentViewChanged(CoordinatorLayout parent, Button btn, View dependency) { //根据dependency的位置,设置Button的位置 int top = dependency.getTop(); int left = dependency.getLeft(); int x = width - left - btn.getWidth(); int y = top; setPosition(btn, x, y); return true; } private void setPosition(View v, int x, int y) { CoordinatorLayout.MarginLayoutParams layoutParams = (CoordinatorLayout.MarginLayoutParams) v.getLayoutParams(); layoutParams.leftMargin = x; layoutParams.topMargin = y; v.setLayoutParams(layoutParams); }}

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

<?xml version="1.0" encoding="utf-8"?><android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.hc.studyCoordinatorLayout.MainActivity"> <Button android:id="@+id/btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="300dp" android:layout_marginTop="300dp" android:background="#FFCC00" android:text="Hello" app:layout_behavior="com.hc.studyCoordinatorLayout.MyBehavior" /> <com.hc.studyCoordinatorLayout.TempView android:layout_width="100dp" android:layout_height="100dp" android:layout_marginLeft="300dp" android:layout_marginTop="300dp" android:background="#3366CC" /></android.support.design.widget.CoordinatorLayout>

是不是很简单呢?我们只需关注Behavior的编写就好了,把Child和Dependency之间的关系完全解耦了~

附上源码地址:http://download.csdn.net/detail/huachao1001/9537636


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐