Android Jetpack Compose学习(二)—— Jetpack compose基础布局

在没有推出Jetpack Compose时我们开发Android UI一般使用的布局都是LinearLayout, FrameLayout, RelativeLayout, ConstraintLayout等,在Jetpack Compose推出后,开发布局的方式有了很大的改变。

Jetpack Compose标准布局组件

在许多情况下,我们只需要使用ColumnRow即可完成布局,Column可将多个项目垂直放置在屏幕上,Row则可以将多个项目纵向放置在屏幕上,下面举例说明:

Column

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.Column
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.sp

class TestActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            ColumnTest()
        }
    }

    @Preview
    @Composable
    fun ColumnTest() {
        Column {
            Text("Hello world", fontSize = 30.sp)
            Text("Jetpack compose", fontSize = 30.sp)
        }
    }
}

以上代码在模拟器上运行效果如下图:

在这里插入图片描述
上面的代码中需要注意如下几点:

  1. Compose函数不同于普通的函数,它需要使用大写字母开头,和普通函数做区分。
  2. Compose函数需要使用@Composable注解修饰,表示这是一个可组合函数。
  3. 使用Column可以创建一个垂直布局,该布局中的所有项目都是垂直排列的。
  4. @Preview表示该函数可以在Android Studio中预览,需要注意的是,使用@Preview预览某个组合函数,该函数不能有参数,否则预览会失败,一种解决方法是你重新写一个不带参数的组合函数,然后在其中调用这个带参数的组合函数并传递一个默认值,使用@Preview在Android Studio中预览可组合函数的效果如下图:

在这里插入图片描述
5. 如果希望Column中的元素都能水平居中,可以给Column设置一个horizontalAlignment参数,如下代码:

Column(horizontalAlignment = Alignment.CenterHorizontally) {
    Text("hello world")
    Text("Jetpack compose")
}

Row

下面的代码展示了Row的用法:

import android.os.Bundle
import androidx.activity.compose.setContent
import androidx.appcompat.app.AppCompatActivity
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp

class TestActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            RowTest()
        }
    }

    @Preview
    @Composable
    fun RowTest() {
        Row(
            verticalAlignment = Alignment.CenterVertically
        ) {
            Image(
                painter = painterResource(id = R.drawable.ic_launcher_background),
                modifier = Modifier.size(50.dp).clip(CircleShape),
                contentDescription = null
            )
            Text("Hello world", fontSize = 30.sp)
        }
    }
}

这段代码在Android Studio中预览的效果如下图:

在这里插入图片描述
下面对以上代码做如下解释:

  1. Row定义了一个水平布局,其中的项目都是水平排列的,使用verticalAlignment = Alignment.CenterVertically让其中的所有项目都在垂直方向上居中排列。
  2. 使用Image加载并显示图片,其中modifier = Modifier.size(50.dp).clip(CircleShape)指定了图片大小为50dp且裁剪为圆形。
  3. Text传入fontSize参数可以设置字体大小。

Box

Box类似于Android中的ViewGroup,它是一个视图容器,可以在其中装载其他的组件,用法如下:

    @Preview
    @Composable
    fun RowTest() {
        Box(
            modifier = Modifier
                .background(Color.Blue)
                .size(200.dp),
            contentAlignment = Alignment.Center
        ) {
            Text("Hello world")
        }
    }

预览效果如下图:
在这里插入图片描述

滚动布局

下面的代码实现了一个普通的滚动列表:

    @Preview
    @Composable
    fun ScrollList() {
        Column(Modifier.verticalScroll(rememberScrollState())) {
            for (i in 0..20) {
                ListItem(i)
            }
        }
    }

    @Composable
    fun ListItem(index: Int) {
        val color = if (index % 2 == 0) Color(0xFFFFFFFF) else Color(0xFFCCCCCC)
        Column(
            Modifier
                .fillMaxWidth()
                .height(50.dp),
        ) {
            Box(
                modifier = Modifier
                    .weight(1f)
                    .fillMaxWidth()
                    .background(color)
                    .padding(15.dp, 0.dp, 15.dp, 0.dp),
                contentAlignment = Alignment.CenterStart
            ) {
                Text("List Item $index", fontSize = 16.sp, color = Color.Red)
            }
            Divider(Modifier.height(0.6.dp).background(Color(0xFFDCDCDC)))
        }
    }

下面对以上代码做如下解释:

  1. Column设置一个Modifier.verticalScroll(rememberScrollState())即可让其中的组件滚动(但这种滚动有性能问题,不在屏幕内的Item也不会回收,官方建议使用LazyColumn)
  2. ListItem()函数用于创建列表中的一个项,其中使用Column创建了一个垂直布局,里面包含一个Box和一个DividerBox中的modifier指定了weight(1f)表示Box在垂直方向上比重为1,即除了Divider占用的空间,其余部分都为Box,另外Box还设置了contentAlignment=Alignment.CenterStart让里面的Text在垂直方向上居中

以上代码在Android Studio预览效果如下图:
在这里插入图片描述
由于直接在Column中重复创建多个相同的项目,再使用Modifier.verticalScroll(rememberScrollState())Column可滚动这种方式有性能问题,无法自动回收屏幕范围以外的控件,所以官方并不推荐使用上面的方法创建滚动列表,而是使用LazyColumn或者LazyRow来分别创建垂直或水平滚动的列表,关于LazyColumnLazyRow的用法将在后面的博文中说明。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yubo_725

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值