如何在android中实现两个同步视图之间的滑入和滑出动画

2023-12-28

我知道我可以使用AnimatedVisibility可组合功能并实现可见性动画的滑入动画,但我想要实现的是当一个布局处于进入动画而另一个处于退出动画时,类似于下图。

NB:我知道我应该为不同的屏幕使用导航组合,并且目的地之间的动画仍在开发中,但我想在屏幕的一部分内容上实现这一点,类似于 CrossFade 动画。


正如您所提到的,这个动画应该由导航库实现,并且有一张开给那个的票 https://issuetracker.google.com/issues/172112072.

考虑到这一点,我将我的答案留在这里,希望它有所帮助......

我将把它分成三个部分:

  1. 容器:
@Composable
fun SlideInAnimationScreen() {
    // I'm using the same duration for all animations. 
    val animationTime = 300 

    // This state is controlling if the second screen is being displayed or not
    var showScreen2 by remember { mutableStateOf(false) }

    // This is just to give that dark effect when the first screen is closed...
    val color = animateColorAsState(
        targetValue = if (showScreen2) Color.DarkGray else Color.Red,
        animationSpec = tween(
            durationMillis = animationTime,
            easing = LinearEasing
        )
    )
    Box(Modifier.fillMaxSize()) {
       // Both Screen1 and Screen2 are declared here...
    }
}
  1. 第一个屏幕只需做一个小幻灯片即可创建视差效果。我还将背景颜色从红色更改为深色,只是为了提供重叠/隐藏/深色效果。
// Screen 1
AnimatedVisibility(
    !showScreen2,
    modifier = Modifier.fillMaxSize(),
    enter = slideInHorizontally(
        initialOffsetX = { -300 }, // small slide 300px
        animationSpec = tween(
            durationMillis = animationTime, 
            easing = LinearEasing // interpolator
        )
    ),
    exit = slideOutHorizontally(
        targetOffsetX = { -300 }, =
        animationSpec = tween(
            durationMillis = animationTime, 
            easing = LinearEasing
        )
    )
) {
    Box(
        Modifier
            .fillMaxSize()
            .background(color.value) // animating the color
    ) {
        Button(modifier = Modifier.align(Alignment.Center),
            onClick = {
                showScreen2 = true
            }) {
            Text(text = "Ok")
        }
    }
}
  1. 第二个确实是从边缘滑落。
// Screen 2
AnimatedVisibility(
    showScreen2,
    modifier = Modifier.fillMaxSize(),
    enter = slideInHorizontally(
        initialOffsetX = { it }, // it == fullWidth
        animationSpec = tween(
            durationMillis = animationTime, 
            easing = LinearEasing
        )
    ),
    exit = slideOutHorizontally(
        targetOffsetX = { it },
        animationSpec = tween(
            durationMillis = animationTime, 
            easing = LinearEasing
        )
    )
) {
    Box(
        modifier = Modifier
            .fillMaxSize()
            .background(Color.Blue)
    ) {
        Button(modifier = Modifier.align(Alignment.Center),
            onClick = {
                showScreen2 = false
            }) {
            Text(text = "Back")
        }
    }
}

结果如下:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在android中实现两个同步视图之间的滑入和滑出动画 的相关文章

随机推荐

  • Rabbitmq 使用单个同步调用检索多条消息

    有没有办法使用单个同步调用接收多条消息 当我知道队列中有 N 条消息 N 可以是小于 10 的小值 时 我应该能够执行类似于 channel basic get String queue boolean autoAck int number
  • 通过 Crystal Web 服务以编程方式设置 Crystal Server 上 Crystal Report 的数据源

    如何更改在 Crystal 服务器中运行的 Crystal 报表在运行时使用的数据源 数据库服务器 用户名 密码 我有一台水晶服务器 并上传了具有一组数据源的报告 托管在服务器 A 用户 A 密码 A 上的 SQL Server 2005
  • Cache-Control: max-age=0 和 no-cache 有什么区别?

    标题Cache Control max age 0意味着内容立即被视为过时 并且必须重新获取 这实际上与Cache Control no cache 我有同样的问题 并在搜索中找到了一些信息 您的问题作为结果之一出现 这就是我所决定的 有两
  • sqlcipher - sqlcipher 的安全性如何?它被黑客入侵了吗?

    它在页面级别加密 SQLite 数据库 好吧 没问题 但是你的源代码呢 它已编译 但即使已编译 有人也可以反编译它 检索您的密码并解密数据库吗 SQLCipher 的安全性如何 根据SQLCipher设计文档 http sqlcipher
  • 是否有更快的代码用于向表中添加新行 - Excel VBA

    每当我的代码找到要添加到其中的新值时 我都会向表中添加一个新行 我为此使用的代码Set newRow ProjectTable ListRows Add工作正常 但这使其运行速度非常慢 是否有代码可以完成相同的任务但运行速度更快 Dim P
  • 如何在flutter中自定义标签栏宽度?

    您好 我们可以在 flutter 中自定义标签栏宽度吗 我的标签栏宽度是固定的 所以当我的标签栏中有长文本时 它不会完全显示 我想让我的标签栏宽度根据内容灵活 所以当我的文本只是短文本时 标签栏宽度会很小 当文本是长文本时 选项卡栏宽度大于
  • 来自 github 存储库的 Scala sbt 文件依赖项

    是否可以包含来自 github 的依赖项 存储库没有 jar 文件 只有 build sbt 文件和源文件夹 您可以创建一个新项目 该项目指向您的源代码build sbt然后使用dependsOn lazy val projectIDepe
  • 下标运算符中的逗号运算符?

    我对逗号运算符很困惑 我从来没有见过这样的代码和这样的语法 但我很好奇它在任何地方都有用吗 为什么它在 c 20 中被弃用 include
  • 如何创建全局热键?

    我想创建一个热键 因此当您按下时 它应该将一些字节写入我附加的进程中的内存地址 到目前为止 我有这段代码 但似乎只有当我专注于主应用程序时它才有效 否则它将无法工作 我想让它工作 所以它会做我想做的事 即使我不关注主应用程序 private
  • xlsxwriter下拉列表Excel错误

    要对特定列中的所有行应用数据验证 请使用以下顺序 import xlsxwriter workbook xlsxwriter Workbook data validate2 xlsx worksheet workbook add works
  • 冲突解决后强制在 TFS 中合并

    TFS 2010 VS 2010 我们在 TFS 中遇到了一种情况 开发人员没有遵循正确的合并程序 当我将他的开发者目录与主干进行比较时 我得到了许多标记为不同或根本不在主干中的文件 他最后一次合并 签入主干是在 2011 05 26 他最
  • CUDA 功能和 CUDA 版本:兼容吗?

    我有一台具有 1 1 计算能力 CUDA GPU 的机器 我想重新安装 CUDA 我想我会选择 5 0 CUDA 功能和 CUDA 版本之间是否存在兼容性之类的问题 将 CUDA 5 0 与 C C 1 1 一起使用时会遇到麻烦吗 图形处理
  • 如何使用 overpass-api 获取我所在点附近的兴趣点?

    我正在使用 Overpass API 我无法找到我的地点附近 大约 100 200 英里 的一些兴趣点 咖啡馆 医院 学校 我只有纬度和经度 Overpass API 提供了使用您的地名获取 POI 的机会 但我没有 我只有坐标 我怎样才能
  • 如何在 Java EE 中使用 CDI 编写 main()?

    我有一个想要运行的无客户端应用程序 它没有客户端 但会进行 HTTP 调用并充当其他服务的客户端 它可能会运行几个小时或几天 但不需要定期运行 只需一次性 我想在 Java EE 7 容器中运行它 因为标准上下文依赖注入 CD 和标准 JA
  • Django 模型定义竞赛

    如果模型 A 依赖于所定义的模型 B 但模型 B 也依赖于所定义的模型 A 那么如何处理这种情况 例如 我有 class event models Model competition start models DateField compe
  • PointerByReference 不返回值

    我正在尝试通过 JNA 从 Java 调用 C 函数 我想传入一个字符串 然后返回一个字符串 这是通过使用 in 参数和 out 参数来完成的 我用PointerByReference来代表char 输出参数 对 C 的调用有效 但是Poi
  • 让 Restangular 的 .remove 在正文与 URI 中发送数据

    我正在将 Angular REST 调用转换为使用 Restangular 在此转换期间 我只是将调用移至使用 Restangular one controller remove object 这是调用正确的 URI 和方法 DELETE
  • Redux - 错误:mergeProps 的类型对象值无效

    我在使删除调度事件正常工作时遇到问题 我正在尝试从状态中删除列表项 我得到的错误如下 Error Invalid value of type object for mergeProps argument when connecting co
  • 使用汽车包中的散点图绘制并排图

    是否有某种原因无法并排放置两个散点图 来自汽车包装 图形 library car str UN par mfrow c 1 2 scatterplot infant mortality gdp data UN xlab GDP per ca
  • 如何在android中实现两个同步视图之间的滑入和滑出动画

    我知道我可以使用AnimatedVisibility可组合功能并实现可见性动画的滑入动画 但我想要实现的是当一个布局处于进入动画而另一个处于退出动画时 类似于下图 NB 我知道我应该为不同的屏幕使用导航组合 并且目的地之间的动画仍在开发中