我目前正在撰写一个开源项目,旨在将着名的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
白色pic =&gt;
但不幸的是,我只得到一个圈子......
如果你不明白我的意思,你可以在pre-ICS设备上试试这个应用程序:
https://play.google.com/store/apps/details?id=com.WazaBe.HoloDemo
完整的资料来源:https://github.com/ChristopheVersieux/HoloEverywhere
非常感谢你的帮助
答案 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
,其fromDegrees
和toDegrees
的值相同(在您的情况下) ,720),使图像简单地静止不动。您可以通过将起始值设置为某个值而不是360的倍数(如765)来显示测试结果。您将看到图像仍然没有动画,但会旋转到初始坐标。
在Honeycomb / ICS源中删除了这个尴尬的检查,这就是为什么你可以在这些平台上进行向后旋转的原因。此外,它看起来似乎没有办法从Java代码设置这些值,因此您的未来可能会有自定义RotateDrawableCompat
:)
HTH
答案 1 :(得分:4)
作为Profete162答案的补充说明:我知道杰克已经成功地绕过了他在SherlockActionBar实施中的限制,并使两个旋转图像都可见。查看abs__progress_medium_holo.xml
的源代码,看起来他只是简单地翻转fromDegrees
和toDegrees
值,尽管可能还有更多我不知道的内容。
答案 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