Autore Topic: Animazione ferma su Lollipop  (Letto 926 volte)

Offline arlabs

  • Utente normale
  • ***
  • Post: 430
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Animazione ferma su Lollipop
« il: 09 Dicembre 2014, 11:10:40 CET »
0
All'aggiornamento a Lollipop, mi sono accorto che in una mia App, le icone animate... non lo sono più (su Nexus 5, non ho provato altrove)
La App non la aggiorno da mesi.

Qualcuno ha idea se c'è stato qualche "rottura" in proposito con Lollipop?
Io non chiamo (e non ho mai chiamato) alcuna "start" dell'animazione... partiva da sola.

Le icone animate sono definite esclusivamente nelle risorse (nessuna riga di codice) in un modo abbastanza "strutturato"
E' un LevelList di drawables.
Alcuni drawable sono direttamente delle AnimationList, altri sono LayerList, in alcuni layer dei quali c'è un AnimationList.

Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:maxLevel="0" android:drawable="@drawable/ic_weather_sun" />
    <item android:maxLevel="1" android:drawable="@drawable/ic_weather_cloudsun" />
    <item android:maxLevel="2" android:drawable="@drawable/ic_weather_cloud" />
    <item android:maxLevel="3" android:drawable="@drawable/ic_weather_rain" />
    <item android:maxLevel="4" android:drawable="@drawable/ic_weather_rainstorm" />
</level-list>

Per esempio, questo è l'xml ic_weather_rain:
Codice (XML): [Seleziona]
<layer-list
   xmlns:android="http://schemas.android.com/apk/res/android" >
    <item>
        <animation-list android:oneshot="false">
            <item android:drawable="@drawable/ic_weather_layer_rain1" android:duration="100" />
            <item android:drawable="@drawable/ic_weather_layer_rain2" android:duration="100" />
            <item android:drawable="@drawable/ic_weather_layer_rain3" android:duration="100" />
            <item android:drawable="@drawable/ic_weather_layer_rain4" android:duration="100" />
        </animation-list>
    </item>
    <item android:drawable="@drawable/ic_weather_layer_cloudcolor1" />
    <item android:drawable="@drawable/ic_weather_layer_cloud2" />
    <item android:drawable="@drawable/ic_weather_layer_cloud1" />
</layer-list>

Ciao.

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Animazione ferma su Lollipop
« Risposta #1 il: 09 Dicembre 2014, 12:31:46 CET »
0
Non so niente in proposito, ma si, in Lollipop hanno ristrutturato il framework grafico e le animazioni, per cui qualche effetto collaterale potrebbe esserci. Se, come sembra, è strutturale, dovrebbero esserci diverse persone con lo stesso problema.

NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline arlabs

  • Utente normale
  • ***
  • Post: 430
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Animazione ferma su Lollipop
« Risposta #2 il: 09 Dicembre 2014, 15:23:00 CET »
0
Sì bradipado, l'avevo pensato anche io... ma non ho trovato nulla a riguardo. Né nei bug aperti android, né su stackoverflow...

Post unito: 09 Dicembre 2014, 16:35:39 CET
Per ora ho ovviato alla cosa chiamando esplicitamente la start.
Data la complessità della struttura ho dovuto andarmi a "cercare" tutti gli AnimationDrawable, così:

Codice (Java): [Seleziona]
        Drawable drawable = meteo.getDrawable();
        if( (drawable != null) && (drawable instanceof LevelListDrawable) )
        {
            LevelListDrawable levelList = (LevelListDrawable)drawable;
            drawable = levelList.getCurrent();
            if( drawable != null )
            {
                if( drawable instanceof AnimationDrawable )
                    ((AnimationDrawable)drawable).start();
                else if( drawable instanceof LayerDrawable )
                {
                    LayerDrawable layerList = (LayerDrawable)drawable;
                    for( int layerId = 0; layerId < layerList.getNumberOfLayers(); layerId++ )
                    {
                        drawable = layerList.getDrawable(layerId);
                        if( (drawable != null) && (drawable instanceof AnimationDrawable) )
                            ((AnimationDrawable)drawable).start();
                    }
                }
            }
        }

Ovviamente il funzionamento è strettamente vincolato alla struttura dei drawable xml che ho usato.

Se, cmq, qualcuno sapesse darmi spiegazioni su quello che è accaduto, sare grato.

Ciao.
« Ultima modifica: 09 Dicembre 2014, 16:35:39 CET da arlabs, Reason: Merged DoublePost »

Offline wlf

  • Utente normale
  • ***
  • Post: 319
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    Xperia
Re:Animazione ferma su Lollipop
« Risposta #3 il: 07 Aprile 2015, 12:40:41 CEST »
0
non ho trovato nulla a riguardo. Né nei bug aperti android, né su stackoverflow...

Ho trovato anche io in questi giorni lo stesso problema ... nel mio caso su un LG G2 aggiornato a Lollipop mentre prima funzionava correttamente con KitKat. :(

Non sarebbe bastato semplicemente:

Codice: [Seleziona]
((AnimationDrawable) meteo.getDrawable().getCurrent()).start();
Non mi è chiaro cosa sia un LayerDrawable. :(

Comunque se non mi ricordo male eri stato tu a consigliarmi i LevelList e dirmi che non andava utilizzato lo start(); a quanto pare fino a KitKat era facoltativo, ora invece è diventato obbligatorio.
Che l'abbiano fatto apposta perché avevi già venduto la pelle dell'orso? ;)
 :D :D :D

Offline arlabs

  • Utente normale
  • ***
  • Post: 430
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Animazione ferma su Lollipop
« Risposta #4 il: 07 Aprile 2015, 14:55:26 CEST »
0
Ho trovato anche io in questi giorni lo stesso problema ... nel mio caso su un LG G2 aggiornato a Lollipop mentre prima funzionava correttamente con KitKat. :(

Non sarebbe bastato semplicemente:

Codice: [Seleziona]
((AnimationDrawable) meteo.getDrawable().getCurrent()).start();

No, perché in alcuni casi il cast avrebbe fallito, non essendo sempre un AnimationDrawable.
Cmq, ora uso un metodo un po' più generico:
Codice (Java): [Seleziona]
    public static void startAllAnimations( Drawable drawable )
    {
        if( drawable != null )
        {
            if( (drawable instanceof StateListDrawable) || (drawable instanceof LevelListDrawable) )
            {
                startAllAnimations(drawable.getCurrent());
            }
            else if( drawable instanceof LayerDrawable )
            {
                LayerDrawable layerList = (LayerDrawable)drawable;
                for( int layerId = 0; layerId < layerList.getNumberOfLayers(); layerId++ )
                {
                    startAllAnimations( layerList.getDrawable(layerId) );
                }
            }
            else if( drawable instanceof InsetDrawable )
            {
                if( Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
                    startAllAnimations( ((InsetDrawable) drawable).getDrawable() );
            }
            else if( drawable instanceof ScaleDrawable )
            {
                startAllAnimations( ((ScaleDrawable) drawable).getDrawable() );
            }
            else if( drawable instanceof RotateDrawable )
            {
                startAllAnimations( ((RotateDrawable) drawable).getDrawable() );
            }
            else if( drawable instanceof AnimationDrawable )
            {
                ((AnimationDrawable) drawable).start();
            }
        }
    }

Non mi è chiaro cosa sia un LayerDrawable. :(

Rappresenta una lista di drawable sovrapposti fra di loro. Qua spiega un po' tutti i drawable:
http://developer.android.com/guide/topics/resources/drawable-resource.html

Comunque se non mi ricordo male eri stato tu a consigliarmi i LevelList e dirmi che non andava utilizzato lo start(); a quanto pare fino a KitKat era facoltativo, ora invece è diventato obbligatorio.
Che l'abbiano fatto apposta perché avevi già venduto la pelle dell'orso? ;)
 :D :D :D
Sì, ma non c'era garanzia. Non si accettano reclami né rimborsi ;)

Offline wlf

  • Utente normale
  • ***
  • Post: 319
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    Xperia
Re:Animazione ferma su Lollipop
« Risposta #5 il: 07 Aprile 2015, 16:28:33 CEST »
0
No, perché in alcuni casi il cast avrebbe fallito, non essendo sempre un AnimationDrawable.

Ok, questo perché ti sei creato un metodo che viene riutilizzato nel tuo codice per far partire tutte le animazioni; tale metodo, se non ho capito male richiama se stesso finché non è un AnimationDrawable per farlo partire.
E' ingegnoso; nel mio caso ho potuto farlo in una semplice istruzione perché ho solo una ImageView a cui attribuire un paio di livelli con la setImageLevel().

Citazione
Rappresenta una lista di drawable sovrapposti fra di loro. Qua spiega un po' tutti i drawable:
http://developer.android.com/guide/topics/resources/drawable-resource.html

Non mi è chiaro cosa ne venga fuori nella UI; per utilizzarlo bisognerebbe avere una idea del risultato ... :)

Citazione
Sì, ma non c'era garanzia. Non si accettano reclami né rimborsi ;)

Questo era sottinteso, anche perché per un rimborso prima dovrei pagarti ... ;)

PS. Ho notato che una animazione che mi funziona tranquillamente su alcuni modelli, su altri non funziona.

Praticamente ho due livelli il primo funziona il secondo no:

Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
       android:drawable="@drawable/ic_img0"
       android:duration="500"/>
    <item
       android:drawable="@drawable/ic_img3"
       android:duration="500"/>

</animation-list>

Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
       android:drawable="@drawable/ic_img0"
       android:duration="300"/>
    <item
       android:drawable="@drawable/ic_img1"
       android:duration="300"/>
    <item
       android:drawable="@drawable/ic_img2"
       android:duration="300"/>
    <item
       android:drawable="@drawable/ic_img3"
       android:duration="300"/>
    <item
       android:drawable="@drawable/ic_img2"
       android:duration="300"/>
    <item
       android:drawable="@drawable/ic_img1"
       android:duration="300"/>
   
</animation-list>

Le immagini sono tutte da 5K come dimensione (circa 350x350 pixel).
Il numero di immagini può incidere sulla visualizzazione o meno?

Offline arlabs

  • Utente normale
  • ***
  • Post: 430
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Animazione ferma su Lollipop
« Risposta #6 il: 07 Aprile 2015, 16:33:38 CEST »
+1
Non mi è chiaro cosa ne venga fuori nella UI; per utilizzarlo bisognerebbe avere una idea del risultato ... :)

Questo mi pareva abbastanza esplicativo...
http://developer.android.com/images/resources/layers.png

Sono diversi layer che si sovrappongono.


Il numero di immagini può incidere sulla visualizzazione o meno?

Non credo...

Offline wlf

  • Utente normale
  • ***
  • Post: 319
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    Xperia
Re:Animazione ferma su Lollipop
« Risposta #7 il: 07 Aprile 2015, 16:51:28 CEST »
0
Questo mi pareva abbastanza esplicativo...
http://developer.android.com/images/resources/layers.png

Sono diversi layer che si sovrappongono.

Grazie; non mi piace per nulla come effetto ... bleah ... a mio avviso è raccapricciante! :-\

Citazione
Non credo...

Beh allora qual'è la discriminante per cui il primo level funziona, con solo 2 immagini nella animation-list, mentre il secondo level no, con ben 6 immagini nella animation-list?  :-o
Ho provato pure a ridurlo a 4 e non funge ... :(

Altra cosa che mi lascia perplesso è che dipende dal modello di smartphone, su alcuni va tranquillamente, su altri no! :(

--- edit ---
L'assurdo è che se inverto le animazioni, prima faccio partire la level con 2 immagini e poi quella con 6 immagini funzionano entrambe. :-o
Praticamente se faccio partire prima la img.setImageLevel(1) e poi img.setImageLevel(2) funzionano entrambe mentre se faccio giusto il contrario prima la img.setImageLevel(2) e poi la img.setImageLevel(1) no!
Avevo provato anche a ridurre a solo 2 immagini anche la level 2 e non funzionava; per qualche motivo sembra che non gli piaccia la level 2; mistero! :(
« Ultima modifica: 07 Aprile 2015, 17:12:09 CEST da wlf »