做个记录,之前项目中用得比较少
一、Activity中代码段
private fun animationBigger() {
//属性从300递增到500
val anim = ValueAnimator.ofInt(300, 400).apply {
this.duration = 2000 //执行时长
this.repeatCount = 0
this.repeatMode = ValueAnimator.RESTART
}
anim.addUpdateListener {
// 获得改变后的值
val currentValue = it.animatedValue as Int
// 步骤4:将改变后的值赋给对象的属性值,下面会详细说明
binding.btn1.minWidth = currentValue
// 步骤5:刷新视图,即重新绘制,从而实现动画效果
binding.btn1.requestLayout();
}
anim.addListener(object : Animator.AnimatorListener {
override fun onAnimationStart(animation: Animator?) {
}
override fun onAnimationEnd(animation: Animator?) {
startAnimset()
}
override fun onAnimationCancel(animation: Animator?) {
}
override fun onAnimationRepeat(animation: Animator?) {
}
})
anim.start()//开始执行动画
startAnimXml()
}
private fun startAnimset() {
val anim = ObjectAnimator.ofFloat(binding.btn1, "translationX", 0f, 300f)
val animRotate = ObjectAnimator.ofFloat(binding.btn1, "rotationY", 0f, 360f)
val animatorSet = AnimatorSet()
animatorSet.playSequentially(anim)
animatorSet.duration = 2000
//通过animatorSet的play方法获取 感兴趣的话 可以都试试 看一下效果
animatorSet.play(anim).after(animRotate)
animatorSet.interpolator = MInterpolator(0.5f)//自定义插值器
// animatorSet.interpolator = CycleInterpolator(0.5f)
// animatorSet.interpolator = OvershootInterpolator(2.0f)
animatorSet.addListener(object : Animator.AnimatorListener {
override fun onAnimationStart(animation: Animator?) {
}
override fun onAnimationEnd(animation: Animator?) {
// translate()//重复执行
}
override fun onAnimationCancel(animation: Animator?) {
}
override fun onAnimationRepeat(animation: Animator?) {
}
})
animatorSet.start()
}
private var startTime = 0L
private fun startAnimXml() {
AnimatorInflater.loadAnimator(this, R.animator.anim_first).apply {
this.setTarget(binding.text)
this.interpolator = LinearInterpolator()
// this.startDelay = 5000//start后延迟5秒执行
// this.duration = 10000;//生效
this.addListener(object : Animator.AnimatorListener {
override fun onAnimationStart(animation: Animator?) {
startTime = System.currentTimeMillis()
"开始执行".d()
}
override fun onAnimationEnd(animation: Animator?) {
"timelong=${(System.currentTimeMillis() - startTime)}".d()
}
override fun onAnimationCancel(animation: Animator?) {
}
override fun onAnimationRepeat(animation: Animator?) {
}
})
}.start()
}
二、自定义插值器
import android.animation.TimeInterpolator
import kotlin.math.pow
import kotlin.math.sin
class MInterpolator(var factor: Float = 0.15f) : TimeInterpolator {
// 因子数值越小振动频率越高
override fun getInterpolation(input: Float): Float {
return (2.0.pow(-10 * input.toDouble()) * sin((input - factor / 4) * (2 * Math.PI) / factor) + 1).toFloat()
}
}
三、values中新建animator文件夹,anim_first.xml
参考:
https://blog.csdn.net/weixin_45558166/article/details/110310651
https://www.jianshu.com/p/39ee86df9e5a



