Как я могу получить тот же неопределенный ProgressBar, что и ICS с 2 вращающимися кругами? - PullRequest
27 голосов
/ 15 марта 2012

В настоящее время я пишу проект с открытым исходным кодом, целью которого является портирование известной темы Holo на предыдущие версии Android (начиная с 1,6 !!!)

Все отлично работает, и я действительно горжусь своей работой, но проблема, с которой я сейчас сталкиваюсь, заключается в том, чтобы ProgressBar полностью выглядел как ICS.

Я использовал тот же код xml, что и источник Android: (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 white pic => enter image description here

Но, к сожалению, я получаю только один круг ...

Если вы не понимаете, о чем я, вы можете попробовать это приложение на устройстве до ICS:

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

ПОЛНЫЙ ИСТОЧНИК ЗДЕСЬ: https://github.com/ChristopheVersieux/HoloEverywhere

Большое спасибо за вашу помощь

enter image description here

Ответы [ 3 ]

12 голосов
/ 20 марта 2012

Только что нашел ответ здесь!

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

Очень полезный пост!

Действительно, есть ограничение платформы, хотя это не то, что вы могли бы подумать. Проблема в том, что в pre-API11 RotateDrawable был какой-то грубый код, требующий, чтобы анимация вращалась по часовой стрелке, проверяя, было ли toDegrees больше fromDegrees; если нет, то оба были вынуждены сравняться друг с другом. Если вы изменили свой пример, чтобы второй элемент двигался в прямом направлении (от 0 до 720 или даже от -720 до 0), оба изображения будут хорошо анимироваться на всех платформах; хотя я понимаю, что это побеждает цель того, к чему ты стремишься.

Взгляните на кэшированную версию Google Codesearch с RotateDrawable.inflate(), которая является версией 2.3 метода, используемого для превращения XML в объект, и вы поймете, что я имею в виду.

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 может быть в вашем будущем:)

НТН

4 голосов
/ 22 марта 2012

Как дополнение к ответу Profete162: я знаю, что Джейку удалось обойти это ограничение в своей реализации для SherlockActionBar и сделать видимыми оба вращающихся изображения. Глядя на исходный код для abs__progress_medium_holo.xml, похоже, что он просто перевернул значения fromDegrees и toDegrees, хотя, возможно, есть еще кое-что, о чем я не знаю.

0 голосов
/ 18 марта 2012

Я не уверен, но я думаю, что тег <rotate> внутри списка слоев просто не совместим с Android 1.6.

Просматривая исходный код Donut (1.6), я вижу, чтоСпиннер реализован следующим образом (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" />

Вы можете попробовать это с помощью рисования Холо.Yuvi

...