什么是惯性衰减动画

比如说我们玩微信的时候 手指一拉,微信的列表就会惯性滑动 ,这个滑动的速率当然是越来越慢的,最终停止, 这个其实就是惯性衰减动画的典型例子

那这个例子和animateTo 有啥区别呢? 一个速率变慢的动画 ,听起来似乎 我们用animateTo 设置一些参数也可以实现

其实这里最大的区别就是 animateTo 你是需要设置目标值的,也就是动画结束的那一刻 某个view属性的值 你必须明确指定

而所谓的惯性衰减动画 animateDecay 则不需要指定

animateDecay: 从初始速度慢慢停下来 例如松手之后的惯性滑动

animateTo: 指定结束的属性值

看个小例子,来感受一下 模拟的 惯性滑动效果

下面的代码就是以1000.dp的初始速度 开始做惯性动画,直到停下

 setContent {
            val anim = remember {
                Animatable(0.dp, Dp.VectorConverter)
            }
            val re = rememberSplineBasedDecay<Dp>()
            LaunchedEffect(Unit) {
                delay(1000)
//                exponentialDecay<>()
//                splineBasedDecay<>()  android的默认惯性滑动曲线算法 listview rv gridview 之类的 和传统view的overScroller 是一个意思
//                rememberSplineBasedDecay() 一般就用待remember的就可以 不带的可以不用
                // 这个第一个1000.dp 的参数 代表初始速度  注意这个速度是物理像素值 而不是所谓的速度
                // 所以这个值 越大,这个Box的位移 偏移量就越大,可以修改这个值以后感受一下
                anim.animateDecay(1000.dp,re)
            }
            Box(
                Modifier
                    .padding(0.dp, anim.value, 0.dp, 0.dp)
                    .size(100.dp)
                    .background(Color.Green)) {
            }
        }

注意 splineBasedDecay 一般只能用于 像素的变化,因为这个东西可以针对不同像素密度的设备而变化

exponentialDecay 这个就是典型的不会根据像素密度变化而变化,比如颜色,角度之类的

setContent {
    val anim = remember {
        Animatable(0.dp, Dp.VectorConverter)
    }
    // frictionMultiplier 代表摩擦力系数  这个值越大 变化的速度就越快 最终反馈的就是 这个box的位移越小
    // absVelocityThreshold 速度阈值 大概意思就是 到这个阈值了 就停止了 一般而言 这2个参数 都可以不用设置 默认就好
    val decay = exponentialDecay<Dp>(3f,0.5f)
    LaunchedEffect(Unit) {
        delay(1000)
        anim.animateDecay(1000.dp,decay)
    }
    Box(
        Modifier
            .padding(0.dp, anim.value, 0.dp, 0.dp)
            .size(100.dp)
            .background(Color.Green)) {
    }
}

惯性衰减动画 使用要点

上述的代码可能有人要问,为啥你有2个decay,其中一个用的时候有remember开头的函数,还有一个没有?

我们先看那个有的

这里其实是会根据屏幕像素密度的变化而变化的,所以这个值是一个可变的,为了响应这个变化 所以系统默认的给我们提供了remember的这个函数

而 exponentialDecay 则因为不会响应系统的变化,所以不需要,可以直接用,但是 你要是真的直接用了,那就错了 因为 你直接用 那就每次compose页面刷新的时候 他都会初始化一下这个值,这个很没有必要,而且很多时候会出错,所以最佳的做法 还是要remember一下

val decay = remember {
    exponentialDecay<Dp>(3f,0.5f)
}

block 监听

有时 我们使用动画时,会对某一个view使用动画,其他view 响应这个动画的变化 而变化即可,讲白了就是要监听动画的变化,同样的在 compose中 也提供了block这个lambda 可以协助我们完成类似的工作

他是监听动画变化的每一帧,给出对应的回调

如下面的例子所示,这个就是 绿色的box在位移动画,而 黑色的box 跟着绿色的一起变化

setContent {
    val anim = remember {
        Animatable(0.dp, Dp.VectorConverter)
    }
    // 我们第二个box 就用这个来代表位移吧
    var paddingTop  by remember {
        mutableStateOf(anim.value)
    }
    val decay = remember {
        exponentialDecay<Dp>(2f)
    }
    LaunchedEffect(Unit) {
        delay(1000)
        // 动画的监听
        anim.animateDecay(1000.dp, decay) {
            paddingTop = value
        }
    }
    Row() {
        Box(
            Modifier
                .padding(0.dp, anim.value, 0.dp, 0.dp)
                .size(100.dp)
                .background(Color.Green)) {
        }
        Box(
            Modifier
                .padding(0.dp, paddingTop, 0.dp, 0.dp)
                .size(100.dp)
                .background(Color.Black)) {
        }
    }
}

以上就是Jetpack Compose惯性衰减动画AnimateDecay详解的详细内容,更多关于Jetpack Compose AnimateDecay的资料请关注Devmax其它相关文章!

Jetpack Compose惯性衰减动画AnimateDecay详解的更多相关文章

  1. 一文详解 Compose Navigation 的实现原理

    这篇文章主要介绍了一文详解 Compose Navigation的实现原理,文章通告围绕主题展开详细的相关内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下

  2. 使用Compose制作抖音快手视频进度条Loading动画效果

    这篇文章主要为大家介绍了使用Compose制作抖音快手视频进度条Loading动画效果,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  3. 利用Jetpack Compose实现绘制五角星效果

    这篇文章主要为大家介绍了Jetpack Compose如何使用自定义操作符实现绘制五角星效果,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下

  4. Android Jetpack 狠活Lifecycles与LiveData使用详解

    这篇文章主要为大家介绍了Android Jetpack 狠活Lifecycles与LiveData使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  5. Android开发Jetpack组件Lifecycle使用篇

    这一篇文章来介绍Android Jetpack架构组件的Lifecycle; Lifecycle用于帮助开发者管理Activity和Fragment 的生命周期, 由于Lifecycle是LiveData和ViewModel的基础;所以需要先学习它

  6. Android Compose自定义TextField实现自定义的输入框

    众所周知Compose中默认的TextField和OutlineTextField样式并不能满足所有的使用场景,所以自定义TextField就成了必备技能。本文将自定义TextField实现自定义的输入框,感兴趣的可以了解一下

  7. Android开发Compose remember原理解析

    这篇文章主要为大家介绍了Android开发Compose remember原理解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  8. koa中间件核心(koa-compose)源码解读分析

    这篇文章主要介绍了koa中间件核心(koa-compose)源码解读分析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  9. Android Jetpack组件Navigation导航组件的基本使用

    本篇主要简单介绍了一下 Navigation 是什么 以及使用它的流程是什么,并且结合实际案例 操作了一番,Navigation 还有很多其他用法,如条件导航、嵌套图、过度动画 等等功能 有机会再操作,需要的朋友可以参考下

  10. Jetpack Compose Text的基本使用

    这篇文章主要介绍了Jetpack Compose Text的基本使用,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下

随机推荐

  1. Flutter 网络请求框架封装详解

    这篇文章主要介绍了Flutter 网络请求框架封装详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. Android单选按钮RadioButton的使用详解

    今天小编就为大家分享一篇关于Android单选按钮RadioButton的使用详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

  3. 解决android studio 打包发现generate signed apk 消失不见问题

    这篇文章主要介绍了解决android studio 打包发现generate signed apk 消失不见问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  4. Android 实现自定义圆形listview功能的实例代码

    这篇文章主要介绍了Android 实现自定义圆形listview功能的实例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. 详解Android studio 动态fragment的用法

    这篇文章主要介绍了Android studio 动态fragment的用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  6. Android用RecyclerView实现图标拖拽排序以及增删管理

    这篇文章主要介绍了Android用RecyclerView实现图标拖拽排序以及增删管理的方法,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下

  7. Android notifyDataSetChanged() 动态更新ListView案例详解

    这篇文章主要介绍了Android notifyDataSetChanged() 动态更新ListView案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

  8. Android自定义View实现弹幕效果

    这篇文章主要为大家详细介绍了Android自定义View实现弹幕效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  9. Android自定义View实现跟随手指移动

    这篇文章主要为大家详细介绍了Android自定义View实现跟随手指移动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. Android实现多点触摸操作

    这篇文章主要介绍了Android实现多点触摸操作,实现图片的放大、缩小和旋转等处理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部