当前位置: 首页 > 知识库问答 >
问题:

Jetpack组合-修饰符顺序

谢华彩
2023-03-14

文档说修饰符是从左侧应用的。但从这个例子来看,它们看起来像是从右边应用的:首先是边框,然后是填充,因为文本和边框之间没有空格

Text("Hi there!", Modifier.padding(10.dp).border(2.dp, Color.Magenta))

共有3个答案

雷逸仙
2023-03-14

在这种情况下,第一个填充就像元素的边距。

比较一下这些组件,你就会发现不同之处。

@Composable
fun Example() {
    // Default
    Box(modifier = Modifier.background(Color.Cyan), alignment = Alignment.Center){
        Text("Hi there!", Modifier.border(2.dp, Color.Magenta))
    }
    Divider()
    // 10dp margin
    Box(modifier = Modifier.background(Color.Cyan), alignment = Alignment.Center){
        Text("Hi there!", Modifier.padding(10.dp).border(2.dp, Color.Magenta))
    }
    Divider()
    // 10dp margin and 10dp padding
    Box(modifier = Modifier.background(Color.Cyan), alignment = Alignment.Center){
        Text("Hi there!", Modifier.padding(10.dp).border(2.dp, Color.Magenta).padding(10.dp))
    }
}
伯丁雷
2023-03-14
  • 在Android Compose中,生成的图像是从外层向中心的Composable构建的。这意味着第一个定义的绿色边框是外边框,最后一个定义的红色边框是内边框。这非常令人困惑,因为代码中最接近Text Composable的绿色修饰符在结果中离它最远。
  • 这与SwiftUI形成鲜明对比,其中修饰符在代码和生成图像中以相同的顺序出现。最接近代码中的Composable的修饰符在生成图像中也最接近它。
  • 如果您想想象生成的图像是从Composable定位的中心构建的(如在SwiftUI中),那么修饰符将以与给出它们的顺序相反的顺序应用(从底部向上)。
  • 因此,如果您有带有两个边框修饰符的Text Composable
    • 距离代码中可组合文本最远的边框修饰符(底部的红色)
    • 将最接近结果图像中的文本可组合
    • 将 .border(2.dp, Color.Green) 应用于最外层
    • 向内应用 .padding(50.dp)
    • 将 .border(2.dp, Color.Red) 应用于最里面的图层
    package com.example.myapplication
    
    import android.os.Bundle
    import androidx.appcompat.app.AppCompatActivity
    import androidx.compose.foundation.*
    import androidx.compose.foundation.layout.padding
    import androidx.compose.ui.Modifier
    import androidx.compose.ui.graphics.Color
    import androidx.compose.ui.platform.setContent
    import androidx.compose.ui.unit.dp
    
    class MainActivity : AppCompatActivity() {
      override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
          Text("Hi there!",
            Modifier
              .border(2.dp, Color.Green)
              .padding(50.dp)
              .border(2.dp, Color.Red)
          )
        }
      }
    }
    

    https://imgs.xnip.cn/cj/n/7/6f4fd58a-e0d9-4571-921e-26c69ad0e503.png" width="100%" height="100%" />

万俟心思
2023-03-14

Jetpack Compose codelab中有布局,在引擎盖步骤下包含布局修改器,解释修改器顺序,请参阅“顺序事项”部分。

当修饰符应用于它们从早修改到晚修改的可组合时,链接修饰符很重要,这意味着左侧修饰符的测量和布局将影响右侧的修饰符。可组合的最终大小取决于作为参数传递的所有修饰符。首先,修饰符将从左到右更新约束,然后从右到左返回大小。

为了更好地理解它,我建议弄清楚布局在Compose中是如何工作的。简而言之,padding()是一个LayoutModifer,它接受一些约束,根据这些约束的投影来测量它的孩子的大小,并将孩子放在某个坐标上。

让我们看一个例子:

Box(
  modifier = Modifier
    .border(1.dp, Color.Red)
    .size(32.dp)
    .padding(8.dp)
    .border(1.dp, Color.Blue)
)

结果是:

但是让我们交换<代码>。size()和< code >。padding()

Box(
  modifier = Modifier
    .border(1.dp, Color.Red)
    .padding(8.dp)
    .size(32.dp)
    .border(1.dp, Color.Blue)
)

现在我们有了不同的结果:

我希望这个例子能帮助你理解修饰符是如何应用的。

可以预期红色边框应该是最接近框的,因为它是先添加的,所以顺序可能看起来颠倒了,但这样的顺序也有好处。让我们看看这个可组合的:

@Composable
fun MyFancyButton(modifier: Modifier = Modifier) {
  Text(
    text = "Ok",
    modifier = modifier
      .clickable(onClick = { /*do something*/ })
      .background(Color.Blue, RoundedCornerShape(4.dp))
      .padding(8.dp)
  )
}

只需将修饰符移动到参数中,可组合性就允许其父级添加额外的修饰符,例如额外的边距。因为最后添加的修改器最靠近按钮,所以边框和内部填充不会受到影响。

 类似资料:
  • private private修饰符是我们使用的最限制的修饰符。它表示它只能被自己所在的文件可见。所以如果我们给一个类声明为private,我们就不能在定义这个类之外的文件中使用它。 另一方面,如果我们在一个类里面使用了private修饰符,那访问权限就被限制在这个类里面了。甚至是继承这个类的子类也不能使用它。 所以一等公民,类、对象、接口……(也就是包成员)如果被定义为private,那么它们只

  • 主要内容:VB.Net修饰符列表修饰符是添加了任何编程元素的关键字,以特别强调编程元素在程序中的行为或将被访问 例如,访问修饰符:, , , , 等指示编程元素的访问级别,如:变量,常量,枚举或类。 VB.Net修饰符列表 下表提供了VB.Net修饰符的完整列表: 编号 修饰符 描述 1 指定Visual Basic应将所有字符串封送到美国国家标准学会(ANSI)值,而不管正在声明的外部过程的名称如何。 2 指定源文件开始处的属

  • .lazy 在默认情况下,v-model在每次input事件触发后将输入框的值与数据进行同步 (除了上述输入法组合文字时)。你可以添加lazy修饰符,从而转变为使用change事件进行同步: <!-- 在“change”时而非“input”时更新 --> <input v-model.lazy="msg" > .number 如果想自动将用户的输入值转为数值类型,可以给v-model添加num

  • 修饰符是添加了任何编程元素的关键字,以特别强调编程元素在程序中的行为或将被访问的方式。 例如,访问修饰符:Public,Private,Protected,Friend,Protected Friend等,表示编程元素的访问级别,如变量,常量,枚举或类。 VB.Net中的可用修饰符列表 下表提供了VB.Net修饰符的完整列表 - Sr.No 修改 描述 1 Ansi 指定Visual Basic应

  • Java修饰符的合理顺序是什么? null 我把建议的字眼改为合理的字眼,是为了平息有关命令是否建议的讨论。

  • 主要内容:final 修饰变量,final修饰方法,final修饰类,final 修饰符使用总结final 在 Java 中的意思是最终,也可以称为完结器,表示对象是最终形态的,不可改变的意思。final 应用于类、方法和变量时意义是不同的,但本质是一样的,都表示不可改变,类似 C# 里的 sealed 关键字。 使用 final 关键字声明类、变量和方法需要注意以下几点: final 用在变量的前面表示变量的值不可以改变,此时该变量可以被称为常量。 final 用在方法的前面表示方法不可以