动画分为 View Animation
和 Property Animation
(属性动画)
属性动画 使用ViewPropertyAnimator
可用View已有的属性实现动画,如果多次执行的动画,要注意设置初始值。
tvViewFir.translationX = 0f
tvViewFir.alpha = 1.0f
tvViewFir.animate().translationX(500f).alpha(0f).setDuration(1000).start()
view.animate()
返回的值,就是一个ViewPropertyAnimator
使用
ObjectAnimator
ObjectAnimator.ofFloat(tvViewSec, "translationX", 0f, 500f).setDuration(1000).start()
ObjectAnimator.ofFloat(tvViewSec, "alpha", 1.0f, 0f).setDuration(1000).start()
- 如果是自定义控件,需要添加 setter / getter 方法。
- 用 ObjectAnimator.ofXXX() 创建ObjectAnimator 对象。
- 用 start() 方法执行动画。
PropertyValuesHolder 来实现
private fun multiPropertyAnimal() {
//对于多个属性动画同时执行,使用 PropertyValuesHolder
val translationAnimate = PropertyValuesHolder.ofFloat("translationX", 0f, 500f)
val alphaAnimate = PropertyValuesHolder.ofFloat("alpha", 1.0f, 0f)
ObjectAnimator.ofPropertyValuesHolder(tvViewSec, translationAnimate, alphaAnimate)
.setDuration(1000).start()
}
另外,通过PropertyValuesHolder也可以对一个动画做精确控制。例如,在完成度0.5的时候,进度条到100, 完成度1.0的时候,进度条再到80等.
多动画控制 使用AnimatorSet可以控制动画流。可以实现动画一起播放,先后播放等
val translationAnimate = ObjectAnimator.ofFloat(tvViewSec, "translationX", 0f, 500f).setDuration(1000)
val alphaAnimate = ObjectAnimator.ofFloat(tvViewSec, "alpha", 1.0f, 0f).setDuration(1000)
// 两个动画依次执行
val animatorSet = AnimatorSet()
animatorSet.playSequentially(translationAnimate, alphaAnimate)
animatorSet.start()
ValueAnimator 值动画,
ViewPropertyAnimator
ObjectAnimator
都是在ValueAnimator
的基础上实现的。ObjectAnimator
是它的子类。它是根据完成度,来计算当前值,可以使用当前值,完成不同的动画效果。val valueAnimator = ValueAnimator.ofFloat(0f, 1.0f)
valueAnimator.addUpdateListener {
val value = https://www.it610.com/article/it.animatedValue as Float
tvValueAnimator.text = value.toString()
}
valueAnimator.interpolator = AccelerateDecelerateInterpolator()
valueAnimator.duration = 5000
valueAnimator.start()
综述
ViewPropertyAnimator
、ObjectAnimator
、ValueAnimator
这三种 Animator
,它们其实是一种递进的关系:从左到右依次变得更加难用,也更加灵活。但它们的性能是一样的,所以在实际使用时候的选择,只要遵循一个原则就行:尽量用简单的。能用 View.animate()
实现就不用 ObjectAnimator
,能用 ObjectAnimator
就不用 ValueAnimator
.参考资料 HenCoder
推荐阅读
- Android修改系统的默认日期(Spreadturm)
- Android中@ViewInject的意思
- ObjectAnimator的使用
- android笔记|Android 自定义 一个可以控制子控件是否可以点击的layout
- 深踩 AndroidStudio 缓存的坑
- Android笔记|Retrofit2.5是如何解析在接口类中定义的方法()
- android学习——AsyncTast 异步操作和 ProgressBar
- Android学习|Android Studio快捷键提高工作效率的奇技
- LinearLayout中动态添加Fragment不能填充整个Activity的问题
- android学习|TouchDelegate的用法