27 votes

Comment puis-je obtenir la même ProgressBar non définie qu'ICS avec 2 cercles rotatifs ?

Je suis actuellement en train d'écrire un projet open source qui vise à porter le célèbre thème Holo sur les versions précédentes d'Android (depuis la 1,6 ! !!).

Tout fonctionne bien et je suis vraiment fier de mon travail, mais le problème que je rencontre maintenant est de faire en sorte que la barre de progression ressemble totalement à celle de l'ICS.

J'ai utilisé le même code xml que la source 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>

Avec le même png :

spinner_76_outer_holo.png et spinner_76_inner_holo.png

enter image description here pic blanc => enter image description here

Mais malheureusement, je n'ai qu'un seul cercle...

Si vous ne comprenez pas ce que je veux dire, vous pouvez essayer cette application sur un appareil pré-ICS :

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

LA SOURCE COMPLÈTE EST ICI : https://github.com/ChristopheVersieux/HoloEverywhere

Merci beaucoup pour votre aide

enter image description here

12voto

Waza_Be Points 14584

Je viens de trouver la réponse ici !

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

Article très utile !

Il y a en effet une limitation de la plate-forme, bien que ce ne soit pas ce que vous pourriez penser. Le problème est que les programmes pré-API11, RotateDrawable contenait un code rudimentaire exigeant que l'animation tourne dans le sens des aiguilles d'une montre en vérifiant si toDegrees était supérieure à fromDegrees ; sinon, les deux étaient forcés d'être égaux l'un à l'autre. Si vous modifiez votre exemple pour que le deuxième élément se déplace vers l'avant (de 0 à 720, ou même de -720 à 0), les deux images s'animeraient correctement sur toutes les plates-formes, même si je réalise que cela va à l'encontre de votre objectif.

Jetez un coup d'œil à la version en cache de Google Codesearch. RotateDrawable.inflate() qui est la version 2.3 de la méthode utilisée pour transformer le XML en objet, et vous verrez ce que je veux dire.

RotateDrawable.java ...le code incriminé se trouve à la ligne 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

Cela prend un bloc XML, comme le deuxième élément que vous avez là, et le transforme en un fichier de type RotateDrawable qui aboutit à la même valeur pour fromDegrees y toDegrees (dans votre cas, 720), ce qui fait que l'image reste simplement immobile. Vous pouvez tester cela de manière visible en définissant la valeur de départ à une valeur qui n'est pas un multiple de 360 (comme 765). Vous verrez que l'image ne s'anime toujours pas, mais qu'elle est tournée vers la coordonnée initiale.

Cette vérification maladroite a été supprimée dans les sources Honeycomb/ICS, ce qui explique pourquoi vous pouvez effectuer une rotation arrière sur ces plateformes. De plus, il ne semble pas qu'il y ait un moyen de définir ces valeurs à partir du code Java. RotateDrawableCompat peut être dans votre avenir :)

HTH

4voto

MH. Points 21672

En complément de la réponse de Profete162 : Je sais que Jake a réussi à contourner cette limitation dans son implémentation de SherlockActionBar et à rendre les deux images visibles. En regardant le code source de abs__progress_medium_holo.xml il semble qu'il ait simplement retourné le formulaire fromDegrees y toDegrees mais il y a peut-être d'autres éléments que je ne connais pas.

0voto

YuviDroid Points 1057

Je ne suis pas sûr, mais je pense que le <rotate> à l'intérieur d'une liste de couches n'est tout simplement pas compatible avec Android 1.6.

En regardant dans le code source de Donut (1.6), je vois que le spinner est implémenté de cette façon (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" />

Vous pourriez essayer de le faire avec les objets dessinés Holo.

J'espère que cela vous aidera,
Yuvi

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X