文章目录
- 布局介绍
- 开始使用
- androidx配置
- 有趣功能
- 效果展示
- 完整代码
- 参考博文
- 个人总结
布局介绍
ConstraintLayout约束布局的出现是为了简化布局嵌套,减少绘制时间,提高绘制效率,可以在api>9的Android机器上使用,更主要的是约束布局可以尽情地让你发挥拖拽的本领,在界面上添加约束,抛开繁琐的xml布局,当然它也可以用xml进行布局
开始使用
androidx配置
在Android Studio2.3以后,新建Project的时候默认布局就是约束布局,不过却是support库下的约束布局,这里我们可以切换成androidx库下的约束布局,切换方法如下:
1、配置一下gradle.properties
android.useAndroidX=true
android.enableJetifier=true
2、执行Refactor -> Migrate to AndroidX
重构>迁移到Androidx操作,然后会弹出一个菜单,默认勾选备份项目文件,如果不想备份,可以取消勾选,然后点击Migrate按钮即可开始迁移,之后可以去module下build.gradle中修改一下版本号,当然也可以不修改,修改只是为了用最新版本的库
有趣功能
1、相对定位
android:id="@+id/tv2"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintLeft_toRightOf="@+id/tv1"
第一行代码的意思是让tv2在父布局的左边,第二行代码的意思是让tv2在tv1的右边,并且tv1在tv2的左边
2、角度定位
android:id="@+id/tv6"
app:layout_constraintCircle="@id/tv5"
app:layout_constraintCircleAngle="70"
app:layout_constraintCircleRadius="100dp"
第一行代码的意思是tv6以tv5为圆心
第二行代码的意思是tv6以tv5为圆心的基础上偏移角度70度,竖直方向是零度,顺时针旋转
第三行代码的意思,tv6以tv5为圆心的基础上偏移角度70度,并且在距离圆心100dp的位置上,这样就能固定一个控件的位置
3、辅助工具
(1)GuideLines
就是用来精确的寻找居中位置,最好通过百分比来确定
添加完以后可以通过点击GuideLine最上方的三角来改变单位为百分比
(2)自动添加约束
a、AutoConnect:自动为某一个控件添加约束
b、Infer:自动为界面所有元素添加合适的约束
效果展示
完整代码
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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=".MainActivity">
<TextView
android:id="@+id/tv1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello1"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello2"
app:layout_constraintLeft_toRightOf="@+id/tv1"
app:layout_constraintTop_toTopOf="parent"
app:layout_goneMarginLeft="100dp" />
<TextView
android:id="@+id/tv3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello3"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tv1" />
<TextView
android:id="@+id/tv4"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:gravity="center_vertical"
android:text="12345"
app:layout_constraintEnd_toEndOf="@+id/tv5"
app:layout_constraintStart_toEndOf="@+id/tv5"
app:layout_constraintTop_toBottomOf="@+id/tv3" />
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="54321"
app:layout_constraintBaseline_toBaselineOf="@+id/tv4"
app:layout_constraintLeft_toRightOf="@+id/tv4"
app:layout_constraintTop_toBottomOf="@+id/tv3" />
<TextView
android:id="@+id/tv5"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:gravity="center_vertical"
android:text="tv5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tv4" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="38dp"
android:layout_marginLeft="38dp"
android:layout_marginTop="6dp"
android:text="tv12345"
app:layout_constraintCircle="@id/tv5"
app:layout_constraintCircleAngle="70"
app:layout_constraintCircleRadius="100dp"
app:layout_constraintStart_toStartOf="@+id/textView"
app:layout_constraintTop_toTopOf="@+id/textView" />
<TextView
android:id="@+id/tv6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:text="tv6"
app:layout_constraintHorizontal_bias="0.7"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tv5" />
<TextView
android:id="@+id/tv7"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="tv1111117"
app:layout_constraintDimensionRatio="w,3:1"
app:layout_constraintStart_toStartOf="@+id/tva"
app:layout_constraintTop_toBottomOf="@+id/tv6" />
<TextView
android:id="@+id/tva"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="tva"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintHorizontal_weight="4"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@+id/tva2"
app:layout_constraintTop_toBottomOf="@+id/tv7" />
<TextView
android:id="@+id/tva2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="tva2"
app:layout_constraintHorizontal_weight="1"
app:layout_constraintLeft_toRightOf="@+id/tva"
app:layout_constraintRight_toLeftOf="@+id/tva3"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tv7" />
<TextView
android:id="@+id/tva3"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="tva3"
app:layout_constraintHorizontal_weight="4"
app:layout_constraintLeft_toRightOf="@+id/tva2"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tv7" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="64dp"
android:text="Button"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/guideline2" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button"
app:layout_constraintBottom_toBottomOf="@+id/button"
app:layout_constraintStart_toStartOf="@+id/guideline2" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_begin="20dp" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.5" />
<Button
android:id="@+id/button6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button6"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
tools:layout_editor_absoluteY="401dp" />
<Button
android:id="@+id/button7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
tools:layout_editor_absoluteY="467dp" />
</androidx.constraintlayout.widget.ConstraintLayout>
参考博文
1、Android新特性介绍,ConstraintLayout完全解析 2、约束布局ConstraintLayout看这一篇就够了
个人总结
1、耦合性较高,改一发而动全身,特别是相对定位那一块
2、自主性较强,想放哪儿放哪儿