2012-03-15 5 views
27

Actualmente estoy escribiendo un proyecto de código abierto que pretende portar el famoso tema Holo a versiones anteriores de Android (desde 1,6 !!!)¿Cómo puedo obtener el mismo ProgressBar indefinido como ICS con 2 círculos giratorios?

Todo funciona bien y estoy muy orgulloso de mi trabajo, pero el El problema que estoy enfrentando ahora es hacer que la ProgressBar se parezca totalmente a la de ICS.

que utilizan el mismo código XML de fuente de 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> 

Con png misma:

spinner_76_outer_holo.png y spinner_76_inner_holo.png

enter image description here blanco pic =>enter image description here

Pero desafortunadamente, solo obtengo un círculo ...

Si usted no entiende lo que quiero decir, puede probar esta aplicación en un dispositivo de pre-ICS:

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

fuente completo está aquí: https://github.com/ChristopheVersieux/HoloEverywhere

Gracias mucho por su ayuda

enter image description here

+0

¿Podría proporcionar el proyecto completo como archivo zip? –

+0

fuente completo está aquí: https://github.com/ChristopheVersieux/HoloEverywhere –

+0

Mientras ve el código fuente me preguntaba, por qué tomó las XMLs animación en la carpeta de diseño. Póngalos en una carpeta anim, para que otros programadores no se confundan. –

Respuesta

12

acaba de encontrar la respuesta aquí!

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

Poste muy útil!

De hecho, existe una limitación de la plataforma, aunque no es lo que se podría pensar. El problema es que pre-API11, RotateDrawable tenía un código crudo para exigir que la animación gire en sentido horario comprobando si toDegrees era mayor que fromDegrees; si no, los dos fueron forzados iguales el uno al otro. Si modificó su ejemplo para hacer que el segundo elemento se mueva hacia adelante (de 0 a 720, o incluso de -720 a 0), ambas imágenes se animarían bien en todas las plataformas; aunque me doy cuenta de que eso derrota el propósito de lo que pretendes.

Tome un vistazo a la versión en caché Google tiene CodeSearch de RotateDrawable.inflate(), que es la versión 2.3 del método utilizado para convertir el XML en el objeto, y verá lo que quiero decir.

RotateDrawable.java ... el código ofensivo está alrededor de la línea 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 

Esto toma un bloque de XML como el segundo elemento que tiene allí, y lo convierte en un RotateDrawable que termina con el mismo valor para fromDegrees y toDegrees (en su caso, 720), provocando que la imagen simplemente quédate quieto. Puede hacer una prueba visible estableciendo el valor inicial en algún valor, no en un múltiplo de 360 ​​(como 765). Verá que la imagen aún no se anima, sino que se gira a la coordenada inicial.

Esta comprobación incómoda fue eliminado en las fuentes/ICS de nido de abeja, por lo que se puede hacer al revés rotación en esas plataformas. Además, no parece que hay una manera de establecer estos valores de código Java, por lo que una costumbre RotateDrawableCompat puede ser en el futuro :)

HTH

0

no estoy seguro, pero creo que la etiqueta <rotate> dentro de una capa-lista es simplemente no es compatible con Android 1.6.

Al mirar en el Donut (1.6) el código fuente veo que la ruleta se lleva a cabo de esta manera (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" /> 

usted podría tratar de que con los dibujables Holo.

creo que sirve,
Yuvi

+0

LayerDrawable: Desde: API Nivel 1: Descripción general de la clase A Drawable that manages una serie de otros Drawables. Estos se dibujan en orden de matriz, por lo que el elemento con el índice más grande se dibujará en la parte superior. Se puede definir en un archivo XML con el elemento . Cada Disponibles en la capa se define en una anidada http://developer.android.com/reference/android/graphics/drawable/LayerDrawable.html –

+0

Ok ... pero ¿ha probado el 'animado-rotación'? – YuviDroid

4

Como adición a la respuesta de Profete162: Yo sé que Jake ha logrado evitar esta limitación en su implementación para SherlockActionBar y hacer visibles las imágenes giradas. Mirar el código fuente para abs__progress_medium_holo.xml parece que simplemente se volcó alrededor de los valores fromDegrees y toDegrees, aunque podría haber más a él que yo no sepa.

+0

Desafortunadamente, modificar desde/hacia no cambia nada ... –

Cuestiones relacionadas