当前位置: 代码网 > it编程>App开发>Android > Android Compose学习之绘制速度表盘

Android Compose学习之绘制速度表盘

2024年05月19日 Android 我要评论
内心想法xxcompose已经发布好久了,还没有用过compose写过ui,之前只是在官网上了解过,看着这可组合函数嵌套,我就脑袋大,更flutter一个德行,我的内心是抵触的,还是觉得用xml写香,

内心想法xx

compose已经发布好久了,还没有用过compose写过ui,之前只是在官网上了解过,看着这可组合函数嵌套,我就脑袋大,更flutter一个德行,我的内心是抵触的,还是觉得用xml写香,抱着试一试的心态,打算用compose应用于实际项目中。(还是得多接触,多学习,真的是很香yyds)

无图无真相

上图,测试:通过滑动slider也是安卓称progressbar来改变速度

代码部分

@composable
    fun speedcontent(){
    	//添加数字动画,避免速度变化过于突兀
        var mytargetvalue by remember { mutablestateof(0) }
        val progressint: int by animateintasstate(targetvalue = mytargetvalue)
        column(modifier = modifier
            .background(color = color.white)
            .fillmaxsize(),
            verticalarrangement = arrangement.bottom,
            horizontalalignment = alignment.centerhorizontally) {
            slider(value = mytargetvalue.tofloat(),
                onvaluechange = {
                    mytargetvalue = it.toint() },
                modifier = modifier.fillmaxwidth(),
                valuerange = 0f..180f)
            speedermeter(progressint)
        }
    }

具体实现

@optin(experimentaltextapi::class)
@composable
fun speedermeter(speednum: int,modifier: modifier = modifier
    .width(220.dp)
    .height(120.dp)
    .background(color = color.white)){
    val centerpointcolor = color.blue
    val colorcenterpoint1 = color(0xff000000)
    val colorcenterpoint2 = color(0xffee3e07)
    val mersure = remembertextmeasurer()
    fun getpointx(centerx:float,angle:int,circlerdius:float,step:int):float{
        val angles = (angle*step).todouble()
        val angle = math.toradians(angles)
        return centerx - cos(angle).tofloat()*(circlerdius)
    }

    fun getpointy(centery:float,angle:int,circlerdius:float,step:int):float{
        val angles = (angle*step).todouble()
        val angle = math.toradians(angles)
        return centery- sin(angle).tofloat()*(circlerdius)
    }
    val myunit = "km/h"
    val speedtextlist = array(7){(it*20).tostring()}
    box(modifier,
        contentalignment = alignment.bottomcenter
    ) {
        canvas(modifier, ondraw = {
            val centerx = size.width/2
            val bottomy = size.height-50
            val mycolorstops = arrayof(0.0f to color.white,1.0f to color.black)
            //画指针底座
            drawcircle(
                brush = brush.radialgradient(colorstops = mycolorstops),
                radius = 30f,
                center = offset(centerx,bottomy+15.dp.value),
            )
            drawcircle(
                color = color.white,
                radius = 23f,
                center = offset(centerx,bottomy+15.dp.value)
            )
            drawcircle(
                color = color.red,
                radius = 20f,
                center = offset(centerx,bottomy+15.dp.value)
            )
            //画单位
            drawtext(
                textmeasurer = mersure,
                text = myunit,
                style = textstyle(color = color.black, fontsize = 12.sp, fontweight = fontweight(20), fontfamily = fontfamily.serif),
                topleft = offset(centerx-50.dp.value,bottomy-90)
            )
            //画刻度
            repeat(61){
                val fontweights = if( it%5==0){
                    if(it%10==0){
                        7f
                    }else{
                        4f
                    }
                }else{
                    2f
                }
                val lengths = if(it%5==0){
                    if(it%10==0){
                        25
                    }else{
                       22
                    }
                }else{
                    20
                }
                drawline(
                    color = color.black,
                    start = offset(
                        getpointx(centerx,it,bottomy,3),
                        getpointy(centerx,it,bottomy,3)
                    ),
                    end = offset(
                        getpointx(centerx,it,bottomy-lengths,3),
                        getpointy(centerx,it,bottomy-lengths,3)
                    ),
                    strokewidth = fontweights,
                    cap = strokecap.round
                )
            }
            //画数字
            repeat(speedtextlist.size){
                val mytopleft = offset(
                    getpointx(centerx,it,bottomy-70,30)-25.dp.value,
                    getpointy(bottomy,it,bottomy-70,30))
                val colortype = if(it > 4){
                    color.red
                }else{
                    color.black
                }
                drawtext(
                    textmeasurer = mersure,
                    text = speedtextlist[it],
                    topleft =mytopleft,
                    style = textstyle(colortype, fontsize = 11.sp, fontfamily = fontfamily.serif)
                )
            }
            //画指针
            drawline(
                color = color.red,
                start = offset(
                    getpointx(centerx,speednum,bottomy-30,1),
                    getpointy(centerx,speednum,bottomy-30,1)
                ),
                end = offset(
                    getpointx(centerx,speednum,0f,1),
                    getpointy(centerx,speednum,0f,1)
                ),
                strokewidth = 15f,
                cap = strokecap.round

            )
        })


    }

}

compose还是蛮香的,用了就回不去了<捂脸>,只是这个代码的可读性没有java的好。

到此这篇关于android compose学习之绘制速度表盘的文章就介绍到这了,更多相关compose绘制速度表盘内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com