Compose笔记(六十七)--LookaheadScope

这一节主要了解一下Compose中的LookaheadScope,在Jetpack Compose开发中,LookaheadScope是一个高级动画与布局预测工具,用于在布局尚未真正发生变更前,提前"预测"未来布局状态,从而实现更流畅、响应更快的动画效果。简单总结如下:

场景:

1 列表项删除时的平滑收缩动画

2 共享元素过渡

栗子:

Kotlin 复制代码
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Button
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.LookaheadScope
import androidx.compose.ui.unit.dp

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun LookaheadDemo() {
    var expanded by remember { mutableStateOf(false) }

    LookaheadScope {
        Column(
            modifier = Modifier
                .fillMaxWidth()
                .padding(16.dp)
        ) {
            Button(
                onClick = { expanded = !expanded },
                modifier = Modifier.fillMaxWidth()
            ) {
                Text(if (expanded) "Collapse" else "Expand")
            }

            Spacer(modifier = Modifier.height(16.dp))

            Box(
                modifier = Modifier
                    .fillMaxWidth()
                    .height(if (expanded) 200.dp else 100.dp)
                    .background(Color.Blue)
            )
        }
    }
}
Kotlin 复制代码
mport androidx.compose.animation.core.animateDpAsState
import androidx.compose.animation.core.tween
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material3.Button
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.layout.LookaheadScope
import androidx.compose.ui.unit.dp

@Composable
fun LookaheadScopeDemo() {
 
    var isLargeSize by remember { mutableStateOf(false) }
  
    val targetSize by animateDpAsState(
        targetValue = if (isLargeSize) 200.dp else 100.dp,
        animationSpec = tween(durationMillis = 500),
        label = "size animation"
    )

    Box(
        modifier = Modifier.fillMaxSize(),
        contentAlignment = Alignment.Center
    ) {
        LookaheadScope {
            Box(
                modifier = Modifier
                    .size(targetSize)
                    .background(MaterialTheme.colorScheme.primary, MaterialTheme.shapes.medium),
                contentAlignment = Alignment.Center
            ) {
                Text(
                    text = if (isLargeSize) "大尺寸" else "小尺寸",
                    color = MaterialTheme.colorScheme.onPrimary
                )
            }
           
            Button(
                onClick = { isLargeSize = !isLargeSize },
                modifier = Modifier.padding(top = 300.dp)
            ) {
                Text(text = "切换组件尺寸")
            }
        }
    }
}

注意:

1 实验性API:需添加 @OptIn(ExperimentalMaterial3Api::class)。

2 适用场景:主要用于Material 3组件或自定义动态布局。

相关推荐
xian_wwq21 分钟前
【学习笔记】看参识模型
笔记·学习
闲猫28 分钟前
基于RABC的权限控制设计
android
猹叉叉(学习版)43 分钟前
【系统分析师_知识点整理】 3.数据库系统
数据库·笔记·软考·系统分析师
李子琪。43 分钟前
攀山的人
经验分享·笔记·百度·新浪微博
2501_926978331 小时前
物理学原理和人工智能领域的底层一致性
人工智能·经验分享·笔记·ai写作
努力的lpp1 小时前
2024小迪安全课程第三节复习笔记
笔记·安全
冥王丁B1 小时前
第31章 Prompt 与聊天模型笔记
笔记·python·prompt
左左右右左右摇晃2 小时前
Java笔记——包装类(自动拆装箱)
java·笔记·python
Yeh2020582 小时前
MySQL笔记二
笔记
elseif1232 小时前
CSP-S提高级大纲
开发语言·数据结构·c++·笔记·算法·大纲·考纲