赞
踩
在2016年的Google的I/O大会上,出来一个新的布局ConstraintLayout(约束性布局)。在Android Studio2.2版本后自动依赖使用ConstraintLayout布局。
ConstraintLayout的依赖
dependencies {
compile 'com.android.support.constraint:constraint-layout:1.0.0'
}
ConstraintLayout约束布局的含义
根据布局中的其他元素或视图,确定View在屏幕中的位置, 受到三类约束,即其他视图,父容器(parent), 基准线(Guideline)。
ConstraintLayout的优势
ConstraintLayout的相比RelativeLayout和LineatLayout具有更强的特性,可以减少布局之间的嵌套。
相对位置属性
相对位置属性:layout_constraint[自身控件位置]_[目标控件位置]="[目标控件ID]"
,如果id是父布局的id,可以使用parent。如:
eg:
<?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"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button1"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/btn_1"
android:layout_width="100dp"
android:layout_height="100dp"
android:text="Button2"
app:layout_constraintBottom_toTopOf="@id/btn" />
</android.support.constraint.ConstraintLayout>
效果图:
eg:
<?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"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button1"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/btn_1"
android:layout_width="100dp"
android:layout_height="100dp"
android:text="Button2"
app:layout_constraintBaseline_toBaselineOf="@id/btn" />
</android.support.constraint.ConstraintLayout>
效果图:
goneMargin属性
goneMargin属性是指目标控件GONE掉之后,自身控件可以设置个margin值。不过margin的方向需要和控件的相对位置的方向保持一致(下面的实例会说)。
eg:
<?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"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button1"
android:visibility="visible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/btn_1"
android:layout_width="100dp"
android:layout_height="100dp"
android:text="Button2"
app:layout_constraintBottom_toTopOf="@id/btn"
app:layout_goneMarginBottom="200dp" />
</android.support.constraint.ConstraintLayout>
效果图:
bias属性
bias属性是指在对齐父容器后,设置水平与竖直的比例。
eg:
<?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"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button1"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHorizontal_bias="0.2"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.2" />
</android.support.constraint.ConstraintLayout>
效果图:
eg:
<?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"
android:id="@+id/parent"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!--指定高度,宽度随着宽高比自适应 -->
<!--app:layout_constraintDimensionRatio="16:9" W: 默认,表示宽高比-->
<ImageView
android:id="@+id/image"
android:layout_width="0dp"
android:layout_height="100dp"
android:src="@color/colorPrimary"
app:layout_constraintDimensionRatio="16:9"
app:layout_constraintLeft_toLeftOf="parent" />
<!--指定高度,宽度随着宽高比自适应 -->
<!--app:layout_constraintDimensionRatio="H,16:9" H: 表示高宽比-->
<ImageView
android:layout_width="0dp"
android:layout_height="100dp"
android:src="@color/colorAccent"
app:layout_constraintDimensionRatio="H,16:9"
app:layout_constraintRight_toRightOf="parent" />
<!--指定宽度,按照宽度来计算高宽比 默认是宽高比 -->
<ImageView
android:layout_width="100dp"
android:layout_height="0dp"
android:layout_marginTop="20dp"
android:src="@color/colorPrimary"
app:layout_constraintDimensionRatio="16:9"
app:layout_constraintTop_toBottomOf="@id/image" />
<!--指定宽度,按照宽度来计算高宽比 W, 表示高宽比 -->
<ImageView
android:layout_width="100dp"
android:layout_height="0dp"
android:layout_marginTop="20dp"
android:src="@color/colorPrimary"
app:layout_constraintDimensionRatio="W,16:9"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/image" />
<!--android:layout_width="0dp" 0dp表示充满父控件或说是充满其余空间-->
<ImageView
android:layout_width="0dp"
android:layout_height="0dp"
android:src="@color/colorAccent"
app:layout_constraintBottom_toBottomOf="@id/parent"
app:layout_constraintDimensionRatio="2"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent" />
</android.support.constraint.ConstraintLayout>
效果图:
Guideline是一条隐形的线,这条线可作为准线,根据此准线设置其他控件的位置。
Guideline是一个View(android.support.constraint.Guideline),基准线的通过android:orientation设置方向。通过基准线来约束其他的view。
eg:
<?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"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.constraint.Guideline
android:id="@+id/guideline1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_begin="100dp" />
<android.support.constraint.Guideline
android:id="@+id/guideline2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.3" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button"
app:layout_constraintLeft_toLeftOf="@+id/guideline1"
app:layout_constraintTop_toTopOf="@id/guideline2" />
</android.support.constraint.ConstraintLayout>
效果图:
Chain Style是使多个控件像链条一样显示,这个更能可以类似LinearLayout的weight属性。
要想chain style生效,控件要相互引用,比如A的右边依赖B的左边,B的左边依赖A的右边,都是设置。 如:水平方向的Chain Style.
Chain Style的分为水平和竖直方向,每种都有3中模式:
如图:
eg:
<?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"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button1"
app:layout_constraintHorizontal_chainStyle="spread"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@id/btn2" />
<Button
android:id="@+id/btn2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button2"
app:layout_constraintLeft_toRightOf="@id/btn1"
app:layout_constraintRight_toLeftOf="@id/btn3" />
<Button
android:id="@+id/btn3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button3"
app:layout_constraintLeft_toRightOf="@id/btn2"
app:layout_constraintRight_toRightOf="parent" />
</android.support.constraint.ConstraintLayout>
效果图:
下面几个属性是 UI 编辑器所使用的,用了辅助拖拽布局的,在实际使用过程中,可以不用关心这些属性。
文章参考:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。