基于 Compose 的容器共享(SharedContainer)、页面导航(Navigation)以及全局浮窗(FloatingWindow)库。支持背景模糊、镜面缩放,1像素填充、贝赛尔曲线、屏幕圆角插值、内容一次渲染、预测式返回、并行动画等特性;旨在减少开发流程、提高可定制性。
在settings.gradle添加
Groovy使用
maven {
url 'https://jitpack.io'
}Kotlin使用
maven {
url = uri("https://jitpack.io")
}添加依赖,版本以 Release 的 Tag 为准
implementation("com.github.Chiu-xaH:SharedNav:<version>")每个页面对应一个 Destination 对象,继承抽象类并实现 key 与 Content():
object HomeDestination : Destination() {
override val key = "home" // 全局唯一,同时用作容器共享的匹配 Key
@Composable
override fun Content() {
HomeScreen()
}
}在 Activity 或顶层 Composable 中启动导航:
写法 1:
@Composable
fun App() {
SharedNavHost(
startDestination = HomeDestination
)
}写法 2:手动控制 NavController
val navController = rememberNavController(startDestination = HomeDestination)
SharedNavHost(
navController = navController,
)在任意 Composable 中通过 LocalNavController 或 LocalNavControllerSafely 获取控制器:
提示:如果无法保证 Composable 函数一定在
SharedNav下调用,请使用LocalNavControllerSafely,它返回可空对象;LocalNavController获取不到控制器时会直接抛出异常导致 Crash。
@Composable
fun HomeScreen() {
val navController = LocalNavController.current
Button(onClick = { navController.push(DetailDestination) }) {
Text("进入详情")
}
Button(onClick = { navController.pop() }) {
Text("返回")
}
}用 SharedContainer 包裹触发跳转的组件,key 与目标 Destination.key 保持一致,即可获得类 Launcher 的展开/收起动画。
写法 1:
@Composable
fun HomeScreen() {
val navController = LocalNavController.current
val dest = DetailDestination
SharedContainer(
key = dest.key,
shape = MaterialTheme.shapes.medium,
) {
Card(
shape = RectangleShape,
onClick = { navController.push(dest) }
) { /* 内容 */ }
}
}写法 2:Modifier 扩展
@Composable
fun HomeScreen() {
val navController = LocalNavController.current
val dest = DetailDestination
Card(
modifier = Modifier.sharedContainer(
key = dest.key,
shape = MaterialTheme.shapes.medium
),
shape = RectangleShape,
onClick = { navController.push(dest) }
) { /* 内容 */ }
}注意:
SharedContainer内层组件的shape必须设置为无圆角,圆角统一由外层SharedContainer管理,否则在提取 1 像素时会缺失边角。
./gradlew assembleRelease- 大屏适配(平行视界) [P1]
- 元素共享 [P4]
- Kotlin Multiplatform [P4]
