Compose (10/N) - 动画

news2024/12/26 15:04:24

一、高级别动画

1.1 简单值动画 animate***AsState

为单个值添加动画。只需要指定目标值,会从当前值向目标值渐变。

animateColorAsState
animateDpAsState
animateSizeAsState
animateOffsetAsState
animateRectAsState

animateIntAsState

animateIntOffsetAsState

animateIntSizeAsState

animateValueAsState TwoWayConverter对其他数据类型支持
val value = flow {    //透明度逐渐降低
    emit(1.0F)
    delay(500)
    emit(0.8F)
    delay(500)
    emit(0.6F)
    delay(500)
    emit(0.4F)
    delay(500)
    emit(0.2F)
}
@Composable
fun Show() {
    val myAlpah: Float by animateFloatAsState(targetValue = value.collectAsState(initial = 1.0F).value)
    Box(
        modifier = Modifier
            .graphicsLayer(alpha = myAlpah)
            .background(Color.Red)
    ) {
        Text(text = "你好")
    }
}

1.2 可见性动画 AnimatedVisibility

为内容的显示或消失添加动画。默认以“淡入扩大出现,淡出缩小消失”,可通过 EnterTransition 和 ExitTransition 设置,不同的动画可以用“+”自由组合。

EnterTransitionExitTransition 
fadeIn

fadeOut

slideIn

slideOut

slideInHorizontally

slideOutHorizontally

slideInVertically

slideOutVertically

scaleIn

scaleOut

expendIn

shrinkOut

expendHorizontally

shrinkHorizontally

expendVertically

shrinkVertically

@Composable
fun AnimatedVisibility(
    visible: Boolean,        //控制内容是否可见
    modifier: Modifier = Modifier,
    enter: EnterTransition = fadeIn() + expandIn(),        //进入动画(默认淡入扩大)
    exit: ExitTransition = shrinkOut() + fadeOut(),        //退出动画(默认淡出缩小)
    label: String = "AnimatedVisibility",
    content: @Composable() AnimatedVisibilityScope.() -> Unit        //显示或消失的内容
val value = flow {    //可见不可见切换
    emit(true)
    delay(500)
    emit(false)
    delay(500)
    emit(true)
    delay(500)
    emit(false)
}
@Composable
fun Show() {
    val enable: Boolean by value.collectAsState(initial = true)
    //包裹住需要控制的内容(这里是Text)
    AnimatedVisibility(
        visible = enable,
    ){
        Text(text = "你好")
    }
}

1.3 内容改变动画 AnimatedContent

为内容改变添加动画。默认淡出后淡入。

fun <S> AnimatedContent(
    targetState: S,
    modifier: Modifier = Modifier,
    transitionSpec: AnimatedContentScope<S>.() -> ContentTransform = {
        fadeIn(animationSpec = tween(220, delayMillis = 90)) +
            scaleIn(initialScale = 0.92f, animationSpec = tween(220, delayMillis = 90)) with
            fadeOut(animationSpec = tween(90))
    },
    contentAlignment: Alignment = Alignment.TopStart,
    label: String = "AnimatedContent",
    content: @Composable() AnimatedVisibilityScope.(targetState: S) -> Unit
)

使用 transitionSpec 指定 ContentTransform 对象来配置进入动画和退出动画(with中缀表达式能组合进入动画和退出动画并返回ContentTransform对象)。

Column {
    var count by remember { mutableStateOf(0) }
    Button(onClick = { count++ }) {
        Text("添加数据")
    }
    AnimatedContent(
        targetState = count,
        transitionSpec = {
            //with是进入动画的扩展函数,传入退出动画,返回的是ContentTransform
            scaleIn() with scaleOut()
        }
    ) {
        Text(text = "数值:${count}")
    }
}

1.4 内容大小动画 Modifier.animateContentSize( )

为可大小变化的控件添加动画。注意:在修饰符链中的顺序很重要,为了确保动画流畅,务必放置在任何大小修饰符(如size或defaultMinSize)前面,以确保会将带动画效果的值的变化报告给布局。

1.5 淡入淡出动画 Crossfade

为两个内容的切换添加淡入淡出动画。

fun <T> Crossfade(
    targetState: T,
    modifier: Modifier = Modifier,
    animationSpec: FiniteAnimationSpec<Float> = tween(),
    label: String = "Crossfade",
    content: @Composable (T) -> Unit
)

 

@Composable
fun Sample() {
    var currentPage by remember { mutableStateOf(false) }
    Column {
        Crossfade(targetState = currentPage, animationSpec = tween(3000)) { screen ->
            when (screen) {
                false -> Box(modifier = Modifier.background(Color.Blue).size(100.dp))
                true -> Box(modifier = Modifier.background(Color.Red).size(100.dp))
            }
        }
        Button(onClick = { currentPage = !currentPage }, modifier = Modifier.width(100.dp)) {
            Text(text = "点击切换")
        }
    }
}

1.6 多值动画 updateTransiton

同时运行多个动画。

1.7 重复动画 rememberInfiniteTransition

动画一进入组合阶段就开始运行,除非被移除,否则不会停止。使用 rememberInfiniteTransition 创建 InfiniteTransition 实例,使用 animateColor、animatedFloat 或 animatedValue 添加子动画,还需要指定 infiniteRepeatable 以指定动画规范。

@Composable
fun Show() {
    val infiniteTransition = rememberInfiniteTransition()
    val alpha = infiniteTransition.animateFloat(
        initialValue = 0F,    //初始值
        targetValue = 1F,     //目标值
        animationSpec = InfiniteRepeatableSpec(
            animation = keyframes {
                durationMillis = 1000
                1F at 500   //指定关键帧
            },
            repeatMode = RepeatMode.Restart //重复模式,还有一个Reverse
        )
    )
    val color by infiniteTransition.animateColor(
        initialValue = Color.Red,
        targetValue = Color.Green,
        animationSpec = infiniteRepeatable(
            animation = tween(1000, easing = LinearEasing),
            repeatMode = RepeatMode.Reverse
        )
    )
}

二、低级别动画

2.1 Animatable

2.2 Animation

三、自定义动画

3.1 AnimationSpec

3.2 Easing

3.3 AnimationVector

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/426233.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【机会约束、鲁棒优化】机会约束和鲁棒优化研究优化【ccDCOPF】研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【数据挖掘与商务智能决策】第十章 支持向量机

1. 线性可分SVM import numpy as np import pandas as pd import matplotlib.pyplot as plt%matplotlib inline1.1 生成模拟数据 # 导入sklearn模拟二分类数据生成模块 from sklearn.datasets import make_blobs # 生成模拟二分类数据集 X, y make_blobs(n_samples150, n_f…

SIP协议之RTP负载类型(payload type)

一、RTP负载类型介绍​ 在SIP 音视频通话中&#xff0c;媒体数据是由RTP包携带的&#xff0c; RTP包中的PT字段标识了负载媒体数据的类型。如下图&#xff1a; 注&#xff1a; PT表示负载类型(Payload Type), 7 bits&#xff0c;即所传输的多媒体的类型 ​  不同的媒体编码…

Kafka消费者组和分区再均衡

应用程序使用KafkaConsumer向Kafka订阅主题&#xff0c;并从订阅的Topic上接收消息。 要想知道如何从Kafka读取消息&#xff0c;需要先了解消费者和消费者组的概念。 1、消费者和消费者组 原因&#xff1a;假设我们有一个应用程序需要从一个Kafka Topic中读取消息并验证&…

14Exceptional Control Flow Exceptions and Process(异常控制流,异常和进程)

异常控制流 异常控制流出现的地方&#xff1a; 异常控制流&#xff08;Exceptional Control Flow&#xff0c;ECF&#xff09;是程序执行过程中由于某些特殊事件或条件而导致的控制流的改变。异常控制流通常出现在以下几种情况&#xff1a; 硬件异常和中断&#xff1a;硬件异…

14天手撸交互式问答数字人直播教程-课程计划

一、课程计划 二、时间安排 第01天&#xff1a;交互式问答数字人发展现状 从一个真实案例开始&#xff0c;介绍当前主流的交互式数字人平台&#xff0c;需求和应用场景&#xff0c;引入交互式数字人的交互流程和关键技术。后续整个直播系列的内容安排。 第02天&#xff1a;音…

Nvidia Orin刷机保姆级教程

文章目录前言一、刷机准备二、刷机实战1.刷机文件下载2.Orin进入刷机模式2.1拔掉Orin上所有线缆2.2插上type-c线缆2.3长按Force Recovery按钮2.4通电2.5松开2号按钮进入刷机模式2.6确认是否进入刷机模式3.命令行刷机3.1安装jetpack总结前言 使用Orin有段时间了&#xff0c;现在…

代码随想录_二叉树_leetcode236

leetcode 236. 二叉树的最近公共祖先 236. 二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、…

Windows主机信息搜集

注意&#xff1a;一切内容仅用于信息技术分享&#xff0c;切勿用于其他用途&#xff0c;一切后果与作者无关。 前言&#xff1a; 通过命令执行使用cs拿到了内网的一台主机&#xff0c;接下来我们进行内网的信息搜集。 1、内网环境分析 内网渗透&#xff1a; 在拿到webshell的…

机器学习——最大最小归一化

问&#xff1a;写出最小最大归一化公式,并对以下数据集进行最小最大归一化。x{6.3,9.2,-0.8,0.2,3.6}答&#xff1a; x_{min}-0.8 x_{max}9.2 将每个数据点应用最小最大归一化公式&#xff1a; $x_1{6.3-(-0.8)}/{9.2-(-0.8)}0.71 $x_2{9.2-(-0.8)}/{9.2-(-0.8)}1.0 $x_3…

PasteSpider之部署实际案例一则

本帖主要是介绍使用PasteSpider部署一个项目的过程&#xff0c;不一定会把所有问题都概括在内&#xff0c;但是至少是一个项目部署的完整流程和说明&#xff01; 我们以PasteCode的网站作为一个项目为例子&#xff0c;绑定的域名为https://www.pastecode.cn/,项目包含了api端和…

ldap 组织结构如何转成多叉树?

工作中&#xff0c;ldap 服务器的对接&#xff0c;可以能会涉及到同步组织结构&#xff0c;认证&#xff0c;认证后处理等等&#xff0c;最近认证还不是我想写的刚需&#xff0c;继续来看看对于组织结构的想法 例如同步 AD 域的组织结构&#xff0c;或者是 ldap 协议的其他产品…

「计算机控制系统」2. 采样与数据保持

计算机控制系统中的信号 理想采样过程的数学描述 信号的恢复与重构 文章目录计算机控制系统中的信号基础知识A/D中的信号D/A中的信号理想采样过程的数学描述采样过程的描述理想采样信号的描述Shannon采样定理信号的恢复与重构Shannon重构法信号保持重构法计算机控制系统中的信号…

Java属性文件编码:处理非西欧语言字符的指南

Java属性文件是一种轻量级的配置文件格式&#xff0c;用于在Java应用程序中存储键值对数据。在Java中&#xff0c;Properties类提供了一种方便的方式来读取和写入属性文件。 在Java中&#xff0c;属性文件通常使用ISO-8859-1字符集编码。这意味着如果您希望在属性文件中使用非…

中科图新BIM+GIS数字化设计施工管理解决方案

一、引言&#xff1a; 公路项目对施工质量和风险控制要求高&#xff0c;但涉及专业、队伍、机械等众多因素&#xff0c;导致施工质量与安全控制困难。必须提前应对并做好过程中的管控&#xff0c;信息化系统可支持记录和管理数据。 二、中科图新BIMGIS智慧施工管理平台 中科图…

docker容器的相关环境及创建镜像1

一、容器管理工具介绍 LXC 2008 是第一套完整的容器管理解决方案 不需要任何补丁直接运行在linux内核之上管理容器。创建容器慢&#xff0c;不方便移植 Docker 是在LXC基础上发展起来的。拥有一套容器管理生态系统 生态系统包含︰容器镜像、注册表、RESTFUL API及命令行操作界…

Python算法设计 - McCarthy 91

目录一、什么是 McCarthy 91二、有什么用&#xff1f;三、Python算法实现四、作者Info一、什么是 McCarthy 91 McCarthy 91 是一个递归的函数表达式如下 函数的意思是当输入一个大于 100 的数字 n 时返回 n-10&#xff0c;而当输入一个小于等于101的数字 n 时递归的对 n 进行…

QT之widget窗口标题与项目构建目标位置修改

文章目录widget窗口标题修改方法一&#xff0c;直接通过UI界面修改方法二&#xff0c;通过代码修改结果展示&#xff0c;选择其中一种方法即可构建项目生成文件目标位置修改1. 首先选择——>项目&#xff0c;如图所示&#xff1a;2.打开后选择构建设置——>编辑构建位置&…

【VScode】手把手教你如何搭建C/C++开发环境

目录 1.VScode是什么 2.VScode的下载和安装 安装中文插件 3.VScode配置C/C开发环境 3.1 下载MinGW-w64 编译器套件 3.2 配置MinGW-w64 3.3 安装C/C插件 4.在VScode上编写C语言代码并编译成功 4.1打开文件夹 4.2 新建C语言文件&#xff0c;编写C语言代码 4.3设置C/…

vue3项目中使用pinia

vuex 4pinia 小菠萝 vuex和之前vue2使用一致 1.import { createStore } from vuex 引入文件不同vue3组件setup写法vuex提供了hook //组件中操作store import { useStore } from vuex //提交mutations 进行修改 store.commit(increment), //dispatch 触发action 同步或者异步提交…