Android 使用 RotateDrawable 实现箭头动画

知识点

  • 安卓中同一drawable资源默认情况下共享状态,修改一个drawable实例的状态会导致其他的实例的状态一并改变。
  • RotateDrawable重写了onLevelChange方法,将level从0-10000映射为rotate角度从0到360,当然这里的rotate是顺时针旋转,而不是逆时针或者X轴、Y轴旋转。

最终效果


Android 使用 RotateDrawable 实现箭头动画_第1张图片
最终效果.gif

xml代码

TextView设置文字及背景色以及代码设置drawableStart、drawableEnd,Button用于设置点击事件。




    

        
    

    

        

        

Kotlin 代码

注意,mutate()方法非常重要,它是一个不可逆的操作,可以将drawable�实例状态独立出来。

class TestActivity : AppCompatActivity() {
    private lateinit var mBinding:ActivityTestBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        mBinding = DataBindingUtil.setContentView(this,R.layout.activity_test)
        mBinding.lifecycleOwner = this
        
        val d1 = ResourcesCompat.getDrawable(resources, R.drawable.rotate, null) as RotateDrawable
        val d2 = ResourcesCompat.getDrawable(resources, R.drawable.rotate, null) as RotateDrawable
        Log.d("lq", "is drawable the same: ${d1 == d2}")
        d1.mutate()
        mBinding.testTextView.setCompoundDrawablesRelativeWithIntrinsicBounds(d1, null, d2, null)

        var chose = true
        mBinding.testClick.setOnClickListener {
            if (chose) {
                ObjectAnimator.ofInt(d1, "level", 0, 5000).setDuration(300).start()
                ObjectAnimator.ofInt(d2,"level",5000,10000).setDuration(300).start()
            } else {
                ObjectAnimator.ofInt(d2,"level",0,5000).setDuration(300).start()
                ObjectAnimator.ofInt(d1, "level", 5000, 10000).setDuration(300).start()
            }
            chose = !chose
        }
    }
}

你可能感兴趣的:(Android 使用 RotateDrawable 实现箭头动画)