Подтвердить что ты не робот

Как я могу получить тот же undefined ProgressBar, что и ICS с 2 вращающимися кругами?

В настоящее время я пишу проект с открытым исходным кодом, целью которого является перенос знаменитой темы 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

4b9b3361

Ответ 1

Просто нашел ответ здесь!

fooobar.com/questions/193028/...

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

Существует действительно ограничение платформы, хотя это не то, что вы можете подумать. Проблема заключается в том, что для 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 the culprit

Этот блок XML, как и второй элемент, который у вас есть, превращает его в RotateDrawable, который заканчивается тем же значением для fromDegrees и toDegrees (в вашем случае 720), в результате чего чтобы просто стоять на месте. Вы можете проверить это, установив начальное значение на некоторое значение, не равное 360 (например, 765). Вы увидите, что изображение все еще не оживляет, но поворачивается до начальной координаты.

Эта неудобная проверка была удалена в источниках Honeycomb/ICS, поэтому вы можете делать обратную ротацию на этих платформах. Кроме того, не похоже, что есть способ установить эти значения из кода Java, поэтому пользовательский RotateDrawableCompat может быть в вашем будущем:)

НТН

Ответ 2

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

Ответ 3

Я не уверен, но я думаю, что тег <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.

Надеюсь, что это поможет,
Yuvi