ValueAnimator
常用构造
ValueAnimator.ofInt() //Int
ValueAnimator.ofArgb() //Int
ValueAnimator.ofFloat() //Float
ValueAnimator.ofObject() //TypeEvaluator,object
开启一个动画
val anima = ValueAnimator.ofInt(0,1).apply {
duration = 3000
start()
}
这样我们就开启了一个简单的动画 动画值在3000毫秒内从0过渡到1
添加监听
val anima = ValueAnimator.ofInt(0,1).apply {
duration = 3000
addUpdateListener {
val value = it.animatedValue as Int
Log.e("动画回调值",value.toString())
}
start()
}
更多设置
val anima = ValueAnimator.ofInt(0,1,9,3).apply {
duration = 3000
addUpdateListener {
val value = it.animatedValue as Int
Log.e("动画回调值",value.toString())
}
startDelay = 2000 //设置延迟播放时间 会在start()执行之后延迟该时间后开启动画
repeatCount = 2 //设置循环播放次数
repeatMode = ValueAnimator.RESTART //设置循环播放模式 从头播放
repeatMode = ValueAnimator.REVERSE//倒序播放
start()
}
!!注意 实际播放动画的总次数为1+repeatCount 如果设置了倒序播放只会在第偶数次播放的时候倒序
ValueAnimator.ofObject() 和 TypeEvaluator 接口
TypeEvaluator 实现该接口从而设置动画从开始到结束的过渡方式
来看一下基本使用
val anima = ValueAnimator.ofObject(object :TypeEvaluator<Int>{
var x = 0F
override fun evaluate(fraction: Float , startValue: Int? , endValue: Int?): Int {
x++;
val start = startValue as Int
return (x.pow(2)+start).toInt()
}
},0,0).apply {
addUpdateListener {
Log.e("wuhongru",it.animatedValue.toString())
}
start()
}
这里我们往fObject()里面传入了三个参数
- 第一个是实现了TypeEvalutor接口的匿名类的实例
- 第二个参数是 startValue 会在evaluate中回调
- 第三个参数是 endValue 会在evalua中回调
- TyepeEvaluator的泛型要传入我们后面传入的 startValue对应的类型
- evaluate方法中 fraction表示动画进度的百分比是一个Float类型 返回值为动画当前进度对应的值,可以自己设置
这个动画的结果应该是在动画时间内打印x大于零时的y=x^2 的y值
打印结果
2022-07-16 17:17:38.929 4405-4405/com.example.test2 E/wuhongru: 1
2022-07-16 17:17:38.963 4405-4405/com.example.test2 E/wuhongru: 4
2022-07-16 17:17:39.142 4405-4405/com.example.test2 E/wuhongru: 9
2022-07-16 17:17:39.151 4405-4405/com.example.test2 E/wuhongru: 16
2022-07-16 17:17:39.162 4405-4405/com.example.test2 E/wuhongru: 25
2022-07-16 17:17:39.191 4405-4405/com.example.test2 E/wuhongru: 36
2022-07-16 17:17:39.208 4405-4405/com.example.test2 E/wuhongru: 49
2022-07-16 17:17:39.225 4405-4405/com.example.test2 E/wuhongru: 64
2022-07-16 17:17:39.242 4405-4405/com.example.test2 E/wuhongru: 81
2022-07-16 17:17:39.259 4405-4405/com.example.test2 E/wuhongru: 100
在自定义view运用
TODO:2022 7. 16
ObjectAnimator
可以对任意对象的任意属性进行动画操作 同样可以传入TypeEvalutor
组合动画
AnimatorSet类
- play(Animator anim) 传入将要播放的动画
- after(Animator anim) 将现有动画插入到传入的动画之后执行
- after(long delay) 将现有动画延迟指定毫秒后执行
- before(Animator anim) 将现有动画插入到传入的动画之前执行
- with(Animator anim) 将现有动画和传入的动画同时执行
- playSequentially(Animator… items) 逐个播放动画,可变长参数,参数为需要执行的动画
- playSequentially(List
items) 逐个播放动画,参数为需要执行的动画的集合 - playTogether(Animator… items) 同时开启动画,参数是可变长参数,参数为需要执行的动画
- playTogether(Collection
items) 同时开启动画,参数是动画合集
Interpolator
补间器 控制动画的变化速率
sdk有提供其实现类
通过实现TimeInterpolator接口来自定义动画变化速率
ViewPropertyAnimator
通过View.animate()
返回一个ViewPropertyAnimator实例从而可以对属性进行动画操作。
ViewPropertyAnimator官方文档