在LayerDrawable中动画所有RotateDrawable

3

我有两个可旋转的drawable在一个layer-list里,我想将它们作为一个drawableleft动画显示在按钮上。我已经成功显示了drawable,但没有动画。

这是我的xml中的drawable布局(button_progress_bar_small.xml):

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
    <rotate
         android:drawable="@drawable/ic_spinner_small_outer"
         android:pivotX="50%"
         android:pivotY="50%"
         android:fromDegrees="0"
         android:toDegrees="1080" />
</item>
<item>
    <rotate
         android:drawable="@drawable/ic_spinner_small_inner"
         android:pivotX="50%"
         android:pivotY="50%"
         android:fromDegrees="720"
         android:toDegrees="0" />
</item>

这是我正在运行的代码:
    button.setCompoundDrawablesWithIntrinsicBounds(R.drawable.button_progress_bar_small, 0, 0, 0);
    LayerDrawable progressAnimationLeft = (LayerDrawable) button.getCompoundDrawables()[0];
    ((RotateDrawable) progressAnimationLeft.getDrawable(0)).setLevel(500);
    ((RotateDrawable) progressAnimationLeft.getDrawable(1)).setLevel(500);

我并不确定触发动画启动的条件,也不确定是否需要在每个 RotateDrawable 上执行某些操作(与在 LayerDrawable 上执行一次操作相反),以便实现该目的。

2个回答

5

好的,我已经找到了解决我的问题的方法。

我将布局更改为:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
    <animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"
        android:drawable="@drawable/ic_spinner_small_outer"
        android:pivotX="50%"
        android:pivotY="50%"
        android:fromDegrees="0"
        android:toDegrees="1080"
        android:interpolator="@android:anim/linear_interpolator"
        android:repeatCount="infinite"/>        
</item>
<item>
    <animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"
        android:drawable="@drawable/ic_spinner_small_inner"
        android:pivotX="50%"
        android:pivotY="50%"
        android:fromDegrees="720"
        android:toDegrees="0"
        android:interpolator="@android:anim/linear_interpolator"
        android:repeatCount="infinite"/>        
</item>

并将代码更改为:

    button.setCompoundDrawablesWithIntrinsicBounds(R.drawable.button_progress_bar_small, 0, 0, 0);
    LayerDrawable progressAnimationLeft = (LayerDrawable) button.getCompoundDrawables()[0];
    ((Animatable) progressAnimationLeft.getDrawable(0)).start();
    ((Animatable) progressAnimationLeft.getDrawable(1)).start();

虽然这并不是回答问题的方法,但对我来说是一个很好的解决办法,具有相同的动画效果。


这太疯狂了,没有人对这个问题有任何意见! - basickarl
发生了这件事,我很好奇是否您能够为每个项目获得独立的动画属性;我无法做到。 - wkhatch
如果你的意思是“让每个动画独立旋转”,那么不行。我只看到一个动画。这在Stack Overflow上是众所周知的问题。 - AsafK
这是一个很好的答案,帮我解决了如何使SeekBar拇指进行旋转动画的问题。只需要将animated-rotate设置到拇指上,然后获取拇指并将其转换为Animatable并start()。 - suntao

0
你需要为从0到10000的级别值添加动画效果。
button.setCompoundDrawablesWithIntrinsicBounds(R.drawable.button_progress_bar_small, 0, 0, 0);  
LayerDrawable progressAnimationLeft = (LayerDrawable) button.getCompoundDrawables()[0];
ObjectAnimator.ofInt((RotateDrawable) progressAnimationLeft.getDrawable(0), "level", 0, 10000).start();
ObjectAnimator.ofInt((RotateDrawable) progressAnimationLeft.getDrawable(1), "level", 0, 10000).start();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接