Android 动画实例1_星星

ObjectAnimator 实现基本动画操作

使得界面的切换更协调

public final class ObjectAnimator extends ValueAnimator {
  

目录

 

1. 旋转

2. 移动

3.伸缩

4.淡入、淡出

5.颜色

6.组合

7. 完整代码

ic_star.xml (drawable)

strings.xml

dimens.xml

colors.xml

activity_main.xml

MainActivity.kt


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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值