如何在JetPack上绘制屏幕
#编程 #kotlin #android #jetpackcompose

Jetpack Compose是创建本机Android屏幕的非常强大的工具。

尽管该工具的想法是促进屏幕的实现,但如果我们不了解每个组件的目的,那将不是一个艰巨的任务!

考虑这些细节,让我们了解我们应该如何考虑创建屏幕的那一刻。

实施样本

作为演示,让我们使用以下屏幕:

Preview de um card com bordas arredondas, imagem no topo preenchendo toda a largura do card, abaixo em layout de coluna, contém o título, subtítulo, ícone de favorito e botão com mensagem 'ler agora'. ícone de favorito e botão estão em layout de linha, sendo que o ícone está na extrema esquerda e botão na extrema direita

现在我们知道了屏幕,我们需要在开始实施之前了解广泛的分析。

识别视觉元素

作为第一步,我们可以通过识别视觉元素来开始分析。以某种方式,我们有:

  • 封面图像
  • texto de título
  • texto de subtítulo
  • 迷,
  • 阅读botan

分析屏幕布局

入口,我们需要分析一般布局。请注意,所有元素均在列中组织,并且存在和植物体排列!

仅通过此分析,我们可以用composable de layout实现屏幕的第一个屏幕:

Column {
    AsyncImage(
        "https://picsum.photos/1920/1080",
        contentDescription = "Imagem de capa"
    )
    Text(text = "Título")
    Text(text = "Subtitulo")
    Row {
        Icon(
            Icons.Outlined.FavoriteBorder,
            contentDescription = "ícone de favorito"
        )
        Button(onClick = { /*TODO*/ }) {
            Text(text = "Ler agora")
        }
    }
}

App em execução apresentando a tela com imagem, título, subtítulo, ícone e botão no layout de coluna. Ícone e botão no layout em linha

尽管设计并不忠实于样本,但我们需要遵循下一步的一切,请自定义屏幕的组件。

与网络上的前端进行类比,我们基本上添加了HTML以构建Padgina!

使用修饰符自定义屏幕

就像构造屏幕的组合一样,我们将Modifier作为自定义的负责任实体,提供行为并对合并事件做出反应。因此,我们将使用它来修改Composable

按照前端的类比,Modifier将是JetPack组成的CSS。

调整主容器

我们可以从任何组件开始个性化,但通常遵循策略,从最内部的最外部组件开始,所以让我们从Column开始更多外部:

Column(
    Modifier
        .padding(8.dp)
        .fillMaxWidth()
        .border(
            0.5.dp,
            Color.Gray.copy(alpha = 0.5f),
            RoundedCornerShape(20.dp)
        )
) {
    ...
}

App em execução apresentado o card com espaçamento entre as extremidades da tela e bordas arredondadas

所有合并都以第一个可选的parano a Modifier接收,因为有Modifier模式。有关更多详细信息,您可以verificar nesta thread sobre modificadores.

请注意,现在我们有一个代表卡的容器的亮点,显示一个空间和圆形的边缘。

个性化封面图像

尽管对卡容器进行了正确调整,但图像仍然具有正方形外观并超过主容器的四肢,为了解决此问题,我们也可以将修饰符应用于图像:

Column(
    ...
) {
    AsyncImage(
        "https://picsum.photos/1920/1080",
        contentDescription = "Imagem de capa",
        Modifier
            .height(100.dp)
            .clip(
                RoundedCornerShape(
                    topStart = 20.dp,
                    topEnd = 20.dp
                )
            ),
        contentScale = ContentScale.Crop,
        placeholder = ColorPainter(Color.Gray)
    )
    ...
}

Card e imagem de capa com as bordas arredondadas

请注意,修饰符,我使用了一些允许的AsyncImage

  • contentScale:图像容器将具有固定高度,在标准刻度上,它在尝试显示图像的每个容器时会变形。用ContentScale.Crop施加切割,它显示了在一次性空间中剪切的图像。
  • placeholder:礼物包含在预览中,并在通过互联网加载图像时,在这种情况下为灰色背景

现在已经调整了封面图像,让我们转到文本。

修改文本

我们可以按以下方式修改文本:

Column(
    ...
) {
    ...
    Text(
        text = "Título",
        Modifier.padding(
            start = 16.dp,
            top = 16.dp,
            end = 16.dp,
            bottom = 8.dp
        ),
        fontSize = 24.sp
    )
    Text(
        text = "Subtitulo",
        Modifier.padding(
            start = 16.dp,
            end = 16.dp,
            bottom = 16.dp
        ),
        fontSize =
        14.sp
    )
    ...
}

}

Card aplicando espaçamento e tamanho de fonte no título e subtitulo

即使文本按预期进行了修改,也值得注意的是,我们必须应用几个。

在这样的情况下,我们可以使用布局组成来简化实现,例如涉及列Texts并修改列空间并调整垂直布置:

Column(
    ...
) {
    ...
    Column(
        Modifier.padding(16.dp),
        verticalArrangement = Arrangement.spacedBy(8.dp)
    ) {
        Text(
            text = "Título",
            fontSize = 24.sp
        )
        Text(
            text = "Subtitulo",
            fontSize = 14.sp
        )
    }
    ...
}

RowColumn都有额外的帕拉诺来操纵他们的孩子,也就是说,由他们组织的组合。

通过此调整,我们的结果与以前相同!简单,您同意吗?最后,我们只需要调整最后一行。

调整排队的和植物

行调整与我们在上一列中所做的非常相似:

Column(
    ...
) {
    ...
    Row(
        Modifier
            .padding(16.dp)
            .fillMaxWidth(),
        horizontalArrangement = Arrangement.SpaceBetween,
        verticalAlignment = Alignment.CenterVertically
    ) {
        Icon(
            Icons.Outlined.FavoriteBorder,
            contentDescription = "ícone de favorito"
        )
        Button(onClick = { /*TODO*/ }) {
            Text(text = "Ler agora")
        }
    }
}

Card com o ícone de favorito e botão para ler em linha alinhados nas extremidades da tela, sendo o ícone a esquerda e botão direito na direita. Também, com espaçamento aplicado

最大的区别在于宽度与布置和对齐的fillMaxWidth()的应用。

使用此技术,以便可以应用Arrangement.SpaceBetween,该Arrangement.SpaceBetween在四肢组织(已经对齐)的孩子垂直集中了孩子。

包括£o

首先,在编写喷气背包中的屏幕的实现似乎很复杂,我们已经看到我们可以应用一些吨来促进代码的写作。

考虑我们所看到的,我们有:

  • 识别视觉元素
  • 肛门做布局
  • 在每个组件中应用修饰符
  • 修改顺序以促进

您如何看待在Jetpack撰写上创建屏幕?您已经使用这些联系或有其他技巧来促进实施?