kotlin Jetpack组合中的重量

50few1ms  于 2022-11-25  发布在  Kotlin
关注(0)|答案(6)|浏览(208)

是否可以在Jetpack Compose中设置权重?例如,我想将一个项目的权重设置为布局的1/3,另一个项目的权重设置为布局的2/3。
在XML/ViewGroup样式中,可以使用LinearLayouts和ConstraintLayouts来实现这一点。

示例

在ConstraintLayout中,此操作如下所示:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <View
        android:layout_width="0dp"
        android:layout_height="100dp"
        android:id="@+id/red"
        android:background="@color/red"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/blue"
        app:layout_constraintHorizontal_weight="1"/>
    <View
        android:layout_width="0dp"
        android:layout_height="100dp"
        android:id="@+id/blue"
        android:background="@color/blue"
        app:layout_constraintStart_toEndOf="@id/red"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_weight="2"/>
</androidx.constraintlayout.widget.ConstraintLayout>

在LinearLayouts中,此操作如下所示:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">
    <View
        android:layout_width="0dp"
        android:layout_height="100dp"
        android:id="@+id/red"
        android:background="@color/red"
        android:layout_weight="1"/>
    <View
        android:layout_width="0dp"
        android:layout_height="100dp"
        android:id="@+id/blue"
        android:background="@color/blue"
        android:layout_weight="2"/>
</LinearLayout>

我知道您可以使用Tables来获得“均匀”分布的内容,但我想要“不均匀”分布。

kx7yvsdv

kx7yvsdv1#

您可以使用**Modifier.weight**
类似于:

Row() {
    Column(
        Modifier.weight(1f).background(Blue)
    ){
        Text(text = "Weight = 1", color = Color.White)
    }
    Column(
        Modifier.weight(2f).background(Yellow)
    ) {
        Text(text = "Weight = 2")
    }
}

hgqdbh6s

hgqdbh6s2#

由于“0.1.0-dev 09”修饰符在接口上移动,因此可以使用
修饰符.weight(浮点型,布尔型)
在测量未加权的子元素后,划分剩余的垂直/水平空间,并根据此权重进行分配

Column {
        Row(modifier = Modifier.weight(2.0f, true)) {
            Box (
                modifier = Modifier.fillMaxWidth().fillMaxHeight(),
                backgroundColor = Color.Red
            )
        }
        Row(modifier = Modifier.weight(1.0f, true)) {
            Box (
                modifier = Modifier.fillMaxWidth().fillMaxHeight(),
                backgroundColor = Color.Blue,
                gravity = ContentGravity.Center
            ) {
                Text(text = "A sample text")
            }
        }
        Row(modifier = Modifier.weight(2.0f, true)) {
            Box (
                modifier = Modifier.fillMaxWidth().fillMaxHeight(),
                backgroundColor = Color.Yellow
            )
        }
    }
ztyzrc3y

ztyzrc3y3#

Jetpack Compose的“0.1.0-dev 04”版本包含更改,并且FlexRow已被弃用。我可以建议以下解决方案:

Row {
    Card(modifier = LayoutFlexible(1f), color = Color.Red) {
        Container(expanded = true, height = 50.dp) {

        }
    }
    Card(modifier = LayoutFlexible(2f), color = Color.Green) {
        Container(expanded = true, height = 50.dp) {

        }
    }
}

结果:x1c 0d1x

**LayoutFlexible(flex = _f)**可帮助我们解决该问题,并且修饰符可应用于任何容器。

bt1cpqcv

bt1cpqcv4#

在容器中的对象上使用Modifier.weight(float)。您也可以使用constraintlayout或低级Layout Composable。请查看compose路径中的官方compose layout codelab以获得更多关于相同的信息

xdyibdwo

xdyibdwo5#

构成将状态转换为UI元素。
元件的组成元件的布局元件的绘制
标准布局组件

@Composable
fun ArtistCard() {
    Column {
        Text("Alfred Sisley")
        Text("3 minutes ago")
    }
}

类似地,使用行可以在屏幕上水平放置项目。列和行都支持配置它们所包含元素的对齐方式。

@Composable
    fun ArtistCard(artist: Artist) {
        Row(verticalAlignment = Alignment.CenterVertically) {
            Image(/*...*/)
            Column {
                Text(artist.name)
                Text(artist.lastSeenOnline)
            }
        }
    }

使用Box可将元素置于另一个元素之上。Box还支持配置其所包含元素的特定对齐方式。

@Composable
fun ArtistAvatar(artist: Artist) {
    Box {
        Image(/*...*/)
        Icon(/*...*/)
    }
}
svujldwt

svujldwt6#

Row() {
    OutlinedTextField(
        modifier = modifier.weight(1f).clickable {

        },
        value = formatDate(date) ?: "",
        onValueChange = {  },
        label = { Text("Date") },
        singleLine = true,
        readOnly = true
    )

    Spacer(modifier = Modifier.padding(4.dp))

    OutlinedTextField(
        modifier = modifier.weight(1f),
        value = formatTime(date) ?: "",
        onValueChange = {  },
        label = { Text("Time") },
        singleLine = true
    )
}

相关问题