当前位置: 首页 > news >正文

三谈属性动画——Keyframe以及ViewPropertyAnimator

经过初识属性动画——使用Animator创建动画和再谈属性动画——介绍以及自定义Interpolator插值器,对属性动画已经介绍的差不多了,还剩下最后两个概念,Keyframe和ViewPropertyAnimator。

Keyframe

动画归根结底是一些帧的组合,一旦设定了一个动画后,中间的每帧,Android系统会帮我们计算好,而Keyframe允许我们定义动画中的一些关键帧,该对象主要有fraction和value组成,其中fraction代表着动画的进度、value代表着动画的值,可以设置单独的Interpolator,这个Interpolator作用于前一帧与当前帧。
举个例子:

val kf1 = Keyframe.ofFloat(0.2f, 100f).apply {
            interpolator = AnticipateInterpolator()
        }
        val kf2 = Keyframe.ofFloat(0.4f, 200f).apply {
            interpolator = LinearInterpolator()
        }
        val kf3 = Keyframe.ofFloat(0.6f, 300f)
        val kf4 = Keyframe.ofFloat(0.8f, 400f).apply {
            interpolator = BounceInterpolator()
        }
        val kf5 = Keyframe.ofFloat(1.0f, 500f).apply {
            interpolator = SpringInterpolator(0.2f)
        }

        btnMove.setOnClickListener {
            ObjectAnimator.ofPropertyValuesHolder(tvShow,
                    PropertyValuesHolder.ofKeyframe(View.TRANSLATION_Y, kf1, kf2, kf3, kf4, kf5)).apply {
                duration = 3000
                start()
            }
        }
复制代码

上面代码定义了5个Keyframe,分别设置了不同的Interpolator,然后再用PropertyValuesHolder包装一下,最终效果如下:

ViewPropertyAnimator

如果想在一个View上使用属性动画,可以这么操作:

val animX = ObjectAnimator.ofFloat(myView, "x", 50f)
val animY = ObjectAnimator.ofFloat(myView, "y", 100f)
AnimatorSet().apply {
    playTogether(animX, animY)
    start()
}
复制代码

当然,也可以这么操作:

val pvhX = PropertyValuesHolder.ofFloat("x", 50f)
val pvhY = PropertyValuesHolder.ofFloat("y", 100f)
ObjectAnimator.ofPropertyValuesHolder(myView, pvhX, pvhY).start()
复制代码

可以发现,都是挺麻烦的。View作为最常被动画的对象,Android提供了一种封装,这就是ViewPropertyAnimator,使用方式也是很简单,比如上面的代码等效于:

myView.animate().x(50f).y(100f)
复制代码

View.animate()方法会返回一个ViewPropertyAnimator,该对象具备View的常用属性的变换,比如:

  • transitionX、transitionY、transitionZ
  • rotation、rotationX和rotationY
  • scaleX、scaleY
  • x、y、z
  • alpha

总结

至此,学习完了属性动画的知识点,属性动画在Android Transition框架中很重要,是构成各种转场动画的关键,会实现各种酷炫的动画是很厉害的,但其实都离不开这些基础,剩下的更多是数学。

关于代码,参考Github

参考

  • https://developer.android.google.cn/guide/topics/graphics/prop-animation#keyframes
  • https://developer.android.google.cn/reference/android/animation/Keyframe
  • https://developer.android.google.cn/reference/android/view/ViewPropertyAnimator

关注我的技术公众号,不定期会有技术文章推送,不敢说优质,但至少是我自己的学习心得。微信扫一扫下方二维码即可关注:

转载于:https://juejin.im/post/5c85db2cf265da2daa31893d

相关文章:

  • 湖北分布式智能数据采集方法有哪些?
  • C#用正则表达式一键Unicode转UTF8(解决LitJson中文问题)
  • vue + echarts画圈圈
  • 微软职位内部推荐-SENIOR SDE
  • 23种设计模式之抽象工厂
  • Prototype 原型模式
  • web应用与http协议
  • PDF格式文件如何编辑,怎样修改PDF背景颜色
  • js confirm函数
  • Bootstrap学习:Bootstrap 环境安装
  • Dubbo Mesh 在闲鱼生产环境中的落地实践
  • acl 之 xml 流解析器
  • Linaria 1.0正式发布:一个零运行时CSS-in-JS库
  • 从后端到前端的转变:如何选择框架?
  • Pascal's Triangle LeetCode
  • 3.7、@ResponseBody 和 @RestController
  • Android单元测试 - 几个重要问题
  • Babel配置的不完全指南
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • HashMap剖析之内部结构
  • mysql 数据库四种事务隔离级别
  • Redis字符串类型内部编码剖析
  • Spring Boot MyBatis配置多种数据库
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • Vue UI框架库开发介绍
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 给第三方使用接口的 URL 签名实现
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 全栈开发——Linux
  • 思否第一天
  • 我从编程教室毕业
  • 一道闭包题引发的思考
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • 数据可视化之下发图实践
  • #stm32驱动外设模块总结w5500模块
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (四)图像的%2线性拉伸
  • (转)拼包函数及网络封包的异常处理(含代码)
  • .CSS-hover 的解释
  • .NET 8.0 中有哪些新的变化?
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .Net 知识杂记
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • ??myeclipse+tomcat
  • @angular/cli项目构建--Dynamic.Form
  • @GlobalLock注解作用与原理解析
  • [20190113]四校联考
  • [C\C++]读入优化【技巧】
  • [codeforces]Checkpoints
  • [docker] Docker容器服务更新与发现之consul
  • [flask] flask的基本介绍、flask快速搭建项目并运行