知识点
- 安卓中同一
drawable
资源默认情况下共享状态,修改一个drawable实例的状态会导致其他的实例的状态一并改变。 -
RotateDrawable
重写了onLevelChange
方法,将level
从0-10000映射为rotate
角度从0到360,当然这里的rotate是顺时针旋转,而不是逆时针或者X轴、Y轴旋转。
最终效果
最终效果.gif
xml代码
TextView
设置文字及背景色以及代码设置drawableStart、drawableEnd,Button
用于设置点击事件。
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<import type="com.john.test.FAndroid" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/white"
android:fitsSystemWindows="true"
android:orientation="vertical">
<TextView
android:id="@+id/test_text_view"
android:layout_width="wrap_content"
android:layout_height="100dp"
android:gravity="center"
android:textColor="@android:color/white"
android:background="@color/colorAccent"
android:layout_gravity="center"
android:padding="12dp"
android:text="123123123" />
<Button
android:id="@+id/test_click"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="200dp"
android:text="click" />
</LinearLayout>
</layout>
rotate/xml
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/ic_drop_down"
android:fromDegrees="0"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="360" />
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
}
}
}
网友评论