Constraintlayout进阶

357 阅读4分钟

使用约束布局

    <?xml version="1.0" encoding="utf-8"?>

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="schemas.android.com/apk/res/and…" xmlns:app="schemas.android.com/apk/res-aut…" xmlns:tools="schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity">

<!--    top-->
<TextView
    android:id="@+id/v1"
    android:layout_width="match_parent"
    android:layout_height="100dp"
    android:background="@color/colorAccent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintTop_toTopOf="parent"></TextView>

<TextView
    android:id="@+id/tv1"
    android:layout_width="0dp"
    android:layout_height="30dp"
    android:background="#CDCD00"
    android:gravity="center"
    android:text="图1"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintEnd_toStartOf="@id/tv2"
    app:layout_constraintTop_toBottomOf="@id/v1"></TextView>

<TextView
    android:id="@+id/tv2"
    android:layout_width="0dp"
    android:layout_height="30dp"
    android:background="#FF7F24"
    android:gravity="center"
    android:text="图2"
    app:layout_constraintStart_toEndOf="@id/tv1"
    app:layout_constraintEnd_toStartOf="@id/tv3"
    app:layout_constraintTop_toBottomOf="@id/v1"></TextView>

<TextView
    android:layout_width="0dp"
    android:layout_height="30dp"
    android:background="#AB82FF"
    android:gravity="center"
    android:text="图3"
    android:id="@+id/tv3"
    app:layout_constraintStart_toEndOf="@id/tv2"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintTop_toBottomOf="@id/v1">
</TextView>
</androidx.constraintlayout.widget.ConstraintLayout>

    <?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="80dp"
    android:layout_height="80dp"
    android:layout_marginLeft="30dp"
    android:layout_marginTop="30dp"
    android:background="#CDCD00"
    android:gravity="center"
    android:text="左边头像"
    app:layout_constraintEnd_toStartOf="@id/tv2"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"></TextView>

<TextView
    android:id="@+id/tv2"
    android:layout_width="60dp"
    android:layout_height="30dp"
    android:background="#FF7F24"
    android:gravity="center"
    android:text="编辑资料"
    android:layout_marginLeft="30dp"
    app:layout_constraintStart_toEndOf="@id/tv1"
    app:layout_constraintBottom_toBottomOf="@id/tv1"
    app:layout_constraintTop_toTopOf="@id/tv1"></TextView>


<TextView
    android:id="@+id/tv3"
    android:layout_width="60dp"
    android:layout_height="30dp"
    android:background="#00FF7F"
    android:gravity="center"
    android:text="+好友"
    android:layout_marginLeft="30dp"
    app:layout_constraintStart_toEndOf="@id/tv2"
    app:layout_constraintBottom_toBottomOf="@id/tv1"
    app:layout_constraintTop_toTopOf="@id/tv1"></TextView>

</androidx.constraintlayout.widget.ConstraintLayout>

    <?xml version="1.0" encoding="utf-8"?>

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="schemas.android.com/apk/res/and…" xmlns:app="schemas.android.com/apk/res-aut…" xmlns:tools="schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity">

<View
    android:id="@+id/tv1"
    android:layout_width="0dp"
    android:layout_height="200dp"
    android:background="#CDCD00"
    android:gravity="center"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"></View>

<TextView
    android:id="@+id/tv2"
    android:layout_width="160dp"
    android:layout_height="80dp"
    android:background="#FF7F24"
    android:gravity="center"
    android:text="一半在兄弟节点中"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintTop_toBottomOf="@id/tv1"
    app:layout_constraintBottom_toBottomOf="@id/tv1"></TextView>

</androidx.constraintlayout.widget.ConstraintLayout>

baseline 对齐 与 组件对齐

    <?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">

<!--    top-->
<TextView
    android:id="@+id/v1"
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:layout_marginTop="30dp"
    android:layout_marginLeft="30dp"
    android:gravity="center"
    android:text="哈哈哈哈"
    android:background="@color/colorAccent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintTop_toTopOf="parent"></TextView>



<TextView
    android:id="@+id/v2"
    android:layout_width="80dp"
    android:layout_height="50dp"
    android:layout_marginTop="30dp"
    android:layout_marginLeft="30dp"
    android:gravity="center"
    android:text="组件对齐"
    android:background="@color/colorAccent"
    app:layout_constraintLeft_toRightOf="@id/v1"
    app:layout_constraintBottom_toBottomOf="@id/v1"></TextView>

</androidx.constraintlayout.widget.ConstraintLayout>

只要增加一个属性

app:layout_constraintBaseline_toBaselineOf="@id/v1"

    <?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">



<View
    android:id="@+id/v1"
    android:visibility="gone"
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:layout_marginLeft="30dp"
    android:layout_marginTop="30dp"
    android:background="@color/colorPrimary"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintTop_toTopOf="parent"></View>

<View
    android:id="@+id/v2"
    app:layout_goneMarginLeft="130dp"
    android:layout_width="100dp"
    android:layout_height="100dp"
    app:layout_constraintLeft_toRightOf="@id/v1"
    app:layout_constraintTop_toTopOf="@id/v1"
    android:background="@color/colorAccent"></View>

</androidx.constraintlayout.widget.ConstraintLayout>

我们让蓝色图消失,但是蓝绿色的图 还保持原位

其实重要就是 app:layout_goneMarginLeft 这个属性在发挥作用

    <?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">

<View
    android:id="@+id/v1"
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:background="@color/colorPrimary"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintBottom_toTopOf="@id/v2"
    app:layout_constraintVertical_chainStyle="packed"

    ></View>

<View
    android:id="@+id/v2"
    android:layout_width="200dp"
    android:layout_height="200dp"
    android:layout_marginTop="30dp"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toBottomOf="@id/v1"
    app:layout_constraintBottom_toBottomOf="parent"
    android:background="@color/colorAccent"></View>


</androidx.constraintlayout.widget.ConstraintLayout>

    要注意 app:layout_constraintVertical_chainStyle 他的使用,一定要头尾相接.

宽高比view 有时 我们希望 给定一个宽度 和一个宽高比 来动态设置一个view的高度,或者高度固定 动态设置宽度。以往要实现还要自己写自定义view 或者代码中动态计算。

<View
    android:id="@+id/v1"
    android:layout_width="100dp"
    android:layout_height="0dp"
    app:layout_constraintDimensionRatio="2:5"
    android:background="@color/colorPrimary"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintVertical_chainStyle="packed"
    ></View>

注意 app:layout_constraintDimensionRatio 与android:layout_height="0dp" 要搭配使用
app:layout_constraintWidth_percent= 这个与之类似 是百分比布局的关键属性

利用不可见的辅助线 削减嵌套布局

    <?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">


<androidx.constraintlayout.widget.Guideline
    android:id="@+id/guideline"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    app:layout_constraintGuide_percent="0.3" />

<TextView
    android:id="@+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="80dp"
    android:text="用户名"
    android:gravity="right|center_vertical"
    app:layout_constraintEnd_toStartOf="@+id/guideline"
    tools:layout_editor_absoluteY="36dp" />

<TextView
    android:id="@+id/textView2"
    android:layout_width="63dp"
    android:layout_height="80dp"
    android:gravity="right|center_vertical"
    android:text="密码"
    tools:layout_editor_absoluteX="60dp"
    tools:layout_editor_absoluteY="158dp" />

<EditText
    android:id="@+id/editText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:ems="10"
    android:inputType="textPassword"
    app:layout_constraintBottom_toBottomOf="@+id/textView"
    app:layout_constraintTop_toTopOf="@+id/textView"
    app:layout_constraintVertical_bias="0.6"
    tools:layout_editor_absoluteX="123dp" />

<EditText
    android:id="@+id/editText2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:ems="10"
    android:inputType="textPassword"
    tools:layout_editor_absoluteX="123dp"
    tools:layout_editor_absoluteY="169dp" />
</androidx.constraintlayout.widget.ConstraintLayout>

    关键字就是androidx.constraintlayout.widget.Guideline

设置一组view 的可见性

    <androidx.constraintlayout.widget.Group android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:visibility="gone"
    app:constraint_referenced_ids="textView3,textView4,textView5"
    >

</androidx.constraintlayout.widget.Group>