我试图动画两层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之前的目标)来实现所需的功能?
答案 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
,其fromDegrees
和toDegrees
的值相同(在您的情况下) ,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>