gpt4 book ai didi

android - 为蜂窝前的两层可绘制项目设置动画

转载 作者:可可西里 更新时间:2023-11-01 19:06:15 25 4
gpt4 key购买 nike

我正在尝试为可绘制对象的两层设置动画,以实现蜂窝后不确定进度指示器的效果。 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com