当前位置:   article > 正文

Android 约束布局(ConstraintLayout)学习笔记_constraintlayout 控件居中

constraintlayout 控件居中

        ConstraintLayout 是 Android Studio 2.2 中主要的新增功能之一,也是Google在去年的I/O大会上重点宣传的一个功能。ConstraintLayout 非常适合使用可视化的方式来编写界面,但并不太适合使用 XML 的方式来进行编写。另外,ConstraintLayout还有一个优点,它可以有效地解决布局嵌套过多的问题,它有点类似于 RelativeLayout,但远 比RelativeLayout 要更强大。

1、常用相对位置约束

  1. <!-- 各个边的相对关系 -->
  2. layout_constraintLeft_toLeftOf
  3. layout_constraintLeft_toRightOf
  4. layout_constraintRight_toLeftOf
  5. layout_constraintRight_toRightOf
  6. layout_constraintTop_toTopOf
  7. layout_constraintTop_toBottomOf
  8. layout_constraintBottom_toTopOf
  9. layout_constraintBottom_toBottomOf
  10. <!-- 基线(控件高度不同,基线对齐) -->
  11. layout_constraintBaseline_toBaselineOf
  12. <!-- RTL Layout兼容(可以不考虑) -->
  13. layout_constraintStart_toEndOf
  14. layout_constraintStart_toStartOf
  15. layout_constraintEnd_toStartOf
  16. layout_constraintEnd_toEndOf

简单示例:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent">
  6. <TextView
  7. android:id="@+id/TextView1"
  8. android:layout_width="wrap_content"
  9. android:layout_height="50dp"
  10. android:gravity="center"
  11. app:layout_constraintLeft_toLeftOf="parent"
  12. app:layout_constraintTop_toTopOf="parent"
  13. android:background="@color/colorAccent"
  14. android:text="TextView1" />
  15. <TextView
  16. android:id="@+id/TextView2"
  17. android:layout_width="wrap_content"
  18. android:layout_height="wrap_content"
  19. app:layout_constraintTop_toTopOf="parent"
  20. app:layout_constraintLeft_toRightOf="@+id/TextView1"
  21. app:layout_constraintBaseline_toBaselineOf="@+id/TextView1"
  22. android:background="@color/colorPrimary"
  23. android:text="TextView2"/>
  24. <TextView
  25. android:id="@+id/TextView3"
  26. android:layout_width="wrap_content"
  27. android:layout_height="wrap_content"
  28. app:layout_constraintLeft_toLeftOf="parent"
  29. app:layout_constraintTop_toBottomOf="@+id/TextView1"
  30. android:background="@color/colorPrimaryDark"
  31. android:text="TextView3"/>
  32. </androidx.constraintlayout.widget.ConstraintLayout>

运行效果:

        注意:约束布局中必须要约束控件位置,即左和右,上和下要至少有一侧进行约束。

2、控件居中(同时约束左和右,上和下)

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent">
  6. <TextView
  7. android:id="@+id/TextView1"
  8. android:layout_width="wrap_content"
  9. android:layout_height="50dp"
  10. android:gravity="center"
  11. app:layout_constraintLeft_toLeftOf="parent"
  12. app:layout_constraintRight_toRightOf="parent"
  13. app:layout_constraintBottom_toBottomOf="parent"
  14. app:layout_constraintTop_toTopOf="parent"
  15. android:background="@color/colorAccent"
  16. android:text="TextView1" />
  17. </androidx.constraintlayout.widget.ConstraintLayout>

运行效果:

3、角度定位

  1. <!-- 相对控件 -->
  2. app:layout_constraintCircle="@+id/textView"
  3. <!-- 角度 -->
  4. app:layout_constraintCircleAngle="120"
  5. <!-- 距离 -->
  6. app:layout_constraintCircleRadius="150dp"
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent">
  6. <TextView
  7. android:id="@+id/TextView1"
  8. android:layout_width="wrap_content"
  9. android:layout_height="50dp"
  10. android:gravity="center"
  11. app:layout_constraintLeft_toLeftOf="parent"
  12. app:layout_constraintRight_toRightOf="parent"
  13. app:layout_constraintBottom_toBottomOf="parent"
  14. app:layout_constraintTop_toTopOf="parent"
  15. android:background="@color/colorAccent"
  16. android:text="TextView1" />
  17. <TextView
  18. android:id="@+id/TextView2"
  19. android:layout_width="wrap_content"
  20. android:layout_height="wrap_content"
  21. app:layout_constraintTop_toTopOf="parent"
  22. app:layout_constraintLeft_toLeftOf="parent"
  23. app:layout_constraintCircle="@+id/TextView1"
  24. app:layout_constraintCircleAngle="120"
  25. app:layout_constraintCircleRadius="150dp"
  26. android:background="@color/colorPrimary"
  27. android:text="TextView2"/>
  28. </androidx.constraintlayout.widget.ConstraintLayout>

运行效果:

 4、边距

  1. android:layout_marginStart
  2. android:layout_marginEnd
  3. android:layout_marginLeft
  4. android:layout_marginTop
  5. android:layout_marginRight
  6. android:layout_marginBottom

很熟悉,这里不介绍了

goneMargin:用于约束的控件可见性被设置为gone时候使用的margin值

  1. layout_goneMarginStart
  2. layout_goneMarginEnd
  3. layout_goneMarginLeft
  4. layout_goneMarginTop
  5. layout_goneMarginRight
  6. layout_goneMarginBottom
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent">
  6. <TextView
  7. android:id="@+id/TextView1"
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content"
  10. app:layout_constraintLeft_toLeftOf="parent"
  11. app:layout_constraintTop_toTopOf="parent"
  12. android:background="@color/colorAccent"
  13. android:text="TextView1" />
  14. <TextView
  15. android:id="@+id/TextView2"
  16. android:layout_width="wrap_content"
  17. android:layout_height="wrap_content"
  18. app:layout_constraintTop_toTopOf="parent"
  19. app:layout_constraintLeft_toRightOf="@+id/TextView1"
  20. app:layout_goneMarginLeft="10dp"
  21. android:background="@color/colorPrimary"
  22. android:text="TextView2"/>
  23. </androidx.constraintlayout.widget.ConstraintLayout>

运行效果:正常情况和隐藏TextView1

 

5、偏移

        实现控件居中偏移其实利用边距就能实现,但ConstraintLayout还提供了比例偏移的属性:

  1. <!-- 水平偏移 -->
  2. layout_constraintHorizontal_bias
  3. <!-- 垂直偏移 -->
  4. layout_constraintVertical_bias
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent">
  6. <TextView
  7. android:id="@+id/TextView1"
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content"
  10. app:layout_constraintLeft_toLeftOf="parent"
  11. app:layout_constraintRight_toRightOf="parent"
  12. app:layout_constraintTop_toTopOf="parent"
  13. app:layout_constraintHorizontal_bias="0.3"
  14. android:background="@color/colorAccent"
  15. android:text="TextView1" />
  16. </androidx.constraintlayout.widget.ConstraintLayout>

运行效果:

 6、尺寸约束

(1)指定尺寸xxdp

(2)wrap_content:控件自己计算大小,此时可以使用下面属性控制最大最小宽高

  1. <!-- 最小的宽度 -->
  2. android:minWidth
  3. <!-- 最小的高度 -->
  4. android:minHeight
  5. <!-- 最大的宽度 -->
  6. android:maxWidth
  7. <!-- 最大的高度 -->
  8. android:maxHeight

(3)使用 0dp (MATCH_CONSTRAINT)

        官方不推荐在ConstraintLayout中使用match_parent,可以设置 0dp 配合约束代替match_parent

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent">
  6. <TextView
  7. android:id="@+id/TextView1"
  8. android:layout_width="0dp"
  9. android:layout_height="wrap_content"
  10. app:layout_constraintLeft_toLeftOf="parent"
  11. app:layout_constraintRight_toRightOf="parent"
  12. app:layout_constraintTop_toTopOf="parent"
  13. android:background="@color/colorAccent"
  14. android:text="TextView1" />
  15. </androidx.constraintlayout.widget.ConstraintLayout>

运行效果:

(4)宽高比

        当宽或高至少有一个尺寸被设置为0dp时,可以通过属性layout_constraintDimensionRatio设置宽高比

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent">
  6. <TextView
  7. android:id="@+id/TextView1"
  8. android:layout_width="0dp"
  9. android:layout_height="wrap_content"
  10. app:layout_constraintLeft_toLeftOf="parent"
  11. app:layout_constraintTop_toTopOf="parent"
  12. app:layout_constraintDimensionRatio="1:1"
  13. android:background="@color/colorAccent"
  14. android:text="TextView1" />
  15. </androidx.constraintlayout.widget.ConstraintLayout>

运行效果:

7、约束链

        第一个控件为链头可以使用layout_constraintHorizontal_chainStyle设置约束链模式:

CHAIN_SPREAD —— 展开元素 (默认);
CHAIN_SPREAD_INSIDE —— 展开元素,但链的两端贴近parent;
CHAIN_PACKED —— 链的元素将被打包在一起。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent">
  6. <TextView
  7. android:id="@+id/TextView1"
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content"
  10. app:layout_constraintLeft_toLeftOf="parent"
  11. app:layout_constraintRight_toLeftOf="@+id/TextView2"
  12. app:layout_constraintTop_toTopOf="parent"
  13. android:background="@color/colorAccent"
  14. android:text="TextView1" />
  15. <TextView
  16. android:id="@+id/TextView2"
  17. android:layout_width="wrap_content"
  18. android:layout_height="wrap_content"
  19. app:layout_constraintTop_toTopOf="parent"
  20. app:layout_constraintLeft_toRightOf="@+id/TextView1"
  21. app:layout_constraintRight_toLeftOf="@+id/TextView3"
  22. android:background="@color/colorPrimary"
  23. android:text="TextView2"/>
  24. <TextView
  25. android:id="@+id/TextView3"
  26. android:layout_width="wrap_content"
  27. android:layout_height="wrap_content"
  28. app:layout_constraintLeft_toRightOf="@+id/TextView2"
  29. app:layout_constraintRight_toRightOf="parent"
  30. app:layout_constraintTop_toTopOf="parent"
  31. android:background="@color/colorPrimaryDark"
  32. android:text="TextView3"/>
  33. </androidx.constraintlayout.widget.ConstraintLayout>

运行效果(三种模式):

         同时,还可以使用layout_constraintHorizontal_weight设置权重

8、屏障Barrier

        例如左侧多个控件长度不固定,右侧控件需要在较长控件的右侧

  1. <!-- 位置:bottom、left、right、top -->
  2. app:barrierDirection
  3. <!-- 引用的控件,多个用“,”隔开 -->
  4. app:constraint_referenced_ids
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent">
  6. <TextView
  7. android:id="@+id/TextView1"
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content"
  10. app:layout_constraintLeft_toLeftOf="parent"
  11. app:layout_constraintTop_toTopOf="parent"
  12. android:background="@color/colorAccent"
  13. android:text="TextView1" />
  14. <TextView
  15. android:id="@+id/TextView2"
  16. android:layout_width="wrap_content"
  17. android:layout_height="wrap_content"
  18. app:layout_constraintTop_toBottomOf="@+id/TextView1"
  19. app:layout_constraintLeft_toLeftOf="parent"
  20. android:background="@color/colorPrimary"
  21. android:text="TextTextView2"/>
  22. <androidx.constraintlayout.widget.Barrier
  23. android:id="@+id/barrier"
  24. android:layout_width="wrap_content"
  25. android:layout_height="wrap_content"
  26. app:barrierDirection="right"
  27. app:constraint_referenced_ids="TextView1,TextView2" />
  28. <TextView
  29. android:id="@+id/TextView3"
  30. android:layout_width="wrap_content"
  31. android:layout_height="0dp"
  32. app:layout_constraintLeft_toRightOf="@+id/barrier"
  33. app:layout_constraintTop_toTopOf="parent"
  34. app:layout_constraintBottom_toBottomOf="@+id/TextView2"
  35. android:background="@color/colorPrimaryDark"
  36. android:text="TextView3"/>
  37. </androidx.constraintlayout.widget.ConstraintLayout>

运行效果:

9、Group

        Group可以把多个控件归为一组,方便隐藏或显示一组控件。例如有TextView1、TextView2、TextView3,用Group将TextView1、TextView3归为一组隐藏。

  1. <androidx.constraintlayout.widget.Group
  2. android:id="@+id/group"
  3. android:layout_width="wrap_content"
  4. android:layout_height="wrap_content"
  5. android:visibility="gone"
  6. app:constraint_referenced_ids="TextView1,TextView3" />

10、Placeholder

        Placeholder是占位符。在Placeholder中可使用setContent()设置另一个控件的id,使这个控件移动到占位符的位置。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent">
  6. <androidx.constraintlayout.widget.Placeholder
  7. android:id="@+id/placeholder"
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content"
  10. app:content="@+id/TextView1"
  11. app:layout_constraintLeft_toLeftOf="parent"
  12. app:layout_constraintTop_toTopOf="parent" />
  13. <TextView
  14. android:id="@+id/TextView1"
  15. android:layout_width="wrap_content"
  16. android:layout_height="wrap_content"
  17. app:layout_constraintRight_toRightOf="parent"
  18. app:layout_constraintTop_toTopOf="parent"
  19. android:background="@color/colorAccent"
  20. android:text="TextView1" />
  21. </androidx.constraintlayout.widget.ConstraintLayout>

        上面代码中TextView1本来是应该在布局的右侧顶部,然后使用占位符后,控件最后显示在左侧顶部。

11、Guideline

        Guildline像辅助线一样,在预览的时候帮助你完成布局

  1. <!-- 辅助线方向 垂直vertical,水平horizontal -->
  2. android:orientation
  3. <!-- 开始位置 -->
  4. layout_constraintGuide_begin
  5. <!-- 结束位置 -->
  6. layout_constraintGuide_end
  7. <!-- 距离顶部的百分比(orientation = horizontal时则为距离左边) -->
  8. layout_constraintGuide_percent
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent">
  6. <androidx.constraintlayout.widget.Guideline
  7. android:id="@+id/guideline1"
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content"
  10. android:orientation="horizontal"
  11. app:layout_constraintGuide_begin="200dp" />
  12. <androidx.constraintlayout.widget.Guideline
  13. android:id="@+id/guideline2"
  14. android:layout_width="wrap_content"
  15. android:layout_height="wrap_content"
  16. android:orientation="vertical"
  17. app:layout_constraintGuide_percent="0.5" />
  18. <TextView
  19. android:id="@+id/TextView1"
  20. android:layout_width="wrap_content"
  21. android:layout_height="wrap_content"
  22. app:layout_constraintLeft_toLeftOf="@+id/guideline2"
  23. app:layout_constraintTop_toTopOf="@+id/guideline1"
  24. android:background="@color/colorAccent"
  25. android:text="TextView1" />
  26. </androidx.constraintlayout.widget.ConstraintLayout>

运行效果:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/225610
推荐阅读
相关标签
  

闽ICP备14008679号