我正在尝试为可绘制对象的两层设置动画,以实现蜂窝后不确定进度指示器的效果。 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 之前的语法)来实现所需的功能?
最佳答案
确实存在平台限制,尽管这可能不是您所想的那样。问题是 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 block ,就像您那里的第二个项目一样,并将其转换为 RotateDrawable
,最终 fromDegrees
和 的值相同toDegrees
(在您的情况下为 720),导致图像静止不动。您可以通过将起始值设置为某个不是 360 的倍数(如 765)的值来进行可见测试。您会看到图像仍然没有动画,而是旋转到初始坐标。
在 Honeycomb/ICS 源代码中删除了这个笨拙的检查,这就是为什么您可以在这些平台上进行向后旋转的原因。此外,看起来没有办法从 Java 代码设置这些值,因此自定义 RotateDrawableCompat
可能在您的 future :)
HTH
关于android - 为蜂窝前的两层可绘制项目设置动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8687071/