Android属性动画


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官方文档


文章作者: Lao Wu
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Lao Wu !
评论
  目录