动画两层可绘制项目前蜂窝

时间:2011-12-31 07:59:34

标签: android android-animation android-xml

我试图动画两层drawable来实现后蜂窝不确定进度指示器的效果。 XML非常简单,但似乎在Honeycomb之前的平台上运行时,只有一个图层会生成动画。

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

这仅仅是这些平台的限制,还是我可以使用替代语法(一般情况下或专门针对API11之前的目标)来实现所需的功能?

2 个答案:

答案 0 :(得分:11)

确实有一个平台限制,虽然它不是你可能想到的。问题是API11之前,RotateDrawable有一些粗略的代码要求动画顺时针旋转,检查toDegrees是否大于fromDegrees;如果没有,两人被迫相等。如果您修改了示例以使第二个项目向前移动(从0到720,甚至是-720到0),则两个图像在所有平台上都可以正常显示;虽然我意识到这违背了你的目标。

查看Google Codesearch的缓存版本RotateDrawable.inflate(),这是用于将XML转换为对象的方法的2.3版本,您将看到我的意思。

RotateDrawable.java ...有问题的代码在235行左右......

    float fromDegrees = a.getFloat(
            com.android.internal.R.styleable.RotateDrawable_fromDegrees, 0.0f);
    float toDegrees = a.getFloat(
            com.android.internal.R.styleable.RotateDrawable_toDegrees, 360.0f);

    toDegrees = Math.max(fromDegrees, toDegrees); //<--There's the culprit

这会像您在那里的第二个项目一样使用XML块,并将其转换为RotateDrawable,其fromDegreestoDegrees的值相同(在您的情况下) ,720),使图像简单地静止不动。您可以通过将起始值设置为某个值而不是360的倍数(如765)来显示测试结果。您将看到图像仍然没有动画,但会旋转到初始坐标。

在Honeycomb / ICS源中删除了这个尴尬的检查,这就是为什么你可以在这些平台上进行向后旋转的原因。此外,它看起来似乎没有办法从Java代码设置这些值,因此您的未来可能会有自定义RotateDrawableCompat:)

HTH

答案 1 :(得分:1)

似乎快速而肮脏的解决方案是让它在预蜂窝中工作,只需在第二次旋转中翻转即可。这并不理想,但至少旋转的东西(即使它有点“无聊”)。这就是ABS似乎解决了它的方式。

  <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <rotate
             android:drawable="@drawable/abs__spinner_48_outer_holo"
             android:pivotX="50%"
             android:pivotY="50%"
             android:fromDegrees="0"
             android:toDegrees="1080" />
    </item>
    <item>
        <rotate
             android:drawable="@drawable/abs__spinner_48_inner_holo"
             android:pivotX="50%"
             android:pivotY="50%"
             android:fromDegrees="0"
             android:toDegrees="720" /> <!-- Like this -->
    </item>
  </layer-list>
相关问题