jetpack-compose做一个倒计时效果

效果:

 

废话不说,直接上代码吧:

1、声明一个倒计时的UI。说实话,声明式UI真的很好, 可以实时预览效果,还便于单元测试。

@Composable
fun Clock(count: Int) {
    val arc = 1.7f
    val inter = 0.3f
    val num = 360/2
    
    Canvas(modifier = Modifier
        .size(200.dp)
    ) {
        for(i in 0 until num) {
            drawArc(Color.LightGray, -90+i*(arc+inter), arc, true)
        }
    }

    Canvas(modifier = Modifier
        .size(200.dp)
    ) {
        for(i in 0 until count) {
            drawArc(Brush.horizontalGradient(listOf(Color.Yellow, Color.Green)), -90+i*(arc+inter), arc, true)
        }
    }

    Canvas(modifier = Modifier.size(200.dp)) {
        drawCircle(Color.White, radius = 250f)
    }

    Canvas(modifier = Modifier
        .size(200.dp)
    ) {
        drawArc(Color.Red, -90+count*2f-2f, 1.7f, true)
    }
}

@Preview
@Composable
fun ClockPreview() {
    Clock(8)
}

2、让它动起来。简单起见直接用线程了。。。

@Composable
fun AnimClock() {
    var count by remember{mutableStateOf(360/2)}
    Clock(count = count)
    thread {
        Thread.sleep(100)
        count--
        if (count <= 0) count = 360/2
    }
}

Jetpack Compose 中,如果你想使用 `LazyColumn` 创建一个类似宫格式的网格列表,可以结合 `Grid` 或者 `Row` 控件以及 `RecyclerGridState`。下面是一个基本的示例,展示如何将项目分组到网格格子中: ```kotlin import androidx.compose.foundation.layout.Arrangement.RowMajor import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Grid import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.material.Button import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp @Composable fun GridListWithColumns(groups: List<List<String>>) { LazyColumn { items(groups) { group -> Grid( columns = 3, spacing = 8.dp, contentPadding = PaddingValues(vertical = 8.dp), modifier = Modifier.fillMaxWidth(), arrangement = Arrangement.RowMajor ) { group.forEachIndexed { index, item -> if (index % 3 == 2) { Spacer(modifier = Modifier.size(0.dp)) } else { Button(onClick = { /* Your click action here */ }) { Text(text = item, style = MaterialTheme.typography.body2) } } } } } } } // 使用时传递数据 val data = listOf( listOf("Group 1 Item 1", "Group 1 Item 2", "Group 1 Item 3"), listOf("Group 2 Item 1", "Group 2 Item 2", "Group 2 Item 3"), // 更多数据... ) GridListWithColumns(data) ``` 这个例子中,我们创建了一个懒加载列,每行显示三个元素,当到达网格的最后一行时,会插入一个空隙。每个项目的点击动作可以根据实际需求来实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值