Android属性动画
属性动画整理的脑图如下:
基本使用
ValueAnimator
ValueAnimator
是整个属性动画机制当中最核心的一个类,属性动画的运行机制是通过不断地对值进行操作来实现的,而初始值和结束值之间的动画过渡就是由ValueAnimator
这个类来负责计算的。它的内部使用一种时间循环的机制来计算值与值之间的动画过渡,我们只需要将初始值和结束值提供给ValueAnimator,并且告诉它动画所需运行的时长,那么ValueAnimator就会自动帮我们完成从初始值平滑地过渡到结束值这样的效果。除此之外,ValueAnimator还负责管理动画的播放次数、播放模式、以及对动画设置监听器等,确实是一个非常重要的类。
ValueAnimator.ofXXX(0f, 100f, 50f, 100f)
.apply {
duration = 300
addUpdateListener {
// ...
}
}.start()
ps:ofXXX
代表数值类型,可以是ofInt
,ofFloat
等。
ObjectAnimator
ObjectAnimator
继承自ValueAnimator
, ValueAnimator是对值进行了一个平滑的动画过渡,而ObjectAnimator 可以直接对任意对象的任意属性进行动画操作的,比如说View的alpha属性。
// 设置imageView的透明度属性
ObjectAnimator.ofFloat(imageView, "alpha", 1.0f, 0.4f, 1.0f)
.apply {
duration = 1000
startDelay = 300
}.start()
PropertyValuesHolder
PropertyValuesHolder
对象可用于通过ValueAnimator
或ObjectAnimator
创建动画,这些动画可以并行操作多个不同的属性。
val holder1 = PropertyValuesHolder.ofFloat("alpha", 1f, 0.5f)
val holder2 = PropertyValuesHolder.ofFloat("scaleX", 1f, 0.5f)
val holder3 = PropertyValuesHolder.ofFloat("scaleY", 1f, 0.5f)
val animator: ObjectAnimator =
ObjectAnimator.ofPropertyValuesHolder(binding.imgIv, holder1, holder2, holder3)
animator.duration = 200
animator.start()
TypeEvaluator
通过ValueAnimator#setEvaluator()
方法设置估值器,TypeEvaluator
能够支持我们创建支持任意属性类型的动画。
系统内置了一些估值器:
ArgbEvaluator, FloatArrayEvaluator, FloatEvaluator, IntArrayEvaluator, IntEvaluator, PointFEvaluator, RectEvaluator, TypeEvaluator
我们也可以自定义,如下:
ValueAnimator().apply {
duration = 3000
setObjectValues(PointF(0f, 0f))
interpolator = AccelerateInterpolator(10f)
val point = PointF()
//自定义估值器
setEvaluator { fraction, startValue, endValue ->
point.x = 100f * (fraction * 5)
// y=vt=1/2*g*t*t(重力计算)
point.y = 0.5f * 98f * (fraction * 5) * (fraction * 5)
point
}
addUpdateListener {
val p = it.animatedValue as PointF
imageView.apply {
x = p.x
y = p.y
}
}
}.start()
Interpolator
Interpolator
被用于定义动画的变化速率。也可以说是加速度。系统自带了一些插值器如下:
- AccelerateDecelerateInterolator:先加速后减速
- AccelerateInterpolator:加速
- DecelerateInterpolator:减速
- AnticipateInterpolator:先向相反方向改变一段再加速播放
- AnticipateOvershootInterpolator:先向相反方向改变,再加速播放,会超出目标值然后缓慢移动至目标值,类似于弹簧回弹
- BounceInterpolator:快到目标值时值会跳跃
- CycleIinterpolator:动画循环一定次数,值的改变为一正弦函数:Math.sin(2 * mCycles * Math.PI)
- LinearInterpolator:线性均匀改变
- OvershottInterpolator:最后超出目标值然后缓慢改变到目标值
- TimeInterpolator:一个允许自定义Interpolator的接口,以上都实现了该接口
都是通过:
valueAnimator.setInterpolator(new LinearInterpolator());
设置即可。
ValueAnimator().apply {
duration = 3000
setObjectValues(PointF(0f, 0f))
interpolator = AccelerateInterpolator(10f)
}.start()
AnimatorSet
AnimatorSet
是对属性动画的一个集合,可以让很多动画按一定顺序或者 同时进行。
val translationXAnimator = ObjectAnimator.ofFloat(binding.imgIv, "translationX", 0f, 500f)
val alphaAnimator = ObjectAnimator.ofFloat(binding.imgIv, "alpha", 0f, 1f)
val scaleXAnimator = ObjectAnimator.ofFloat(binding.imgIv, "scaleX", 0f, 2f)
val animatorSet = AnimatorSet()
animatorSet.duration = 500
// 按照顺序执行
// animatorSet.playSequentially(translationXAnimator, alphaAnimator, scaleXAnimator)
// 一起执行
// animatorSet.playTogether(translationXAnimator, alphaAnimator, scaleXAnimator)
// 链式调用
// animatorSet.play(translationXAnimator).with(alphaAnimator).with(scaleXAnimator)
// after 在 play之前执行 before 在 play之后执行
animatorSet.play(translationXAnimator).after(scaleXAnimator).before(alphaAnimator)
animatorSet.start()
实战
xiaow/AndroidPractiseCode: Android 代码练习库 - Gitee.com
动画框架
本文链接:https://jxiaow.gitee.io/posts/c521d2cf/
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!