本文展示了 RotateDrawable
与 AnimatedRotateDrawable
两种实现方式。
如有更好的实现方式欢迎在本文底部评论区交流讨论。
RotateDrawable
RotateDrawable
用来对 Drawable
进行旋转,可以通过其setLevel()
方法来控制 Drawable
的旋转,level的最大值是 10000。
RotateDrawable
可以在XML文件中定义<rotate>
元素使用。
XML 属性
属性 | 说明 |
---|---|
android:fromDegrees | 起始的角度,对应最低的level值,默认0 |
android:toDegrees | 结束角度,对应最高的level值,默认360 |
android:pivotX | 参照点的x坐标,取值为 0~1,默认是50%,即0.5 |
android:pivotY | 参照点的Y坐标,取值为 0~1,默认是50%,即0.5 |
android:drawable | drawable资源 |
android:visible | drawable是否可见 |
角度坐标系
实现示例
在Android Studio中,在工程的res目录,分别创建两个资源文件
textview_refresh.png
,textview_refresh_rotate.xml
如下图所示:编辑
textview_refresh_rotate.xml
的文件内容:<?xml version="1.0" encoding="utf-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/textview_refresh" android:fromDegrees="0" android:pivotX="50%" android:pivotY="50%" android:toDegrees="359" />
为TextView的设置
RotateDrawable
//获取 RotateDrawable 对象 val drawable = resources.getDrawable(R.drawable.textview_refresh_rotate) //定制Drawable的大小 drawable.setBounds(0, 0, drawable.intrinsicWidth, drawable.intrinsicHeight) //为TextView设置drawableLeft refresh_tv.setCompoundDrawables(drawable, null, null, null)
让
RotateDrawable
旋转起来创建属性动画
//通过属性动画设置drawable的level值 mRefreshAnimator = ObjectAnimator.ofInt(drawable, "level", 0, 10000) mRefreshAnimator?.apply { duration = 600 //动画执行600ms repeatCount = -1 //无限执行次数 interpolator = LinearInterpolator() //匀速插值器 }
点击TextView让RotateDrawable旋转起来
override fun onClick(v: View) { when (v.id) { R.id.refresh_tv -> { if (mRefreshCount % 2 == 0) { mRefreshAnimator?.start() //启动动画 } else { mRefreshAnimator?.cancel() //取消动画 } mRefreshCount++ } } }
AnimatedRotateDrawable
AnimatedRotateDrawable
是Android系统的隐藏API
AnimatedRotateDrawable
就是Android系统自身使用的。对外部隐藏,所以不能通过手动创建对象的方式使用。
虽然开发者可以通过XML的方式使用,但使用XML方式也很局限,只能使用其3个属性,而且无法设置其旋转的速度。不推荐在项目中使用。
实现示例
以下 AnimatedRotateDrawable
实现方式仅供参考。
在Android Studio中,在工程的res/drawable目录创建weather_refresh_rotate2.xml
<?xml version="1.0" encoding="utf-8"?> <animated-rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/home_weather_refresh" android:pivotX="50%" android:pivotY="50%" />
为TextView的设置
AnimatedRotateDrawable
mAnimatedDrawable = resources.getDrawable(R.drawable.weather_refresh_rotate2) mAnimatedDrawable?.apply { setBounds(0,0,intrinsicWidth,intrinsicWidth) } refresh_tv.setCompoundDrawables(mAnimatedDrawable, null, null, null)
让
AnimatedRotateDrawable
旋转起来override fun onClick(v: View) { when (v.id) { R.id.refresh_tv -> { if (mRefreshCount % 2 == 0) { (mAnimatedDrawable as? Animatable)?.start() //启动动画 } else { (mAnimatedDrawable as? Animatable)?.stop() //取消动画 } mRefreshCount++ } } }