Autore Topic: AnimationDrawable apect ratio  (Letto 525 volte)

Offline wlf

  • Utente normale
  • ***
  • Post: 337
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    Xperia
AnimationDrawable apect ratio
« il: 17 Ottobre 2014, 16:01:50 CEST »
0
Salve,
ho una immagine inserita in un LinearLayout:

Codice: [Seleziona]
        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginBottom="10dp"
            android:layout_marginTop="10dp"
            android:scaleType="fitCenter"
            android:adjustViewBounds="true"
            android:src="@drawable/ic_connection0" />

Con questa vengono mantenute le proporzioni; alla pressione di un bottone vorrei far partire una animazione (AnimationDrawable).

Codice: [Seleziona]
                imgConnection.setBackgroundResource(R.drawable.connection);
                connectAnimation = (AnimationDrawable) imgConnection.getBackground();

Questa parte perfettamente ma non viene rispettato l'aspect ratio ed ho un effetto sgradevole con l'immagine src sottostante; ho quindi provveduto cercando di mantenere le proporzioni anche dell'animazione:

Codice: [Seleziona]
                imgConnection.setBackgroundResource(R.drawable.connection);
                imgConnection.setAdjustViewBounds(true);
                imgConnection.setScaleType(ScaleType.FIT_CENTER);
                connectAnimation = (AnimationDrawable) imgConnection.getBackground();

Questo tentativo è stato infruttuoso; esiste un modo per mantenere le proporzioni? Se metto l'animazione nel src ho il problema che dovrei far partire una seconda animazione che verrebbe deformata a sua volta ... :(

Suggerimenti in merito? Grazie! :)

Offline arlabs

  • Utente normale
  • ***
  • Post: 430
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:AnimationDrawable apect ratio
« Risposta #1 il: 17 Ottobre 2014, 16:20:04 CEST »
+1
Fammi capire, l'immagine statica e l'AnimationDrawable dovrebbero essere piazzati nello stesso spazio, giusto?

Puoi usare una level-list e metterci sia l'animazione che l'immagine statica

Codice (XML): [Seleziona]
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:maxLevel="0" android:drawable="@drawable/ic_connection0" />
    <item android:maxLevel="1" android:drawable="@drawable/connection" />
</level-list>

E selezionare l'uno o l'altro da codice:

Codice (Java): [Seleziona]
        ImageView iv = (ImageView)activity.findViewById(R.id.imageView1);
        iv.setImageLevel( [0-1] );

Ciao.

Offline wlf

  • Utente normale
  • ***
  • Post: 337
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    Xperia
Re:AnimationDrawable apect ratio
« Risposta #2 il: 17 Ottobre 2014, 18:16:14 CEST »
0
Fammi capire, l'immagine statica e l'AnimationDrawable dovrebbero essere piazzati nello stesso spazio, giusto?

Confermo, prima l'immagine statica ic_connection0, quanto tappo sul button faccio partire l'animazione connection, e quando la connessione è andata a buon fine faccio partire l'animazione connected.

Citazione
Puoi usare una level-list e metterci sia l'animazione che l'immagine statica

Non ho trovato una voce specifica in Eclipse per generare la level-list, l'ho creata in drawable a mano ... ;)
Esiste il modo di crearla da Eclipse?

Citazione
E selezionare l'uno o l'altro da codice:

Ho messo la level list nella src:
Codice: [Seleziona]
        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginBottom="10dp"
            android:layout_marginTop="10dp"
            android:scaleType="fitCenter"
            android:adjustViewBounds="true"
            android:src="@drawable/level_connect" />

... poi richiamo le animazioni nel seguente modo:

Codice: [Seleziona]
                imgConnection.setImageLevel(1);
                connectAnimation = (AnimationDrawable) imgConnection.getBackground();

In esecuzione però mi da il seguente errore:

Codice: [Seleziona]
10-17 18:01:08.010: E/AndroidRuntime(10496): Caused by: java.lang.NullPointerException
10-17 18:01:08.010: E/AndroidRuntime(10496):         at com.example.prova.MainActivity$ConnectTask.onPreExecute(MainActivity.java:607)

Alla riga indicata c'è la start() dell'animazione:

Codice: [Seleziona]
connectAnimation.start();
Probabilmente sono io che sto sbagliando, ma da quello che ho capito la level-list non è altro che un aggregatore di più immagini che possono essere semplicemente richiamati dal setImageLevel. Speravo che con tale tecnica ereditasse scaleType e adjustViewBounds ...  :(



Offline arlabs

  • Utente normale
  • ***
  • Post: 430
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:AnimationDrawable apect ratio
« Risposta #3 il: 17 Ottobre 2014, 18:58:32 CEST »
+1
Immagino che imgConnection sia la tua ImageView, giusto?

Non devi nemmeno settarlo nel "background", per l'ImageView si usa il "src".

Cmq, se hai impostato il LevelListDrawable nel "src", ti è sufficiente fare setImageLevel.
L'animazione parte da sola.



Post unito: 17 Ottobre 2014, 19:01:58 CEST
P.S. Cmq, il cast è sbagliato, in quel caso il getBackground ti avrebbe tornato un LevelListDrawable.
Se a quello chiami getCurrent ti ritorna il Drawable corrente (che può essere il tuo AnimationDrawer)
« Ultima modifica: 17 Ottobre 2014, 19:01:58 CEST da arlabs, Reason: Merged DoublePost »

Offline wlf

  • Utente normale
  • ***
  • Post: 337
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    Xperia
Re:AnimationDrawable apect ratio
« Risposta #4 il: 17 Ottobre 2014, 19:40:43 CEST »
0
Immagino che imgConnection sia la tua ImageView, giusto?

Ottima immaginazione, è l'ImageView della imageView1! ;)

Citazione
Non devi nemmeno settarlo nel "background", per l'ImageView si usa il "src".

Ok, nel dubbio io l'avevo lasciato ...

Citazione
Cmq, se hai impostato il LevelListDrawable nel "src", ti è sufficiente fare setImageLevel.
L'animazione parte da sola.

Si, l'ho impostato nel src; mi stai dicendo che non serve nemmeno che faccio la start() dell'animazione?
Codice: [Seleziona]
connectAnimation.start();
Citazione
P.S. Cmq, il cast è sbagliato, in quel caso il getBackground ti avrebbe tornato un LevelListDrawable.
Se a quello chiami getCurrent ti ritorna il Drawable corrente (che può essere il tuo AnimationDrawer)

Praticamente potrebbe essere accaduto che il getBackground prenda il primo LevelListDrawable e quindi la successiva start() fallisca perché il primo è una immagine fissa ...
E' questo che intendevi? ;)


--- edit ---
Funziona lasciando solamente il setImageLevel(); non ci speravo più nel riuscire a mantenere le proporzioni ... Arlabs sei mitico! ;)
« Ultima modifica: 20 Ottobre 2014, 09:45:14 CEST da wlf »

Offline arlabs

  • Utente normale
  • ***
  • Post: 430
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:AnimationDrawable apect ratio
« Risposta #5 il: 20 Ottobre 2014, 10:49:23 CEST »
+1
Praticamente potrebbe essere accaduto che il getBackground prenda il primo LevelListDrawable e quindi la successiva start() fallisca perché il primo è una immagine fissa ...
E' questo che intendevi? ;)

No, intendevo che, immaginando che al background tu abbia associato il nuovo drawable che contiene la level-list, chiamando il metodo getBackground(), ti viene tornato un oggetto di tipo LevelListDrawable che non puoi castare a AnimationDrawable (ma nemmeno a BitmapDrawable)

LevelListDrawable è un DrawableContainer. Se avessi vouto accedere all'AnimationDrawable diciamo che avresti dovuto scrivere così:

Codice (Java): [Seleziona]
   imgConnection.setImageLevel(1);
   LevelListDrawable levelList = (LevelListDrawable)imgConnection.getBackground();
   connectAnimation = (AnimationDrawable) levelList.getCurrent();
   connectAnimation.start();

Ciao.

Offline wlf

  • Utente normale
  • ***
  • Post: 337
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    Xperia
Re:AnimationDrawable apect ratio
« Risposta #6 il: 20 Ottobre 2014, 11:29:57 CEST »
0
Spiegazione chiara ed esaustiva ... ;)

Invidio il tuo grado di preparazione; io ho iniziato con Android da solo qualche mese, ma sono ancora in alto mare ... :(
Potresti eventualmente consigliarmi magari qualche buon libro per colmare le mie grosse lacune?

Posso chiederti quanti mesi hai tu di esperienza nel campo delle App?

Offline arlabs

  • Utente normale
  • ***
  • Post: 430
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:AnimationDrawable apect ratio
« Risposta #7 il: 21 Ottobre 2014, 10:15:16 CEST »
0
Invidio il tuo grado di preparazione;

...ti ringrazio, ma mi sa che ti sei preso un abbaglio :D

Lavoro su android da meno di un anno... ho una preparazione frammentaria. Alcune cose le conosco meglio perché le ho usate, altre cose non le conosco per nulla...

Ciao.

Offline arlabs

  • Utente normale
  • ***
  • Post: 430
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:AnimationDrawable apect ratio
« Risposta #8 il: 09 Dicembre 2014, 16:21:08 CET »
0
Riprendo questo post per avvisare wlf che ciò che ti avevo detto... sembra non funzionare più!

Se metti un animation-list all'interno di un level-list, ti avevo detto che quando facevi setImageLevel l'animazione partiva da sola.

Ecco a me ora questo su Lollopop non accade più (almeno non su Nexus 5).
Dev'essere cambiato qualcosa.

Tra l'altro ora io non so come ovviare alla cosa... :S

Offline wlf

  • Utente normale
  • ***
  • Post: 337
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    Xperia
Re:AnimationDrawable apect ratio
« Risposta #9 il: 09 Dicembre 2014, 23:51:06 CET »
0
Riprendo questo post per avvisare wlf che ciò che ti avevo detto... sembra non funzionare più!

Grazie della cortesia! ;)

Citazione
Se metti un animation-list all'interno di un level-list, ti avevo detto che quando facevi setImageLevel l'animazione partiva da sola.
Ecco a me ora questo su Lollopop non accade più (almeno non su Nexus 5).

Non ho idea se avevi testato su diversi dispositivi KitKat e/o Jelly Bean; io ho riscontrato dei comportamenti diversi, spesso dipende dal dispositivo e dall'Animation-list che fai partire. Ho una animazione con 4-5 immagini che su alcuni dispositivi rimane alla prima immagine mente l'Animation-list con solo 2 immagini funziona. La stessa App su alcuni smartphone funziona in entrambe i casi, altri no! :(

Citazione
Dev'essere cambiato qualcosa.
Tra l'altro ora io non so come ovviare alla cosa... :S

Quante immagini hai nella tua Animation-list? Prova casomai a metterne solo 2 per testare se ti funziona, per discriminare se non funziona più realmente o è solo dovuto ad un maggiore consumo di risorse ... ;)

Offline arlabs

  • Utente normale
  • ***
  • Post: 430
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:AnimationDrawable apect ratio
« Risposta #10 il: 10 Dicembre 2014, 11:22:59 CET »
0
Avevo provato su tutti i dispositivi di test che ho a disposizione (3 telefoni e 3 tablet) con diverse versioni di Android dalla 2.3.6 alla 4.4.4
E poi qualche prova su emulatore per le versioni mancanti

Cmq, io non ho una sola animazione, ma ho diverse animazioni (da 3 a 5 frame) in diversi "level". Ho comunque risolto andando a chiamare la start di tutte le animazioni.
Non ho però testato su altri dispositivi.
Vedi in questo post di ieri:
http://www.anddev.it/index.php/topic,15464.msg77949.html#msg77949

Ciao.

Offline wlf

  • Utente normale
  • ***
  • Post: 337
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    Xperia
Re:AnimationDrawable apect ratio
« Risposta #11 il: 10 Dicembre 2014, 14:01:39 CET »
0
Cmq, io non ho una sola animazione, ma ho diverse animazioni (da 3 a 5 frame) in diversi "level".

Io vado dai 2 frame ai 6 frame; considerando che le dimensioni sono abbastanza "generose", l'immagine prende almeno i 2/3 dello schermo, come anticipato mi ritrovo che su alcuni dispositivi vedo solamente il primo frame dell'animation list con 6 frame, mentre quello con solo 2 frame sembra non aver problemi di sorta.
Nel tuo caso, prima dell'aggiunta della start, accadeva la stessa cosa, ti visualizzava perlomeno il primo frame o nulla?

Citazione
Ho comunque risolto andando a chiamare la start di tutte le animazioni.

Il mio caso sembra dipendere più dalla scarsità di risorse che non dal SO. Con Lollipop non ho ancora avuto l'occasione di testarlo ...
Prima di aggiungere la start hai magari testato le animazioni con solo 2 frame se si comportavano allo stesso modo?

Offline arlabs

  • Utente normale
  • ***
  • Post: 430
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:AnimationDrawable apect ratio
« Risposta #12 il: 10 Dicembre 2014, 15:16:27 CET »
0
Le mie animazioni sono piccole.

Solo su Lollipop mi visualizzava su tutte le animazioni solo il primo frame (cioé, un frame... non ho controllato fosse il primo, ma lo suppongo).
Ora con la start funziona.