如何使用2个旋转圆圈获得与ICS相同的未定义ProgressBar?

时间:2012-03-15 14:47:01

标签: android progress-bar android-4.0-ice-cream-sandwich

我目前正在撰写一个开源项目,旨在将着名的Holo主题移植到之前版本的Android(自1,6 !!!)

一切正常,我为自己的工作感到自豪,但我现在面临的问题是让ProgressBar完全像ICS一样。

我使用的是与Android源相同的xml代码:(progress_medium_holo.xml)

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

使用相同的png:

spinner_76_outer_holo.png和spinner_76_inner_holo.png

enter image description here白色pic =&gt; enter image description here

但不幸的是,我只得到一个圈子......

如果你不明白我的意思,你可以在pre-ICS设备上试试这个应用程序:

https://play.google.com/store/apps/details?id=com.WazaBe.HoloDemo

完整的资料来源:https://github.com/ChristopheVersieux/HoloEverywhere

非常感谢你的帮助

enter image description here

3 个答案:

答案 0 :(得分:12)

刚刚找到答案!

https://stackoverflow.com/a/8697806/327402

非常有用的帖子!

确实有一个平台限制,虽然它不是你可能想到的。问题是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 :(得分:4)

作为Profete162答案的补充说明:我知道杰克已经成功地绕过了他在SherlockActionBar实施中的限制,并使两个旋转图像都可见。查看abs__progress_medium_holo.xml的源代码,看起来他只是简单地翻转fromDegreestoDegrees值,尽管可能还有更多我不知道的内容。

答案 2 :(得分:0)

我不确定,但我认为图层列表中的<rotate>标记与Android 1.6完全不兼容。

通过查看Donut(1.6)源代码,我看到spinner是以这种方式实现的(progress_medium.xml):

<animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/spinner_black_48"
    android:pivotX="50%"
    android:pivotY="50%"
    android:framesCount="12"
    android:frameDuration="100" />

你可以尝试使用Holo drawables。

希望它有所帮助,
Yuvi