如何为TextView的drawable设置旋转动画

本文展示了 RotateDrawableAnimatedRotateDrawable 两种实现方式。
如有更好的实现方式欢迎在本文底部评论区交流讨论。

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是否可见

角度坐标系

实现示例

  1. 在Android Studio中,在工程的res目录,分别创建两个资源文件 textview_refresh.pngtextview_refresh_rotate.xml 如下图所示:

  2. 编辑 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" />
  3. 为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)
  4. 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 实现方式仅供参考。

  1. 在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%" />
  2. 为TextView的设置 AnimatedRotateDrawable

    mAnimatedDrawable = resources.getDrawable(R.drawable.weather_refresh_rotate2)
         mAnimatedDrawable?.apply {
             setBounds(0,0,intrinsicWidth,intrinsicWidth)
         }
    refresh_tv.setCompoundDrawables(mAnimatedDrawable, null, null, null)
  3. 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++
            }
        }
    }

Visit Demo Source Code


   转载规则


《如何为TextView的drawable设置旋转动画》 congwiny 采用 知识共享署名 4.0 国际许可协议 进行许可。
评论
 上一篇
使用Systrace性能分析 使用Systrace性能分析
Systrace 概览https://developer.android.com/studio/profile/systrace Systrace环境配置
2019-09-26
下一篇 
Hexo + GitHub Pages使用自定义域名 Hexo + GitHub Pages使用自定义域名
域名申请在域名商那边购买域名,我选择在腾讯云购买域名。 购买成功之后,进入腾讯云的域名管理 点击解析按钮 添加以下2个记录就可以了 GitHub Pages配置到GitHub的博客仓库,点击设置,然后修改Custom domain为自己的
2019-09-19
  目录