Android开发:如何按半径约束布局项及定义XML中视图半径关系
Android布局半径约束及多View半径关联实现
1. 用半径约束布局元素的实现
依托ConstraintLayout的圆形约束能力即可实现,核心用到三个专属属性:
app:layout_constraintCircle:指定锚点View的id,被约束View会以该锚点的中心为圆心计算位置app:layout_constraintCircleRadius:两个View中心之间的半径距离,支持dp、px等单位app:layout_constraintCircleAngle:被约束View相对于锚点的角度,0度为正上方,顺时针范围0~360度
示例代码:
<androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent"> <!-- 中心锚点View --> <View android:id="@+id/anchor_view" android:layout_width="24dp" android:layout_height="24dp" android:background="#F44336" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent"/> <!-- 半径约束的外围View --> <View android:id="@+id/outer_view" android:layout_width="16dp" android:layout_height="16dp" android:background="#2196F3" app:layout_constraintCircle="@id/anchor_view" app:layout_constraintCircleRadius="120dp" app:layout_constraintCircleAngle="60"/> </androidx.constraintlayout.widget.ConstraintLayout>
2. 两个View半径关联的实现
原生XML没有提供直接绑定两个View半径的属性,但可以通过以下两种方案实现关联效果:
静态关联:共用维度资源
把共用的半径值定义在res/values/dimens.xml中,两个需要关联的View都引用同一个维度资源,修改时只需修改一处即可同步所有关联View的半径:
- 定义公共维度:
<!-- res/values/dimens.xml --> <dimen name="shared_radius">120dp</dimen>
- 布局中引用:
<!-- 第一个关联View --> app:layout_constraintCircleRadius="@dimen/shared_radius" <!-- 第二个关联View --> app:layout_constraintCircleRadius="@dimen/shared_radius"
动态关联:DataBinding绑定
如果需要运行时动态调整半径且保持同步,可以开启DataBinding,将两个View的半径属性绑定到同一个ViewModel的可观察字段,字段更新时两个View的半径会自动同步:
<!-- 第一个关联View --> app:layout_constraintCircleRadius="@{vm.globalRadius}" <!-- 第二个关联View --> app:layout_constraintCircleRadius="@{vm.globalRadius}"

内容的提问来源于stack exchange,提问作者SilverTech
相关产品推荐
相关产品推荐

