Android Compose學(xué)習(xí)之繪制速度表盤(pán)
內(nèi)心想法XX
compose已經(jīng)發(fā)布好久了,還沒(méi)有用過(guò)compose寫(xiě)過(guò)UI,之前只是在官網(wǎng)上了解過(guò),看著這可組合函數(shù)嵌套,我就腦袋大,更Flutter一個(gè)德行,我的內(nèi)心是抵觸的,還是覺(jué)得用XML寫(xiě)香,抱著試一試的心態(tài),打算用compose應(yīng)用于實(shí)際項(xiàng)目中。(還是得多接觸,多學(xué)習(xí),真的是很香YYDS)
無(wú)圖無(wú)真相
上圖,測(cè)試:通過(guò)滑動(dòng)slider也是安卓稱(chēng)ProgressBar來(lái)改變速度
代碼部分
@Composable fun SpeedContent(){ //添加數(shù)字動(dòng)畫(huà),避免速度變化過(guò)于突兀 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) } }
具體實(shí)現(xiàn)
@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) //畫(huà)指針底座 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) ) //畫(huà)單位 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) ) //畫(huà)刻度 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 ) } //畫(huà)數(shù)字 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) ) } //畫(huà)指針 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還是蠻香的,用了就回不去了<捂臉>,只是這個(gè)代碼的可讀性沒(méi)有Java的好。
到此這篇關(guān)于Android Compose學(xué)習(xí)之繪制速度表盤(pán)的文章就介紹到這了,更多相關(guān)Compose繪制速度表盤(pán)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android使用ContentProvider實(shí)現(xiàn)查看系統(tǒng)短信功能
這篇文章主要為大家詳細(xì)介紹了Android使用ContentProvider實(shí)現(xiàn)查看系統(tǒng)短信功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11Android自定義View仿支付寶芝麻信用分儀表盤(pán)
前幾天支付寶剛剛升級(jí)到v9.9,看了一眼里面的芝麻信用分,儀表盤(pán)挺好看的,所以想著來(lái)寫(xiě)一個(gè)這個(gè)版本的儀表盤(pán),不說(shuō)完全一模一樣,只是為了猜測(cè)支付寶在做這個(gè)的時(shí)候是如何設(shè)計(jì)的,在此記錄一下,有需要的可以參考借鑒。2016-09-09Android手勢(shì)密碼的實(shí)現(xiàn)
這篇文章主要介紹了Android手勢(shì)密碼的實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2016-04-04Android調(diào)用前后攝像頭同時(shí)工作實(shí)例代碼
本篇文章主要介紹了Android調(diào)用前后攝像頭同時(shí)工作實(shí)例代碼,這里整理了詳細(xì)的代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-07-07Android 斷點(diǎn)續(xù)傳原理以及實(shí)現(xiàn)
這篇文章主要介紹了Android 斷點(diǎn)續(xù)傳原理以及實(shí)現(xiàn)的相關(guān)資料,這里對(duì)斷點(diǎn)續(xù)傳原理進(jìn)行了詳細(xì)介紹,需要的朋友可以參考下2016-12-12基于RxJava2實(shí)現(xiàn)的簡(jiǎn)單圖片爬蟲(chóng)的方法
本篇文章主要介紹了基于RxJava2實(shí)現(xiàn)的簡(jiǎn)單圖片爬蟲(chóng)的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-02-02Ubuntu中為Android實(shí)現(xiàn)Application Frameworks層增加硬件訪問(wèn)服務(wù)
本文主要介紹Android實(shí)現(xiàn) Application Frameworks層增加硬件訪問(wèn)服務(wù),這里對(duì)實(shí)現(xiàn)增加硬件訪問(wèn)服務(wù)的功能做出了詳細(xì)的工作流程,并提供示例代碼,有需要的小伙伴參考下2016-08-08activity 獲取rootView 設(shè)置backGroundColor的方法
下面小編就為大家?guī)?lái)一篇activity 獲取rootView 設(shè)置backGroundColor的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04基于Android實(shí)現(xiàn)可滾動(dòng)的環(huán)形菜單效果
這篇文章主要為大家詳細(xì)介紹了Android如何使用kotlin實(shí)現(xiàn)可滾動(dòng)的環(huán)形菜單,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03