效果:

直接上完整代码

@OptIn(ExperimentalAnimationApi::class)
@Composable
fun TestBottom(musicViewModel: MusicViewModel = hiltViewModel()) {val musicName = remember { mutableStateOf("依旧范特西依旧范特西依旧范特西依旧范特西依旧范特西") }Row(modifier = Modifier.navigationBarsPadding().padding(start = MediumDimen,end = MediumDimen,bottom = MediumDimen,top = SmallDimen).shadow(4.dp, RoundedCornerShape(20.dp)).background(CardBackgroundColor).wrapContentWidth(),verticalAlignment = Alignment.CenterVertically) {MusicImageAndProgress()AnimatedContent(targetState = musicViewModel.isPlaying,transitionSpec = {slideInVertically(animationSpec = tween(250, 250)) withslideOutVertically(animationSpec = tween(250)) usingSizeTransform { initialSize, targetSize ->if (targetState) {keyframes {// Expand horizontally first.IntSize(targetSize.width, initialSize.height) at 300durationMillis = 400}} else {keyframes {// Shrink vertically first.IntSize(initialSize.width, targetSize.height) at 300durationMillis = 400}}}}, contentAlignment = Alignment.Center) { targetExpanded ->Row(verticalAlignment = Alignment.CenterVertically) {if (targetExpanded) {Column(modifier = Modifier.weight(2f).padding(4.dp),verticalArrangement = Arrangement.Center) {Text(text = musicName.value,fontSize = 14.sp,maxLines = 1,overflow = TextOverflow.Ellipsis,)Text(text = "mood", fontSize = 12.sp)}Icon(modifier = Modifier.size(42.dp).clickable {musicViewModel.pauseOrRestoreMusic()},imageVector = if (musicViewModel.isPlaying) Icons.Filled.PauseCircleOutlineelse Icons.Filled.PlayCircleOutline,tint = ImagePinkColor,contentDescription = stringResource(id = R.string.music))}}}}
}

要点是AnimatedContent里的transitionSpec参数

transitionSpec = {//tween 第一个参数在持续时间内完成动画,第二个延迟执行//with 将两个动画组成 ContentTransform,它定义了内容如何进入和退出//using 自定义给定ContentTransform的SizeTransform ,它定义了当内容的大小发生变化时如何从一种大小转换为另一种大小slideInVertically(animationSpec = tween(250, 250)) withslideOutVertically(animationSpec = tween(250)) usingSizeTransform { initialSize, targetSize ->if (targetState) {//创建一个KeyframesSpec动画,根据动画持续时间中不同时间戳(即不同关键帧)定义的值进行动画处理keyframes {// Expand horizontally first.//at用来让动画在规定时间在这个值,也就是在300毫秒时应该达到这个大小IntSize(targetSize.width, initialSize.height) at 300//字面意思,持续时间durationMillis = 400}} else {keyframes {// Shrink vertically first.IntSize(initialSize.width, targetSize.height) at 300durationMillis = 400}}}
}

更多动画请到动画 | Jetpack Compose | Android Developers (google.cn)学习,compose动画实现十分方便。

Android Jetpack Compose 播放器动画相关推荐

  1. 学不动了,尝试用Android Jetpack Compose重写微信经典飞机大战游戏

    前段时间看了TechMerger大佬写的<一气呵成:用Compose完美复刻Flappy Bird!>,甚是有趣,按耐不住那躁动的心,笔者决定跟随大佬的脚步通过写游戏的方式学习Jetpac ...

  2. Android 自定义音乐播放器实现

    Android自定义音乐播放器 一:首先介绍用了哪些Android的知识点: 1 MediaPlayer工具来播放音乐 2 Handle.因为存在定时任务(歌词切换,动画,歌词进度条变换等)需要由Ha ...

  3. Android MediaPlayer MP3播放器(倍速和音量)的封装和所见的问题

    Android MediaPlayer MP3播放器(倍速和音量)的封装和所见的问题 文章目录 Android MediaPlayer MP3播放器(倍速和音量)的封装和所见的问题 一.技术选型 二. ...

  4. android 小型音乐播放器(实现播放、下一首、上一首、自动播放、随机播放按钮、当前播放歌曲界面)

    该文章主要针对 android 的音乐播放器软件进行简单的功能添加:播放.断点播放.停止.上一曲.下一曲.随机播放.显示当前播放歌曲(后续会为当前显示的播放添加动画): 软件开发流程: 1.先向内存卡 ...

  5. Android Jetpack Compose

    Android Jetpack Compose 一.什么是Jetpack Compose 二.关于Jetpack Compase的介绍 Jetpack Compose的特点 Jetpack Compo ...

  6. android 音乐播放器 获取sd卡所有音乐文件,Android Studio音乐播放器无法读取SD卡,只有内部存储器...

    我很抱歉,如果这原来是一个愚蠢的问题,它可能会成为一个快速修复,但我只是无法弄清楚.我在android studio中创建了音乐播放器,并且没有任何sdcard上的歌曲不会显示在列表视图中,只有内部内 ...

  7. android 调用系统播放器

    今天,简单讲讲android如何调用手机自带的播放器. 昨天,从服务器下载一个AVI的视频,下载后需要进行播放,所以想调用系统自带的播放器.但是由于很少用到,所以自己当时不知道怎么写,于是在网上查找资 ...

  8. android 自定义MP4播放器

    昨天,在网上找了好多资料,终于做了一个自定义的播发器. 视频播放方式 在Android中播放视频的方式有两种: 1.使用MediaPlayer结合SurfaceView进行播放.其中通过Surface ...

  9. 智能android电视更换播放器,GitHub - qfwc258/TvPlayer: android智能电视播放器,可以播放各电视台节目,播放基于ijkplayer的实现。...

    TvPlayer 1,android智能电视播放器,可以播放各电视台节目,播放基于ijkplayer的实现 2,测试的源地址可能失效,如需测试可以自己更换播放源.HttpUtils.getOfflin ...

最新文章

  1. Numpy核心语法和代码整理汇总!
  2. java 停顿 分钟_java - 年轻的垃圾收集更长时间停顿与Java 7 vs java 6 - 堆栈内存溢出...
  3. Leetcode 1 Two Sum
  4. CNN(Convolutional Neural Networks)没有原理只有实现
  5. NYOJ练习题 删除元素(二分查找)
  6. 提权学习之旅——基础篇
  7. 可以代表学计算机的标志,桌面上的图标可以用来表示
  8. 计算机网络——第二次实验——思科模拟器组网实验
  9. java安装pydev找不到_为什么安装成功也重启了,但是在window-preferences里找不到PyDev...
  10. Enterprise Library +Caliburn.Micro+WPF CM框架下使用企业库验证,验证某一个属性,整个页面的文本框都变红的原因...
  11. node解决通过npm无法安装forever的方法
  12. Latice CPLD jed转VME文件简介
  13. 【雷达目标检测】恒定阈值法和恒虚警(CFAR)法及代码实现
  14. 前端promise、async重点总结
  15. IMAX Enhanced:让沉浸式家庭影音娱乐体验不再抽象
  16. stm32F407的串口6卡死问题
  17. 网络营销---春节营销案例
  18. java虚拟机JVM--java虚拟机的结构
  19. python-字符串连接
  20. python中tan函数如何表示_Python tan() 函数

热门文章

  1. 南宁市二手房直接交易流程(一)
  2. 拾起童年的回忆 - 手把手教你制作飞机大战小游戏
  3. Shopify和其他电子商务平台上的微数据
  4. Efficient Cinimatic Lighting(Jeremy Vickery)-1 Basic theory
  5. Centos7下安装Sentry22.1.0,接入LDAP
  6. SQL左连接副表取最新的一条记录的多中方式
  7. 抽拉式服务器显示器拆卸,显示器底座怎么拆卸
  8. html中如何写if判断,HTML中的if判断用法
  9. html邮箱代码怎么写_如何制作一个简单的HTML登录页面(附代码)
  10. java实现hj协议_HJ212协议java 实现 封装好的环保212协议代码 - 下载 - 搜珍网