Android-ConstraintLayout(约束布局)-m
关于margin这部分,我们快速简单来实践下。重点还要去搞下Android注解反射的Demo....
官方文档列了一下一些属性:
If side margins are set, they will be applied to the corresponding constraints (if they exist) (Fig. 3), enforcing the margin as a space between the target and the source side. The usual layout margin attributes can be used to this effect:
- start、end在某些情况(应该是大部分情况)下和left, right差不多;从目前来看,官方建议使用start, end。你在AS界面编辑里面去拖动生成一些布局默认也是start,end(一会我们看下效果), so.....
android:layout_marginStart
android:layout_marginEnd
- 下面四个属性比较简单,都是以前经常用的,就不怎么说了
android:layout_marginLeft
android:layout_marginTop
android:layout_marginRight
android:layout_marginBottom
之前有一篇文章也说道了关于start,end与left,right类似。为什么又两套?从了解资料看一方面是兼容旧版,改进新版,慢慢的或许逐渐替代了也说不准。另外start用法更通用一些,除了和left同样效果,还有自己的一些东西。我们就说下这个start和end吧!
1.普通的start,end使用(效果和left,right一毛一样)
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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=".Main2Activity">
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:text="fuck button 1"
android:textSize="15sp"
app:layout_constraintLeft_toLeftOf="parent" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:background="#e23bca"
android:text="fuck button 2"
android:textSize="15sp"
app:layout_constraintLeft_toRightOf="@id/button1" />
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="20dp"
android:background="#0febca"
android:text="fuck button 3"
android:textSize="15sp"
app:layout_constraintRight_toRightOf="@id/button2" />
</android.support.constraint.ConstraintLayout>
image
2. start、end可能会怎么用呢?
先来了解**android:supportsRtl="true"和android:layoutDirection="rtl" **了一个是开启支持从右向左的布局特性,一个是设置布局方向,可以是"rtl"、"ltr","local", "inherit", 前两个倒是好懂,后两个就蒙圈了,也没具体用过。做了简单demo发现local和Inherit都是从左到右,具体的区别目前了解的知识还不能够彻底理解。 后面专门针对RTL布局做一个学习分析吧!!!
如果我们设置了AndroidMainifest.xml里面开启支持这种特性,然后设置从右向左的布局,那么第一个控件将会从右边开始,第二个控件就在第一个控件的左边,相当于做了左右反转:
<LinearLayout
app:layout_constraintBottom_toBottomOf="parent"
android:layout_width="match_parent"
android:orientation="horizontal"
android:layoutDirection="rtl"
android:layout_height="wrap_content">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="fuck button a"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="fuck button b"/>
</LinearLayout>
image
这个时候我们准备加上间距,你会怎么做了?有时候我们会这样做:
image注意:这个时候如果你想从左到右,不想从右到左,怎么办?修改下android:layoutDirection="rtl" -> android:layoutDirection="ltr"试试 :
image那么你肯定就去把button a的marginRight->marginLeft,也是可以的。这个时候我们不妨想想start,从字面意思理解就是从起点开始: 假使你的起点是从左开始,那我们就距离左边多远就行了嘛,同理从右边开始,那控件就距离右边控件多远就可以了塞!
来来来:
image想左就左,想右就右,不管怎样,算是找到了一种解释start好处的例子。至于别的专门的这种深入,后期专门去分析具体的点。
到这里我们就把margin简单过一下下,然后去继续注解反射部分(这段时间不是很忙,就同时两个方向去研究下吧,顺便可以换换思维方式);
(昨天的下一天)忘记了说下AS的Layout的Design里面怎么简单去设置布局,以及简单看下设置之后是怎样的效果:
首先打开Design界面可以看到控件列表栏,下面是容器树形结构
image1.我们随意拖动一个按钮过去,你点击下按钮,上下左右可以看到四个圆圈
image2.此时你先拖动右边圆圈到界面右侧,然后拖动底部圆圈到底部,此时底部和右侧便与界面产生了布局相对位置和间距的效果,不妨看下生成的布局代码:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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=".Main2Activity"
tools:layout_editor_absoluteY="81dp">
<Button
android:id="@+id/button"
android:layout_width="84dp"
android:layout_height="48dp"
android:layout_marginBottom="28dp"
android:layout_marginEnd="44dp"
android:text="Button"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</android.support.constraint.ConstraintLayout>
3.默认使用的就是约束布局,其中右侧间距采用的是end,而不是right,也验证了之前说的,就是google推荐使用的是start、end这样的方式(再补充一点,系统如果切换为阿拉伯语,Android会自动将某些布局以从右向左的方式渲染,具体是全部还是哪些?这个后面我觉得可以去尝试研究一下)。
This page End. 貌似Design做布局也蛮方便的,不过个人还是建议自己写代码,还便于加强记忆!