ObjectAnimator 实现基本动画操作
使得界面的切换更协调
public final class ObjectAnimator extends ValueAnimator {
目录
1. 旋转
// 旋转, 顺时针从-360 到0, 原始状态是0
private fun rotater() {
val animator = ObjectAnimator.ofFloat(star, View.ROTATION, -360f, 0f)
animator.duration = 1000
// 监听动画的开始 和 结束,
// AnimatorListenerAdapter抽象类,实现了AnimatorListener 和AnimatorPauseListener, 覆写需要的即可
animator.addListener(object : AnimatorListenerAdapter() {
override fun onAnimationStart(animation: Animator?) {
rotateButton.isEnabled = false
}
override fun onAnimationEnd(animation: Animator?) {
rotateButton.isEnabled = true
}
})
animator.start()
}
监听动画状态可以写成扩展函数,如:
// 写成 ObjectAnimator 的拓展函数, 监听动画的开始和结束,控制控件的点击状态
// AnimatorListenerAdapter抽象类,实现了AnimatorListener 和AnimatorPauseListener, 覆写需要的即可
private fun ObjectAnimator.disableViewDuringAnimation(view: View) {
addListener(object : AnimatorListenerAdapter() {
override fun onAnimationStart(animation: Animator?) {
view.isEnabled = false
}
override fun onAnimationEnd(animation: Animator?) {
view.isEnabled = true
}
})
}
2. 移动
// 移动
private fun translater() {
val animator = ObjectAnimator.ofFloat(star, View.TRANSLATION_X, 200f)
animator.repeatCount = 1
animator.repeatMode = ObjectAnimator.REVERSE // 返回到原点
animator.disableViewDuringAnimation(translateButton)
animator.start()
}
3.伸缩
//伸缩
private fun scaler() {
// PropertyValuesHolder 保持动画处理的一些属性
val scaleX = PropertyValuesHolder.ofFloat(View.SCALE_X, 4f)
val scaleY = PropertyValuesHolder.ofFloat(View.SCALE_Y, 4f)
val animator = ObjectAnimator.ofPropertyValuesHolder(star, scaleX, scaleY)
animator.repeatCount = 1
animator.repeatMode = ObjectAnimator.REVERSE
animator.disableViewDuringAnimation(scaleButton)
animator.start()
}
4.淡入、淡出
// 淡入、淡出
private fun fader() {
// 0f 完全透明; 1f 完全不透明
val animator = ObjectAnimator.ofFloat(star, View.ALPHA, 0f)
animator.repeatCount = 1
animator.repeatMode = ObjectAnimator.REVERSE
animator.disableViewDuringAnimation(fadeButton)
animator.start()
}
5.颜色
// 颜色
private fun colorizer() {
// ofArgb 渐变效果比 ofInt 效果好,
var animator = ObjectAnimator.ofArgb(star.parent,
"backgroundColor", Color.BLACK, Color.RED)
animator.duration = 500
animator.repeatCount = 1
animator.repeatMode = ObjectAnimator.REVERSE
animator.disableViewDuringAnimation(colorizeButton)
animator.start()
}
6.组合
private fun shower() {
// 父容器
val container = star.parent as ViewGroup
val containerW = container.width
val containerH = container.height
// 原始星星的大小
var starW: Float = star.width.toFloat()
var starH: Float = star.height.toFloat()
//创建新图片并且添加到父容器中
val newStar = AppCompatImageView(this)
newStar.setImageResource(R.drawable.ic_star)
newStar.layoutParams = FrameLayout.LayoutParams(
FrameLayout.LayoutParams.WRAP_CONTENT,
FrameLayout.LayoutParams.WRAP_CONTENT
)
container.addView(newStar)
// 新图片的大小(通过伸缩) 和位置(平移)
newStar.scaleX = Math.random().toFloat() * 1.5f + .1f
newStar.scaleY = newStar.scaleX
starW *= newStar.scaleX
starH *= newStar.scaleY
newStar.translationX = Math.random().toFloat() * containerW - starW / 2