簡體   English   中英

如何在 Jetpack Compose 中為按鈕的寬度設置動畫

[英]How to animate width of a button in Jetpack Compose

假設我有一個這樣的可組合:

@Composable
fun LoadingButton() {
    val (isLoading, setIsLoading) = state { false }

    Button(
        onClick = setIsLoading,
        text = {
            if (isLoading) {
                Text(text = "Short text")
            } else {
                Text(text = "Very very very long text")
            }
        }
    )
}

如何為按鈕的寬度更新設置動畫?

我很清楚我可以為按鈕添加一個 preferredWidth 修飾符,並使用以下方法為這個寬度設置動畫:

val buttonWidth = animate(target = if (isLoading) LoadingButtonMinWidth else LoadingButtonMaxWidth)

但這不是我想要的。 我需要為自動“包裝內容”寬度設置動畫。

提前致謝。

您需要向Text Composable 添加animateContentSize修飾符:

@Composable
fun LoadingButton() {
    val (isLoading, setIsLoading) = state { false }
    Button(onClick = { setIsLoading(!isLoading) }) {
        Text(
            text = if (isLoading) {
               "Short text"
            } else {
                "Very very very long text"
            },
            modifier = Modifier.animateContentSize()
        )
    }
}

使用1.0.0 (使用1.0.0-beta09測試),您可以應用修改器animateContentSize

當它的子修飾符(或者如果它已經在鏈的尾部,則它是可組合的子)改變大小時,這個修飾符會為其自己的大小設置動畫。 這允許父修改器觀察平滑的大小變化,從而產生整體連續的視覺變化。

就像是:

var isLoading by remember { mutableStateOf(false) }
val text = if (isLoading) "Short text" else "Very very very long text"

Button(onClick = { isLoading = !isLoading },
    modifier = Modifier
        .animateContentSize(
              animationSpec = tween(durationMillis = 300,
                   easing = LinearOutSlowInEasing))
) {
    Text(
        text = text,textAlign = TextAlign.Center
    )
}

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM