您可以在布局中保持 Id 的正常顺序,并创建一个自定义 Flow 类,将 Id 重新排列为您想要的自定义顺序(从下到上,从右到左):
class CustomFlow(context: Context, attrs: AttributeSet?) : Flow(context, attrs) {
init {
val newIds = IntArray(referencedIds.size)
Log.d("LOG_TAG", "init BEFORE: ${Arrays.toString(referencedIds)}")
for ((i, item) in (referencedIds).withIndex())
newIds[referencedIds.size - i - 1] = item
referencedIds = newIds
Log.d("LOG_TAG", "init AFTER: ${Arrays.toString(referencedIds)}")
}
}
并在您的布局中使用CustomFlow。
演示布局:
<?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="wrap_content">
<com.example.android.constraintlayoutflow.CustomFlow
android:id="@+id/flow"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
app:constraint_referenced_ids="button1, button2, button3, button4, button5, button6, button7, button8, button9, button10, button11, button12"
app:flow_horizontalGap="8dp"
app:flow_maxElementsWrap="4"
app:flow_verticalGap="8dp"
app:flow_verticalStyle="packed"
app:flow_wrapMode="chain"
tools:ignore="MissingConstraints" />
<Button
android:id="@+id/button1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="@android:color/holo_orange_light"
android:text="1"
android:textSize="18sp"
tools:ignore="MissingConstraints" />
<Button
android:id="@+id/button2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="@android:color/holo_orange_light"
android:text="2"
android:textSize="18sp"
tools:ignore="MissingConstraints" />
<Button
android:id="@+id/button3"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="@android:color/holo_orange_light"
android:text="3"
android:textSize="18sp"
tools:ignore="MissingConstraints" />
<Button
android:id="@+id/button4"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="@android:color/holo_orange_light"
android:text="4"
android:textSize="18sp"
tools:ignore="MissingConstraints" />
<Button
android:id="@+id/button5"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="@android:color/holo_orange_light"
android:text="5"
android:textSize="18sp"
tools:ignore="MissingConstraints" />
<Button
android:id="@+id/button6"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="@android:color/holo_orange_light"
android:text="6"
android:textSize="18sp"
tools:ignore="MissingConstraints" />
<Button
android:id="@+id/button7"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="@android:color/holo_orange_light"
android:text="7"
android:textSize="18sp"
tools:ignore="MissingConstraints" />
<Button
android:id="@+id/button8"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="@android:color/holo_orange_light"
android:text="8"
android:textSize="18sp"
tools:ignore="MissingConstraints" />
<Button
android:id="@+id/button9"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="@android:color/holo_orange_light"
android:text="9"
android:textSize="18sp"
tools:ignore="MissingConstraints" />
<Button
android:id="@+id/button10"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="@android:color/holo_orange_light"
android:text="10"
android:textSize="18sp"
tools:ignore="MissingConstraints" />
<Button
android:id="@+id/button11"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="@android:color/holo_orange_light"
android:textSize="18sp"
tools:ignore="MissingConstraints" />
<Button
android:id="@+id/button12"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="@android:color/holo_orange_light"
android:textSize="18sp"
tools:ignore="MissingConstraints" />
</androidx.constraintlayout.widget.ConstraintLayout>
预览:
更新
如果您删除 button11 和 button12,它没有可接受的行为。请问能不能改进一下?
因此,您希望通过删除 button11 和 button12 来使其保持相同的行为。
即您不需要额外的按钮或流程的空白填充物(这可以通过将其可见性设置为不可见来解决)。
但是在这里,我将通过以下更改摆脱它们:
- 修改自定义
Flow 以处理该列是否为全尺寸列。
- 用
android:rotationY="180"反转布局以模拟RTL方向,并对每个单独的元素进行反转以恢复this answer中描述的反转文本问题。
- 分配
app:flow_verticalBias="1" 以便从底部开始偏置元素。
演示:
<?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="wrap_content"
android:rotationY="180">
<com.example.android.constraintlayoutflow.CustomFlow
android:id="@+id/flow"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
app:constraint_referenced_ids="button1, button2, button3, button4, button5, button6, button7, button8, button9, button10"
app:flow_horizontalGap="8dp"
app:flow_verticalBias="1"
app:flow_verticalGap="8dp"
app:flow_verticalStyle="packed"
app:flow_wrapMode="chain"
tools:flow_maxElementsWrap="4"
tools:ignore="MissingConstraints" />
<FrameLayout
android:id="@+id/button1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:rotationY="180"
tools:ignore="MissingConstraints">
<Button
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_orange_light"
android:text="1"
android:textSize="18sp" />
</FrameLayout>
<FrameLayout
android:id="@+id/button2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:rotationY="180"
tools:ignore="MissingConstraints">
<Button
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_orange_light"
android:text="2"
android:textSize="18sp" />
</FrameLayout>
<FrameLayout
android:id="@+id/button3"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:rotationY="180"
tools:ignore="MissingConstraints">
<Button
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_orange_light"
android:text="3"
android:textSize="18sp" />
</FrameLayout>
<FrameLayout
android:id="@+id/button4"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:rotationY="180"
tools:ignore="MissingConstraints">
<Button
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_orange_light"
android:text="4"
android:textSize="18sp" />
</FrameLayout>
<FrameLayout
android:id="@+id/button5"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:rotationY="180"
tools:ignore="MissingConstraints">
<Button
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_orange_light"
android:text="5"
android:textSize="18sp" />
</FrameLayout>
<FrameLayout
android:id="@+id/button6"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:rotationY="180"
tools:ignore="MissingConstraints">
<Button
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_orange_light"
android:text="6"
android:textSize="18sp" />
</FrameLayout>
<FrameLayout
android:id="@+id/button7"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:rotationY="180"
tools:ignore="MissingConstraints">
<Button
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_orange_light"
android:text="7"
android:textSize="18sp" />
</FrameLayout>
<FrameLayout
android:id="@+id/button8"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:rotationY="180"
tools:ignore="MissingConstraints">
<Button
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_orange_light"
android:text="8"
android:textSize="18sp" />
</FrameLayout>
<FrameLayout
android:id="@+id/button9"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:rotationY="180"
tools:ignore="MissingConstraints">
<Button
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_orange_light"
android:text="9"
android:textSize="18sp" />
</FrameLayout>
<FrameLayout
android:id="@+id/button10"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:rotationY="180"
tools:ignore="MissingConstraints">
<Button
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_orange_light"
android:text="10"
android:textSize="18sp" />
</FrameLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
自定义流程:
class CustomFlow(context: Context, attrs: AttributeSet?) : Flow(context, attrs) {
init {
val size = referencedIds.size
val newIds = IntArray(size)
Log.d("LOG_TAG", "init BEFORE: ${Arrays.toString(referencedIds)}")
val COL_SIZE = 4
setMaxElementsWrap(COL_SIZE)
val extraItemCount = size % COL_SIZE
val fullSize = extraItemCount == 0
val colCount = if (fullSize) size / COL_SIZE else size / COL_SIZE + 1
var counter = 1
var baseIndex = -1
for ((i, item) in (referencedIds).withIndex()) {
val col: Int = i / COL_SIZE + 1
var newI: Int
if (fullSize || col < colCount) {
newI = col * COL_SIZE - i - 1 + (col - 1) * COL_SIZE
} else {
if (baseIndex == -1) baseIndex = i
newI = baseIndex + extraItemCount - counter
counter++
}
newIds[newI] = item
}
referencedIds = newIds
Log.d("LOG_TAG", "init AFTER: ${Arrays.toString(referencedIds)}")
}
}
结果: