溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Jetpack?Compose怎么實(shí)現(xiàn)對(duì)話框和進(jìn)度條

發(fā)布時(shí)間:2023-04-17 10:56:49 來(lái)源:億速云 閱讀:96 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“Jetpack Compose怎么實(shí)現(xiàn)對(duì)話框和進(jìn)度條”,在日常操作中,相信很多人在Jetpack Compose怎么實(shí)現(xiàn)對(duì)話框和進(jìn)度條問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Jetpack Compose怎么實(shí)現(xiàn)對(duì)話框和進(jìn)度條”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

概述

對(duì)話框和進(jìn)度條其實(shí)并無(wú)多大聯(lián)系,放在一起寫是因?yàn)閮烧叩膬?nèi)容都不多,所以湊到一起,對(duì)話框是我們平時(shí)開發(fā)使用得比較多的組件,像隱私授權(quán),用戶點(diǎn)擊刪除時(shí)給用戶提示這是一個(gè)危險(xiǎn)操作等,進(jìn)度條的使用頻率也很高,比如下載文件,上傳文件,處理任務(wù)時(shí)都可以使用進(jìn)度條,讓用戶知道系統(tǒng)還在運(yùn)行,沒有死機(jī)。

實(shí)例解析

1.對(duì)話框Dialog

首先我們可以先看下Compose中對(duì)話框的參數(shù)列表

@Composable
fun Dialog(
    onDismissRequest: () -> Unit, // 當(dāng)我們打算關(guān)閉對(duì)話框時(shí)會(huì)執(zhí)行
    properties: DialogProperties = DialogProperties(), // 對(duì)話框的屬性,用于自定義
    content: @Composable () -> Unit // 對(duì)話框的內(nèi)容
)

從對(duì)話框組件的參數(shù)列表來(lái)看,參數(shù)不多,只有三個(gè),但是實(shí)現(xiàn)的內(nèi)容卻不輸傳統(tǒng)的view,其中content參數(shù)允許我們通過傳入自己的Composable組件來(lái)描述對(duì)話框的界面,例如,我們想實(shí)現(xiàn)對(duì)話框Dialog的寬度不受限制,達(dá)到全屏的效果,代碼如下:

 @OptIn(ExperimentalComposeUiApi::class)
    @Composable
    fun FullDialog() {
        Dialog(
            onDismissRequest = { /*TODO*/ },
            properties = DialogProperties(usePlatformDefaultWidth = false)
        ) {
            Surface(modifier = Modifier.fillMaxSize(), color = Color.Gray) {
                Text(text = "Hello World")
            }
        }
    }

properties 參數(shù)用于定制一些對(duì)話框特有的行為:

@Immutable
class DialogProperties @ExperimentalComposeUiApi constructor(
    val dismissOnBackPress: Boolean = true, // 是否可以在按下系統(tǒng)返回鍵的時(shí)候取消對(duì)話框
    val dismissOnClickOutside: Boolean = true,// 是否可以點(diǎn)擊對(duì)話框以外的區(qū)域取消對(duì)話框
    val securePolicy: SecureFlagPolicy = SecureFlagPolicy.Inherit,
    @Suppress("EXPERIMENTAL_ANNOTATION_ON_WRONG_TARGET")
    @get:ExperimentalComposeUiApi
    val usePlatformDefaultWidth: Boolean = true // 對(duì)話框的內(nèi)容是否需要限制在平臺(tái)默認(rèn)的范圍之內(nèi)
)

需要注意的是,Compose的對(duì)話框不像傳統(tǒng)視圖的對(duì)話框那樣,可以通過show(),dismiss()等命令的方式顯示或者隱藏,它像不同的Compose組件一樣,顯示與否需要看是否在重組中被執(zhí)行,也就是說在Comopose中對(duì)話框的顯示或者隱藏要看狀態(tài)的控制,Dialog和普通組件的不同之處在于對(duì)話框底層需要依賴獨(dú)立的Window顯示

下面我們看下如何使用狀態(tài)控制對(duì)話框的顯示和隱藏:

 @Composable
    fun DialogDemo(){
        val openDialog = remember {
            mutableStateOf(true)
        }
        val dialogWidth = 200.dp
        val dialogHeight = 50.dp
        if(openDialog.value){
            Dialog(onDismissRequest = { openDialog.value = false }) {
                Box(modifier = Modifier
                    .size(dialogWidth, dialogHeight)
                    .background(Color.White)){
                    Text(text = "Hello World")
                }
            }
        }
    }

運(yùn)行結(jié)果如下:

Jetpack?Compose怎么實(shí)現(xiàn)對(duì)話框和進(jìn)度條

在Dialog組件顯示的過程中,當(dāng)點(diǎn)擊對(duì)話框以外的區(qū)域時(shí),onDismissRequest會(huì)觸發(fā)執(zhí)行,修改openDialog狀態(tài)為false,從而觸發(fā)DialogDemo重組,此時(shí)判斷openDialog為false,Dialog無(wú)法被執(zhí)行,對(duì)話框消失。

我們接下來(lái)再看下一個(gè)警告對(duì)話框應(yīng)該怎么做,警告對(duì)話框(Alertdialog)組件是比Dialog組件更高級(jí)別的封裝,遵循Material Design設(shè)計(jì)標(biāo)準(zhǔn)。它幫我們定好了標(biāo)題,內(nèi)容文本以及按鈕的位置,我們只需要提供相應(yīng)的內(nèi)容即可,下面演示如何使用AlertDialog

    @Composable
    fun AlertDialogDemo()
    {
        val openDialog = remember {
            mutableStateOf(true)
        }
        if(openDialog.value){
            AlertDialog(onDismissRequest = { openDialog.value = false },
            title = {
                Text(text = "開啟位置服務(wù)")
            }, text = {
                Text(text = "這將意味著我們會(huì)給您提供精確的位置信息")
                },
            confirmButton = {
                TextButton(onClick = { openDialog.value = false}) {
                    Text(text = "同意")
                }
            },
            dismissButton = {
                TextButton(onClick = {  openDialog.value = false}) {
                    Text(text = "取消")
                }
            })
        }
    }

運(yùn)行結(jié)果:

Jetpack?Compose怎么實(shí)現(xiàn)對(duì)話框和進(jìn)度條

2.進(jìn)度條

Compose自帶了兩種material Design進(jìn)度條,分別是圓形進(jìn)度條和直線進(jìn)度條,他們都有兩種狀態(tài),一種是無(wú)限加載的,另一種是根據(jù)值來(lái)動(dòng)態(tài)顯示的,我們就以一個(gè)圓形的進(jìn)度條來(lái)演示Compose中進(jìn)度條的使用吧,代碼如下:

  @Composable
    fun ProgressBarDemo()
    {
        var progress by remember {
            mutableStateOf(0.1f)
        }
        val animatedProgress by animateFloatAsState(targetValue = progress,
        animationSpec = ProgressIndicatorDefaults.ProgressAnimationSpec)
        Column {
            CircularProgressIndicator(progress = animatedProgress)
            Spacer(modifier = Modifier.requiredHeight(30.dp))
            OutlinedButton(onClick = { if (progress < 1f) progress += 0.1f}) {
                Text(text = "增加進(jìn)度")
            }
        }
    }

運(yùn)行結(jié)果如下:

Jetpack?Compose怎么實(shí)現(xiàn)對(duì)話框和進(jìn)度條

如上面代碼所示,當(dāng)我們點(diǎn)擊一次按鈕時(shí),進(jìn)度就會(huì)增加10%,當(dāng)不設(shè)置progress時(shí),就是無(wú)限加載的進(jìn)度條,另外,還有一種時(shí)直線進(jìn)度條(LinearProgressIndicator),使用方法和圓形進(jìn)度條完全一致

到此,關(guān)于“Jetpack Compose怎么實(shí)現(xiàn)對(duì)話框和進(jìn)度條”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI