一、前言

在一般的安卓开发中,编写界面需要很多嵌套,这会有一定的性能影响,这个时候就可以使用 ConstraintLayout 或 RelativeLayout来减少嵌套,简化布局深度。ConstraintLayot 类似 RelativeLayout,但是更灵活更强大。

    1. 具有更强的性能优势,简化嵌套深度。
    1. 更好的屏幕适配,可以使用比例来适配,效果更好。
    1. 可视化编辑,操作起来不是很完美。

      二、使用

    1. 引入
      1. implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    1. 基本的相对定位
  • 下面是一些常用的基本属性,看到名字基本上就知道怎么用了,具体使用看下面示例。

    1. layout_constraintLeft_toLeftOf
    2. layout_constraintLeft_toRightOf
    3. layout_constraintRight_toLeftOf
    4. layout_constraintRight_toRightOf
    5. layout_constraintTop_toTopOf
    6. layout_constraintTop_toBottomOf
    7. layout_constraintBottom_toTopOf
    8. layout_constraintBottom_toBottomOf
    9. layout_constraintBaseline_toBaselineOf
    10. layout_constraintStart_toEndOf
    11. layout_constraintStart_toStartOf
    12. layout_constraintEnd_toStartOf
    13. layout_constraintEnd_toEndOf

    image.png
    这个图的实现方法如下:主要是子控件和父控件之间的相对定位。

    1. <TextView
    2. android:layout_width="wrap_content"
    3. android:layout_height="wrap_content"
    4. android:text="在左上角"
    5. android:background="@color/red_F7E6ED"
    6. app:layout_constraintTop_toTopOf="parent"
    7. app:layout_constraintStart_toStartOf="parent"/>
    8. <TextView
    9. android:layout_width="wrap_content"
    10. android:layout_height="wrap_content"
    11. android:text="在右上角"
    12. android:background="@color/red_F7E6ED"
    13. app:layout_constraintTop_toTopOf="parent"
    14. app:layout_constraintEnd_toEndOf="parent"/>
    15. <TextView
    16. android:layout_width="wrap_content"
    17. android:layout_height="wrap_content"
    18. android:text="居中显示"
    19. android:background="@color/red_F7E6ED"
    20. app:layout_constraintTop_toTopOf="parent"
    21. app:layout_constraintStart_toStartOf="parent"
    22. app:layout_constraintEnd_toEndOf="parent"/>
  • 子控件和子控件之间的定位:

image.png

  1. <TextView
  2. android:id="@+id/tv_center"
  3. android:layout_width="wrap_content"
  4. android:layout_height="wrap_content"
  5. android:text="居中显示"
  6. android:background="@color/red_F7E6ED"
  7. app:layout_constraintTop_toTopOf="parent"
  8. app:layout_constraintStart_toStartOf="parent"
  9. app:layout_constraintEnd_toEndOf="parent"/>
  10. <TextView
  11. android:id="@+id/tv_one"
  12. android:layout_width="wrap_content"
  13. android:layout_height="wrap_content"
  14. android:text="子控件一"
  15. android:background="@color/yellow_FF9B52"
  16. app:layout_constraintTop_toBottomOf="@+id/tv_center"
  17. app:layout_constraintStart_toStartOf="parent"
  18. app:layout_constraintEnd_toEndOf="parent"/>
  19. <TextView
  20. android:id="@+id/tv_two"
  21. android:layout_width="wrap_content"
  22. android:layout_height="wrap_content"
  23. android:text="子控件二"
  24. android:background="@color/green_07C0C2"
  25. app:layout_constraintTop_toBottomOf="@+id/tv_center"
  26. app:layout_constraintEnd_toStartOf="@+id/tv_one"/>
  • 子控件之间高度不一样时的定位:

image.png
实现居中对齐,顶部和底部对齐,实现如下:

  1. <TextView
  2. android:id="@+id/tv_four"
  3. android:layout_width="wrap_content"
  4. android:layout_height="50dp"
  5. android:text="子控件四"
  6. android:gravity="center"
  7. android:background="@color/red_F7E6ED"
  8. android:layout_marginTop="50dp"
  9. app:layout_constraintTop_toTopOf="parent"
  10. app:layout_constraintStart_toStartOf="parent"
  11. app:layout_constraintEnd_toEndOf="parent"/>
  12. <TextView
  13. android:id="@+id/tv_five"
  14. android:layout_width="wrap_content"
  15. android:layout_height="60dp"
  16. android:text="左边顶部对齐"
  17. android:gravity="center"
  18. android:background="@color/black_999999"
  19. android:layout_marginTop="50dp"
  20. app:layout_constraintTop_toTopOf="parent"
  21. app:layout_constraintEnd_toStartOf="@+id/tv_four"/>
  22. <TextView
  23. android:layout_width="wrap_content"
  24. android:layout_height="30dp"
  25. android:text="底部对齐"
  26. android:gravity="center"
  27. android:background="@color/green_07C0C2"
  28. app:layout_constraintBottom_toBottomOf="@+id/tv_five"
  29. app:layout_constraintEnd_toStartOf="@+id/tv_five"/>
  30. <TextView
  31. android:id="@+id/tv_six"
  32. android:layout_width="wrap_content"
  33. android:layout_height="30dp"
  34. android:text="右边居中对齐"
  35. android:gravity="center"
  36. android:background="@color/yellow_FF9B52"
  37. android:layout_marginTop="50dp"
  38. app:layout_constraintTop_toTopOf="parent"
  39. app:layout_constraintStart_toEndOf="@+id/tv_four"
  40. app:layout_constraintBaseline_toBaselineOf="@+id/tv_four"/>

居中对齐用到了一个属性:layout_constraintBaseline_toBaselineOf
这个属性是帮助基准线对齐,如果文字不居中无法实现控件整体居中对齐,示例如下:
image.png

  1. <TextView
  2. android:id="@+id/tv_center"
  3. android:layout_width="wrap_content"
  4. android:layout_height="wrap_content"
  5. android:text="正中心"
  6. android:background="@color/blue_74D3FF"
  7. android:padding="8dp"
  8. app:layout_constraintTop_toTopOf="parent"
  9. app:layout_constraintBottom_toBottomOf="parent"
  10. app:layout_constraintStart_toStartOf="parent"
  11. app:layout_constraintEnd_toEndOf="parent"/>
  12. <TextView
  13. android:layout_width="100dp"
  14. android:layout_height="50dp"
  15. android:text="BaseLine 对齐"
  16. android:background="@color/red_FF8EB7"
  17. app:layout_constraintBaseline_toBaselineOf="@+id/tv_center"
  18. app:layout_constraintEnd_toStartOf="@+id/tv_center"/>
  19. <TextView
  20. android:layout_width="100dp"
  21. android:layout_height="50dp"
  22. android:text="BaseLine 对齐"
  23. android:gravity="center"
  24. android:background="@color/green_07C0C2"
  25. app:layout_constraintBaseline_toBaselineOf="@+id/tv_center"
  26. app:layout_constraintStart_toEndOf="@+id/tv_center"/>

如果想实现左侧控件和中心控件居中对齐,可以使用如下方法:
image.png

  1. <TextView
  2. android:id="@+id/tv_center"
  3. android:layout_width="wrap_content"
  4. android:layout_height="wrap_content"
  5. android:text="正中心"
  6. android:background="@color/blue_74D3FF"
  7. android:padding="8dp"
  8. app:layout_constraintTop_toTopOf="parent"
  9. app:layout_constraintBottom_toBottomOf="parent"
  10. app:layout_constraintStart_toStartOf="parent"
  11. app:layout_constraintEnd_toEndOf="parent"/>
  12. <TextView
  13. android:layout_width="100dp"
  14. android:layout_height="50dp"
  15. android:text="BaseLine 对齐"
  16. android:background="@color/red_FF8EB7"
  17. app:layout_constraintEnd_toStartOf="@+id/tv_center"
  18. app:layout_constraintTop_toTopOf="@+id/tv_center"
  19. app:layout_constraintBottom_toBottomOf="@+id/tv_center"/>
  20. <TextView
  21. android:layout_width="100dp"
  22. android:layout_height="50dp"
  23. android:text="BaseLine 对齐"
  24. android:gravity="center"
  25. android:background="@color/green_07C0C2"
  26. app:layout_constraintBaseline_toBaselineOf="@+id/tv_center"
  27. app:layout_constraintStart_toEndOf="@+id/tv_center"/>


  • 角度定位,效果如下图,角度和距离都是两个控件的中心作为参考。

image.pngimage.png

  1. <TextView
  2. android:id="@+id/tv_nine"
  3. android:layout_width="wrap_content"
  4. android:layout_height="50dp"
  5. android:layout_marginTop="120dp"
  6. android:background="@color/red_F7E6ED"
  7. android:gravity="center"
  8. android:text="子控件九"
  9. app:layout_constraintStart_toStartOf="parent"
  10. app:layout_constraintTop_toTopOf="parent" />
  11. <TextView
  12. android:layout_width="wrap_content"
  13. android:layout_height="50dp"
  14. android:background="@color/green_07C0C2"
  15. android:gravity="center"
  16. android:text="在子控件九120度方向 180dp 的距离"
  17. app:layout_constraintBaseline_toBaselineOf="@+id/tv_nine"
  18. app:layout_constraintCircle="@id/tv_nine"
  19. app:layout_constraintCircleAngle="110"
  20. app:layout_constraintCircleRadius="180dp"
  21. app:layout_constraintStart_toStartOf="parent"
  22. />
  • margin

    1. ConstraintLayout的边距常用属性如下:
    2. android:layout_marginStart
    3. android:layout_marginEnd
    4. android:layout_marginLeft
    5. android:layout_marginTop
    6. android:layout_marginRight
    7. android:layout_marginBottom

    和以前的用法基本一样,不过要先约束好子控件的位置才会生效。

  • goneMargin

    1. goneMargin主要用于约束的控件可见性被设置为gone的时候使用的margin值,属性如下:
    2. layout_goneMarginStart
    3. layout_goneMarginEnd
    4. layout_goneMarginLeft
    5. layout_goneMarginTop
    6. layout_goneMarginRight
    7. layout_goneMarginBottom

    约束的控件可见时:
    image.png
    约束的控件不可见时:
    image.png

    1. 尺寸约束
  • 使用wrap_content,让控件自己计算大小,用法和以前的用法基本一样,不过可以使用下列属性来控制最大,最小值。

    1. android:minWidth 最小的宽度
    2. android:minHeight 最小的高度
    3. android:maxWidth 最大的宽度
    4. android:maxHeight 最大的高度
  • match_parent,不推荐使用,用 0dp 和约束来实现,示例如下:

image.png

  1. <TextView
  2. android:id="@+id/tv_eleven"
  3. android:layout_width="0dp"
  4. android:layout_height="wrap_content"
  5. android:layout_marginTop="20dp"
  6. android:background="@color/blue_74D3FF"
  7. android:gravity="center"
  8. android:text="子控件十一"
  9. app:layout_constraintTop_toBottomOf="@id/tv_ten2"
  10. app:layout_constraintStart_toStartOf="parent"
  11. app:layout_constraintEnd_toEndOf="parent"/>
  • 一个控件宽度固定,另一个占据余下空间

image.png

  1. <TextView
  2. android:id="@+id/tv_twelve"
  3. android:layout_width="0dp"
  4. android:layout_height="40dp"
  5. android:layout_marginTop="20dp"
  6. android:background="@color/blue_74D3FF"
  7. android:gravity="center"
  8. android:text="子控件十二"
  9. app:layout_constraintTop_toBottomOf="@id/tv_eleven"
  10. app:layout_constraintStart_toStartOf="parent"
  11. app:layout_constraintEnd_toStartOf="@+id/tv_thirteen"/>
  12. <TextView
  13. android:id="@+id/tv_thirteen"
  14. android:layout_width="80dp"
  15. android:layout_height="wrap_content"
  16. android:layout_marginTop="20dp"
  17. android:background="@color/green_07C0C2"
  18. android:gravity="center"
  19. android:text="子控件十三"
  20. app:layout_constraintTop_toBottomOf="@id/tv_eleven"
  21. app:layout_constraintEnd_toEndOf="parent"
  22. />
  • 宽高比

通过属性layout_constraintDimensionRatio设置宽高比,示例如下:
image.png
属性layout_constraintDimensionRatio = “1:2”,默认是宽高比,可以指定变成高宽比,
app:layout_constraintDimensionRatio=”H,1:2”指的是 高:宽=1:2
app:layout_constraintDimensionRatio=”W,1:2”指的是 宽:高=1:2

  1. <TextView
  2. android:id="@+id/tv_fourteen"
  3. android:layout_width="0dp"
  4. android:layout_height="wrap_content"
  5. app:layout_constraintDimensionRatio="1:2"
  6. android:layout_marginTop="20dp"
  7. android:background="@color/green_07C0C2"
  8. android:gravity="center"
  9. android:text="子控件十四,宽高比 1:2"
  10. app:layout_constraintTop_toBottomOf="@id/tv_twelve"
  11. app:layout_constraintStart_toStartOf="parent"
  12. />
  13. <TextView
  14. android:id="@+id/tv_fourteen2"
  15. android:layout_width="0dp"
  16. android:layout_height="wrap_content"
  17. app:layout_constraintDimensionRatio="W,1:2"
  18. android:layout_marginTop="20dp"
  19. android:background="@color/red_FF6D84"
  20. android:gravity="center"
  21. android:text="子控件十四,宽高比 W,1:2"
  22. app:layout_constraintTop_toBottomOf="@id/tv_twelve"
  23. app:layout_constraintStart_toEndOf="@+id/tv_fourteen"/>
  24. <TextView
  25. android:id="@+id/tv_fourteen3"
  26. android:layout_width="0dp"
  27. android:layout_height="wrap_content"
  28. app:layout_constraintDimensionRatio="H,1:2"
  29. android:layout_marginTop="20dp"
  30. android:background="@color/red_FF6D84"
  31. android:gravity="center"
  32. android:text="子控件十四,高宽比H, 1:2"
  33. app:layout_constraintTop_toBottomOf="@id/tv_twelve"
  34. app:layout_constraintStart_toEndOf="@+id/tv_fourteen2"/>
  • 实现权重
    1. 三等分

image.png

  1. <TextView
  2. android:id="@+id/tv_left"
  3. android:layout_width="0dp"
  4. android:layout_height="30dp"
  5. android:text="控件左"
  6. app:layout_constraintTop_toBottomOf="@+id/tv_thirteen"
  7. android:layout_marginTop="50dp"
  8. android:gravity="center"
  9. android:background="@color/red_FF8EB7"
  10. app:layout_constraintStart_toStartOf="parent"
  11. app:layout_constraintEnd_toStartOf="@+id/tv_middle"/>
  12. <TextView
  13. android:id="@+id/tv_right"
  14. android:layout_width="0dp"
  15. android:layout_height="30dp"
  16. android:text="控件右"
  17. app:layout_constraintTop_toBottomOf="@+id/tv_thirteen"
  18. android:layout_marginTop="50dp"
  19. android:gravity="center"
  20. android:background="@color/green_07C0C2"
  21. app:layout_constraintEnd_toEndOf="parent"
  22. app:layout_constraintStart_toEndOf="@+id/tv_middle"/>
  23. <TextView
  24. android:id="@+id/tv_middle"
  25. android:layout_width="0dp"
  26. android:layout_height="30dp"
  27. android:text="控件中"
  28. app:layout_constraintTop_toBottomOf="@+id/tv_thirteen"
  29. android:layout_marginTop="50dp"
  30. android:gravity="center"
  31. android:background="@color/yellow_FF9B52"
  32. app:layout_constraintStart_toEndOf="@+id/tv_left"
  33. app:layout_constraintEnd_toStartOf="@+id/tv_right"/>
    1. 设置比例 2:1:1

只需要给每个控件设置layout_constraintHorizontal_weight就可以了
image.png

    1. 配合layout_constraintHorizontal_chainStyle实现更多效果,如下:

image.png

  • 3.1 spread + 宽度非0,不设置默认的就是这种效果

image.png

  1. <TextView
  2. android:id="@+id/tv_left"
  3. android:layout_width="wrap_content"
  4. android:layout_height="wrap_content"
  5. android:text="左侧"
  6. android:background="@color/red_FF6D84"
  7. android:padding="10dp"
  8. app:layout_constraintTop_toTopOf="parent"
  9. app:layout_constraintStart_toStartOf="parent"
  10. app:layout_constraintEnd_toStartOf="@+id/tv_center"/>
  11. <TextView
  12. android:id="@+id/tv_center"
  13. android:layout_width="wrap_content"
  14. android:layout_height="wrap_content"
  15. android:text="中间"
  16. android:background="@color/yellow_FF9B52"
  17. android:padding="10dp"
  18. app:layout_constraintTop_toTopOf="parent"
  19. app:layout_constraintStart_toEndOf="@+id/tv_left"
  20. app:layout_constraintEnd_toStartOf="@+id/tv_right"/>
  21. <TextView
  22. android:id="@+id/tv_right"
  23. android:layout_width="wrap_content"
  24. android:layout_height="wrap_content"
  25. android:text="右侧"
  26. android:background="@color/green_07C0C2"
  27. android:padding="10dp"
  28. app:layout_constraintTop_toTopOf="parent"
  29. app:layout_constraintEnd_toEndOf="parent"
  30. app:layout_constraintStart_toEndOf="@+id/tv_center"/>
  • 3.2 spread_inside + 宽度非0,只要在第一个控件设置就可以了。

image.png

  1. <TextView
  2. android:id="@+id/tv_left"
  3. android:layout_width="wrap_content"
  4. android:layout_height="wrap_content"
  5. android:text="左侧"
  6. android:background="@color/red_FF6D84"
  7. android:padding="10dp"
  8. app:layout_constraintTop_toTopOf="parent"
  9. app:layout_constraintStart_toStartOf="parent"
  10. app:layout_constraintEnd_toStartOf="@+id/tv_center"
  11. app:layout_constraintHorizontal_chainStyle="spread_inside"/>
  12. <TextView
  13. android:id="@+id/tv_center"
  14. android:layout_width="wrap_content"
  15. android:layout_height="wrap_content"
  16. android:text="中间"
  17. android:background="@color/yellow_FF9B52"
  18. android:padding="10dp"
  19. app:layout_constraintTop_toTopOf="parent"
  20. app:layout_constraintStart_toEndOf="@+id/tv_left"
  21. app:layout_constraintEnd_toStartOf="@+id/tv_right"/>
  22. <TextView
  23. android:id="@+id/tv_right"
  24. android:layout_width="wrap_content"
  25. android:layout_height="wrap_content"
  26. android:text="右侧"
  27. android:background="@color/green_07C0C2"
  28. android:padding="10dp"
  29. app:layout_constraintTop_toTopOf="parent"
  30. app:layout_constraintEnd_toEndOf="parent"
  31. app:layout_constraintStart_toEndOf="@+id/tv_center"/>
  • 3.3 packed + 宽度非 0

image.png

  1. <TextView
  2. android:id="@+id/tv_left"
  3. android:layout_width="wrap_content"
  4. android:layout_height="wrap_content"
  5. android:text="左侧"
  6. android:background="@color/red_FF6D84"
  7. android:padding="10dp"
  8. app:layout_constraintTop_toTopOf="parent"
  9. app:layout_constraintStart_toStartOf="parent"
  10. app:layout_constraintEnd_toStartOf="@+id/tv_center"
  11. app:layout_constraintHorizontal_chainStyle="packed"/>
  12. <TextView
  13. android:id="@+id/tv_center"
  14. android:layout_width="wrap_content"
  15. android:layout_height="wrap_content"
  16. android:text="中间"
  17. android:background="@color/yellow_FF9B52"
  18. android:padding="10dp"
  19. app:layout_constraintTop_toTopOf="parent"
  20. app:layout_constraintStart_toEndOf="@+id/tv_left"
  21. app:layout_constraintEnd_toStartOf="@+id/tv_right"/>
  22. <TextView
  23. android:id="@+id/tv_right"
  24. android:layout_width="wrap_content"
  25. android:layout_height="wrap_content"
  26. android:text="右侧"
  27. android:background="@color/green_07C0C2"
  28. android:padding="10dp"
  29. app:layout_constraintTop_toTopOf="parent"
  30. app:layout_constraintEnd_toEndOf="parent"
  31. app:layout_constraintStart_toEndOf="@+id/tv_center"/>
  • 3.4 spread + 宽度为0,spread_inside + 宽度为0,packed + 宽度为0且可以通过weight控制分配比例,显示效果以设置的比例为准

image.png

  1. <TextView
  2. android:id="@+id/tv_left"
  3. android:layout_width="0dp"
  4. android:layout_height="30dp"
  5. app:layout_constraintHorizontal_weight="1"
  6. android:text="控件左"
  7. app:layout_constraintTop_toBottomOf="@+id/tv_thirteen"
  8. android:layout_marginTop="50dp"
  9. android:gravity="center"
  10. android:background="@color/red_FF8EB7"
  11. app:layout_constraintStart_toStartOf="parent"
  12. app:layout_constraintEnd_toStartOf="@+id/tv_middle"
  13. app:layout_constraintVertical_chainStyle="spread"/>
  14. <TextView
  15. android:id="@+id/tv_right"
  16. android:layout_width="0dp"
  17. android:layout_height="30dp"
  18. app:layout_constraintHorizontal_weight="1"
  19. android:text="控件右"
  20. app:layout_constraintTop_toBottomOf="@+id/tv_thirteen"
  21. android:layout_marginTop="50dp"
  22. android:gravity="center"
  23. android:background="@color/green_07C0C2"
  24. app:layout_constraintEnd_toEndOf="parent"
  25. app:layout_constraintStart_toEndOf="@+id/tv_middle"
  26. app:layout_constraintVertical_chainStyle="spread"/>
  27. <TextView
  28. android:id="@+id/tv_middle"
  29. android:layout_width="0dp"
  30. app:layout_constraintHorizontal_weight="1"
  31. android:layout_height="30dp"
  32. android:text="控件中"
  33. app:layout_constraintTop_toBottomOf="@+id/tv_thirteen"
  34. android:layout_marginTop="50dp"
  35. android:gravity="center"
  36. android:background="@color/yellow_FF9B52"
  37. app:layout_constraintStart_toEndOf="@+id/tv_left"
  38. app:layout_constraintEnd_toStartOf="@+id/tv_right"
  39. app:layout_constraintVertical_chainStyle="spread"/>
    1. 5 layout_constraintHorizontal_bias + packed 实现最后一种效果

image.png
如上,3.3中布局总体居中,这时可以通过设置layout_constraintHorizontal_bias 和layout_constraintVertical_bias来控制位置

  1. <TextView
  2. android:id="@+id/tv_left"
  3. android:layout_width="wrap_content"
  4. android:layout_height="wrap_content"
  5. android:text="左侧"
  6. android:background="@color/red_FF6D84"
  7. android:padding="10dp"
  8. app:layout_constraintTop_toTopOf="parent"
  9. app:layout_constraintStart_toStartOf="parent"
  10. app:layout_constraintEnd_toStartOf="@+id/tv_center"
  11. app:layout_constraintHorizontal_chainStyle="packed"
  12. app:layout_constraintHorizontal_bias="0.1"/>
  13. <TextView
  14. android:id="@+id/tv_center"
  15. android:layout_width="wrap_content"
  16. android:layout_height="wrap_content"
  17. android:text="中间"
  18. android:background="@color/yellow_FF9B52"
  19. android:padding="10dp"
  20. app:layout_constraintTop_toTopOf="parent"
  21. app:layout_constraintStart_toEndOf="@+id/tv_left"
  22. app:layout_constraintEnd_toStartOf="@+id/tv_right"/>
  23. <TextView
  24. android:id="@+id/tv_right"
  25. android:layout_width="wrap_content"
  26. android:layout_height="wrap_content"
  27. android:text="右侧"
  28. android:background="@color/green_07C0C2"
  29. android:padding="10dp"
  30. app:layout_constraintTop_toTopOf="parent"
  31. app:layout_constraintEnd_toEndOf="parent"
  32. app:layout_constraintStart_toEndOf="@+id/tv_center"/>

两个属性一起使用,实现左下角或是右下角有一定间距,通过 margin 也可以实现,

  • margin 实现如下:

image.png

  1. <TextView
  2. android:layout_width="80dp"
  3. android:layout_height="80dp"
  4. android:text="右下角"
  5. android:textColor="@color/white"
  6. android:gravity="center"
  7. android:background="@color/red"
  8. app:layout_constraintEnd_toEndOf="parent"
  9. app:layout_constraintBottom_toBottomOf="parent"
  10. android:layout_margin="10dp"/>
  • layout_constraintHorizontal_bias 实现如下:

image.png

  1. <TextView
  2. android:layout_width="80dp"
  3. android:layout_height="80dp"
  4. android:text="左下角"
  5. android:textColor="@color/white"
  6. android:gravity="center"
  7. android:background="@color/red"
  8. app:layout_constraintEnd_toEndOf="parent"
  9. app:layout_constraintBottom_toBottomOf="parent"
  10. app:layout_constraintTop_toTopOf="parent"
  11. app:layout_constraintStart_toStartOf="parent"
  12. app:layout_constraintHorizontal_bias="0.08"
  13. app:layout_constraintVertical_bias="0.98"
  14. />
  • 4. 其他相关控件
  • 4.1 GuideLine

辅助线,帮助定位控件,并不会显示在界面上
Guildline的主要属性:
android:orientation 垂直vertical,水平horizontal
layout_constraintGuide_begin 开始位置(水平方向,距离顶部。垂直距离左侧)
layout_constraintGuide_end 结束位置(水平方向,距离顶部。垂直距离左侧)
ayout_constraintGuide_percent 距离的百分比(水平方向,距离顶部。垂直距离左侧)

  • 距离顶部 100dp 设置一条辅助线:

image.png
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:orientation=”horizontal”
app:layout_constraintGuide_begin=”100dp”
/>

  • 距顶部 80%的位置设置一条辅助线
  • image.png

android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:orientation=”horizontal”
app:layout_constraintGuide_percent=”0.8”
/>
可以自由拖动控制辅助线的位置。

  • 4.2 Group 可以方便控制子控件显示或隐藏

比如有多个子控件,需要控制多个个隐藏,比一个一个控件控制更方便,示例如下:
隐藏前的控件:
image.png
设置隐藏后:
image.png
完整布局:

  1. <TextView
  2. android:id="@+id/tv_left"
  3. android:layout_width="wrap_content"
  4. android:layout_height="wrap_content"
  5. android:text="左侧"
  6. android:background="@color/red_FF6D84"
  7. android:padding="10dp"
  8. app:layout_constraintTop_toTopOf="parent"
  9. app:layout_constraintStart_toStartOf="parent"
  10. app:layout_constraintEnd_toStartOf="@+id/tv_center"
  11. app:layout_constraintHorizontal_chainStyle="packed"
  12. app:layout_constraintHorizontal_bias="0.1"/>
  13. <TextView
  14. android:id="@+id/tv_center"
  15. android:layout_width="wrap_content"
  16. android:layout_height="wrap_content"
  17. android:text="中间"
  18. android:background="@color/yellow_FF9B52"
  19. android:padding="10dp"
  20. app:layout_constraintTop_toTopOf="parent"
  21. app:layout_constraintStart_toEndOf="@+id/tv_left"
  22. app:layout_constraintEnd_toStartOf="@+id/tv_right"/>
  23. <TextView
  24. android:id="@+id/tv_right"
  25. android:layout_width="wrap_content"
  26. android:layout_height="wrap_content"
  27. android:text="右侧"
  28. android:background="@color/green_07C0C2"
  29. android:padding="10dp"
  30. app:layout_constraintTop_toTopOf="parent"
  31. app:layout_constraintEnd_toEndOf="parent"
  32. app:layout_constraintStart_toEndOf="@+id/tv_center"/>
  33. <androidx.constraintlayout.widget.Guideline
  34. android:layout_width="wrap_content"
  35. android:layout_height="wrap_content"
  36. android:orientation="horizontal"
  37. app:layout_constraintGuide_percent="0.7" />
  38. <androidx.constraintlayout.widget.Group
  39. android:layout_width="match_parent"
  40. android:layout_height="wrap_content"
  41. app:constraint_referenced_ids="tv_left,tv_center"
  42. android:visibility="gone"/>

主要是通过 constraint_referenced_ids 这个属性来实现,然后控制 Group 显示或隐藏就能同时控制加入进去的子控件。Group 使用注意事项:

  • Group优先于View,下层Group优先于上层。
  • Group只可以引用当前ConstraintLayout下的View,子Layout 下的View不可以。
  • app:constraint_referenced_ids里直接写的是id的字符串,初始化后会通过getIdentifier来反射查找叫该名字的id。所以如果你的项目用了类似AndResGuard的混淆id名字的功能,切记不要混淆app:constraint_referenced_ids里的id,否则在release版本就会因找不到该id而失效。或者也可以通过代码setReferencedIds来设置id。
  • 4.3 Placeholder

占位布局,自己本身不绘制内容,但是可以通过属性 app: content = “id” 控制对应的控 件绘制到自己的位置上,而对应的控件就像 gone 了一样。示例如下,右上角的控件跑到了左上角:
image.png

  1. <TextView
  2. android:id="@+id/tv_right3"
  3. android:layout_width="wrap_content"
  4. android:layout_height="wrap_content"
  5. android:text="右侧"
  6. android:background="@color/green_07C0C2"
  7. android:padding="10dp"
  8. app:layout_constraintTop_toTopOf="parent"
  9. app:layout_constraintEnd_toEndOf="parent"
  10. />
  11. <androidx.constraintlayout.widget.Placeholder
  12. android:layout_width="wrap_content"
  13. android:layout_height="wrap_content"
  14. app:content="@+id/tv_right3"
  15. app:layout_constraintTop_toTopOf="parent"
  16. app:layout_constraintStart_toStartOf="parent"/>
  • 4.4 Optimizer

当我们使用 MATCH_CONSTRAINT 时,ConstraintLayout 将对控件进行 2 次测量,ConstraintLayout在1.1中可以通过设置 layout_optimizationLevel 进行优化,可设置的值有:
none:无优化
standard:仅优化直接约束和屏障约束(默认)
direct:优化直接约束
barrier:优化屏障约束
chain:优化链约束
dimensions:优化尺寸测量

  • 4.5 Barrier

假如有如下三个控件, a b 的宽度都是不确定的,如果设置 c 在 b 的右侧,c 就会遮挡 a,如果设置 c 在 a 的右侧,b 的长度比 a 长,还是会有遮挡问题。这时用 Barrier 就可以解决问题。
image.png
通过设置属性:
app:barrierDirection 设置屏障位置
constraint_referenced_ids 加入的控件
image.png

  1. <TextView
  2. android:id="@+id/tv_a"
  3. android:layout_width="wrap_content"
  4. android:layout_height="wrap_content"
  5. android:text="aaaaaaa"
  6. android:background="@color/red_FF8EB7"
  7. android:padding="10dp"
  8. app:layout_constraintTop_toTopOf="parent"
  9. app:layout_constraintStart_toStartOf="parent"
  10. />
  11. <TextView
  12. android:id="@+id/tv_b"
  13. android:layout_width="wrap_content"
  14. android:layout_height="wrap_content"
  15. android:text="bbbb"
  16. android:background="@color/blue_74D3FF"
  17. android:padding="10dp"
  18. app:layout_constraintTop_toBottomOf="@+id/tv_a"
  19. app:layout_constraintStart_toStartOf="parent"
  20. />
  21. <TextView
  22. android:id="@+id/tv_c"
  23. android:layout_width="wrap_content"
  24. android:layout_height="wrap_content"
  25. android:text="ccccccccccc"
  26. android:background="@color/green_07C0C2"
  27. android:padding="25dp"
  28. app:layout_constraintTop_toTopOf="parent"
  29. app:layout_constraintStart_toEndOf="@id/barrie" />
  30. <androidx.constraintlayout.widget.Barrier
  31. android:id="@+id/barrie"
  32. android:layout_width="wrap_content"
  33. android:layout_height="wrap_content"
  34. app:barrierDirection="end"
  35. app:constraint_referenced_ids="tv_a,tv_b"/>

参考

约束布局ConstraintLayout看这一篇就够了
ConstraintLayout 用法全解析
Android ConstraintLayout的使用
ConstraintLayout 完全解析 快来优化你的布局吧