有两个部分:
- 为
CoordinatorLayout 设置关键线,以及
- 在子视图中引用关键线。
对于前者,创建一个 int 数组资源并从CoordinatorLayout 的keylines 属性中引用它。例如:
res/values/arrays.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<array name="keylines">
<item>16</item>
<item>72</item>
<item>160</item>
<item>256</item>
<item>320</item>
</array>
...
</resources>
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:app="http://schemas.android.com/apk/res-auto"
app:keylines="@array/keylines"
...
然后,要相对于关键线水平定位子视图,请将其layout_keyline 属性设置为keylines 数组资源的索引。例如,要在关键线 2 上设置一个按钮(位置为 160dp):
activity_main.xml
...
<Button
app:layout_keyline="2"
相对于关键线的定位由layout_gravity 属性定义。对于按钮,这将定位按钮的文本,因此如果您想使用重力来定位按钮,请将其包装在另一个视图中(例如FrameLayout)并为父视图设置关键线而不是Button:
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top|end"
app:layout_keyline="2"
...>
<Button
...
Keylines 让您可以在CoordinatorLayout 中水平定位子视图。垂直定位由垂直边距和内边距确定,并且相对于CoordinatorLayout 的顶部。
请注意,如果还为子视图设置了anchor,则其关键线将被忽略。
如果您对布局逻辑感到好奇,它是由onLayoutChild() 和layoutChildWithKeyline() 在CoordinatorLayout 中实现的。