Autore Topic: Animazione frame by frame  (Letto 2914 volte)

Offline FMSolution

  • Nuovo arrivato
  • *
  • Post: 38
  • Respect: +1
    • Google+
    • fabio.paciotti
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Mini
  • Play Store ID:
    FMsoluzioni
  • Sistema operativo:
    Microsoft Windows 7 x64
Animazione frame by frame
« il: 14 Settembre 2010, 12:46:17 CEST »
0
Sto cercando di creare un piccolo gioco che ha centralmente un'animazione che pensavo di creare con una sequenza di immagini che variano con il passare del tempo, ho provato a fare degli esperimenti ma non hanno avuto un buon esito, nel senso che ricevo spesso degli outofmemory, le immagini sono circa 90 di 176x176 px intorno ai 15 kb divise in tre scaglioni, il mio dubbio è se sto procedendo bene nel senso se è consigliabile utilizzare un'animazione frame by frame per tutte queste immagini opure esistono altri metodi più leggeri nell'uso di memoria.

Spero di essere stato abbastanza chiaro, grazie in anticipo.
Miei programmi: FMsoluzioni;

App sviluppate per conto terzi: TLS Travel; RadioNostalgia; 4Clubbers;

vincenzodicicco

  • Visitatore
Re:Animazione frame by frame
« Risposta #1 il: 14 Settembre 2010, 15:49:23 CEST »
0
Come la crei l'animazione? tramite xml ed un AnimationDrawable?Non ho mai provato a realizzare un animazione cosi lunga

Offline FMSolution

  • Nuovo arrivato
  • *
  • Post: 38
  • Respect: +1
    • Google+
    • fabio.paciotti
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Mini
  • Play Store ID:
    FMsoluzioni
  • Sistema operativo:
    Microsoft Windows 7 x64
Re:Animazione frame by frame
« Risposta #2 il: 14 Settembre 2010, 16:09:21 CEST »
0
l'utilizzo di xml ed un AnimationDrawable è il primo che ho scartato perchè se supero le 25 immagini mi da errore, diciamo che ho quasi risolto caricando le immagini in un array di bitmap e poi con un handler ogni tot secondi:
Codice (Java): [Seleziona]
imageview.setImageBitmap(bitmapArray[position++]);ma anche cosi non va poi tanto bene perchè quando ricarico l'activity del gioco mi da l'outofmemory.
Miei programmi: FMsoluzioni;

App sviluppate per conto terzi: TLS Travel; RadioNostalgia; 4Clubbers;

vincenzodicicco

  • Visitatore
Re:Animazione frame by frame
« Risposta #3 il: 14 Settembre 2010, 20:52:46 CEST »
0
l'utilizzo di xml ed un AnimationDrawable è il primo che ho scartato perchè se supero le 25 immagini mi da errore, diciamo che ho quasi risolto caricando le immagini in un array di bitmap e poi con un handler ogni tot secondi:
Codice (Java): [Seleziona]
imageview.setImageBitmap(bitmapArray[position++]);ma anche cosi non va poi tanto bene perchè quando ricarico l'activity del gioco mi da l'outofmemory.
Purtroppo non so aiutarti, pensavo che l'uso dell'animationDrawable fosse sufficiente  :-)

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +203
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:Animazione frame by frame
« Risposta #4 il: 15 Settembre 2010, 00:54:42 CEST »
0
l'utilizzo di xml ed un AnimationDrawable è il primo che ho scartato perchè se supero le 25 immagini mi da errore, diciamo che ho quasi risolto caricando le immagini in un array di bitmap e poi con un handler ogni tot secondi:
Codice (Java): [Seleziona]
imageview.setImageBitmap(bitmapArray[position++]);ma anche cosi non va poi tanto bene perchè quando ricarico l'activity del gioco mi da l'outofmemory.
se vuoi seguire questa strada, e non vuoi ricaricare ogni volta l'array, puoi salvare l'array in una variabile come descritto qui:
Salvataggio dello stato tra più Activity (aka variabili globali in Android) - Android Developers Italia
di modo da non doverlo ricaricare sempre.

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:Animazione frame by frame
« Risposta #5 il: 16 Settembre 2010, 09:27:01 CEST »
+1
In linea generale, quando si parla di animazioni mediante fotogrammi, sarebbe meglio creare un'unica immagine contenente tutti i frames, per poi prelevare (di volta in volta) quelli che servono, o indirizzare solo una parte dell'immagine per volta.
Si riducono i tempi di caricamento (anziché caricare n immagini se ne carica una sola, anche se più grande) e si ha un unico punto di accesso alle immagini.
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline FMSolution

  • Nuovo arrivato
  • *
  • Post: 38
  • Respect: +1
    • Google+
    • fabio.paciotti
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Mini
  • Play Store ID:
    FMsoluzioni
  • Sistema operativo:
    Microsoft Windows 7 x64
Re:Animazione frame by frame
« Risposta #6 il: 16 Settembre 2010, 09:49:42 CEST »
0
In linea generale, quando si parla di animazioni mediante fotogrammi, sarebbe meglio creare un'unica immagine contenente tutti i frames, per poi prelevare (di volta in volta) quelli che servono, o indirizzare solo una parte dell'immagine per volta.
Si riducono i tempi di caricamento (anziché caricare n immagini se ne carica una sola, anche se più grande) e si ha un unico punto di accesso alle immagini.

Molto interessante, come posso utilizzarlo su android? dovrei cambiare il tipo di immagini?
Miei programmi: FMsoluzioni;

App sviluppate per conto terzi: TLS Travel; RadioNostalgia; 4Clubbers;

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:Animazione frame by frame
« Risposta #7 il: 16 Settembre 2010, 10:28:19 CEST »
+2
Allora.
In generale ti crei un'immagine che contiene n frame in orizzontale ed m in verticale.
Partiamo dai tuoi dati: ogni singolo frame è di 176x176.
Supponiamo di creare un'immagine che contenga 3 frames per riga, avrai un'immagine di 528xAltezza (Altezza dipende da quanti frames totali hai (in questo caso = framesTotali / 3) ).

A questo punto, carichi l'immagine globale.
Ad ogni frame, prelevi la porzione di immagine (caricata precedentemente, ed una sola volta per tutte, all'inizio) che ti serve, e la copi nella tua imageView.

R.frawable.framesImage è la bitmap con tutti i frames di animazione
Ho generalizzato l'esempio, parametrizzando i tuoi valori.
Codice (Java): [Seleziona]
                //questo si fa all'inizio, ed una sola volta
                Bitmap framesBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.framesImage);
                int frameWidth = 176;
                int frameHeight = 176;
                int framesInRows = framesBitmap.getWidth() / frameWidth; // numero di fotogrammi per riga

                //questo lo si fa ad ogni frame
                int nFrame = 5; //numero del frame attuale nell'animazione (1......n)
               
                int xStart = (int)(nFrame / framesInRows) * frameHeight; //posizione x del frame nella bitmap
                int yStart = (((int)(nFrame % framesInRows))-1) * frameWidth; //posizione y del frame nella bitmap
               
                Bitmap currFrame = Bitmap.createBitmap(framesBitmap, xStart, yStart, frameWidth, frameHeight); //estrai il frame
                imageView.setImageBitmap(currFrame); //copi nella tua imageView

Spero che questo possa aiutarti, perché non ho assolutamente provato quello che ho scritto, ma in linea di massima dovrebbe funzionare.
Fammi sapere.
« Ultima modifica: 16 Settembre 2010, 10:53:29 CEST da JD, Reason: Usate i bbcode java e xml!! xD »
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline FMSolution

  • Nuovo arrivato
  • *
  • Post: 38
  • Respect: +1
    • Google+
    • fabio.paciotti
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Mini
  • Play Store ID:
    FMsoluzioni
  • Sistema operativo:
    Microsoft Windows 7 x64
Re:Animazione frame by frame
« Risposta #8 il: 16 Settembre 2010, 12:43:29 CEST »
0
ho provato il codice su un applicazione di prova è funziona perfettamente, ora devo creare l'immagine con tutti i frame e provarla sul mio gioco.

Grazie mille mi hai risolto un grosso problema.
Miei programmi: FMsoluzioni;

App sviluppate per conto terzi: TLS Travel; RadioNostalgia; 4Clubbers;

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:Animazione frame by frame
« Risposta #9 il: 16 Settembre 2010, 12:48:01 CEST »
0
@7h38ugg3r
Se ti va, potresti creare uno snippet col codice del tuo ultimo post, sono sicuro risulterebbe utile a molti ;)
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !

Offline FMSolution

  • Nuovo arrivato
  • *
  • Post: 38
  • Respect: +1
    • Google+
    • fabio.paciotti
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Mini
  • Play Store ID:
    FMsoluzioni
  • Sistema operativo:
    Microsoft Windows 7 x64
Re:Animazione frame by frame
« Risposta #10 il: 16 Settembre 2010, 12:58:08 CEST »
0
Si hai ragione, è un pò incasinato non è tanto bello da vedere lo sistemo un'attimo e poi lo pubblico.
Miei programmi: FMsoluzioni;

App sviluppate per conto terzi: TLS Travel; RadioNostalgia; 4Clubbers;

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:Animazione frame by frame
« Risposta #11 il: 16 Settembre 2010, 14:21:32 CEST »
0
@JD
Ho fatto come hai detto. Ho messo lo snippet nell'area apposita.
Una domanda: perché il codice che ho inserito non viene mostrato con il color syntaxing?
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:Animazione frame by frame
« Risposta #12 il: 16 Settembre 2010, 14:23:58 CEST »
0
Ho fatto come hai detto. Ho messo lo snippet nell'area apposita.
Grazie :)

Una domanda: perché il codice che ho inserito non viene mostrato con il color syntaxing?
quando inserisci il codice devi usare il bbcode "code=java" anziché solo "code", o più semplicemente clicca sull'icona .

Ci pensi tu a correggere?
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:Animazione frame by frame
« Risposta #13 il: 16 Settembre 2010, 15:31:14 CEST »
0
Ho sistemato.

grazie.
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline FMSolution

  • Nuovo arrivato
  • *
  • Post: 38
  • Respect: +1
    • Google+
    • fabio.paciotti
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Mini
  • Play Store ID:
    FMsoluzioni
  • Sistema operativo:
    Microsoft Windows 7 x64
Re:Animazione frame by frame
« Risposta #14 il: 16 Settembre 2010, 16:59:13 CEST »
0
Ecco ho risolto in questa maniera:
Codice (Java): [Seleziona]
public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        imgCtr = (ImageView)findViewById(R.id.ImageView01);
       
        framesBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.framesimages);
        frameWidth = 176;
        frameHeight = 176;
        framesInRows = framesBitmap.getWidth() / frameWidth;
       
        startAnimation();
    }

 private Runnable mUpdateTask = new Runnable() {
                public void run() {
                       
                        if (n < 4){
                                n++;                   
                                Bitmap currFrame = Bitmap.createBitmap(framesBitmap,xStart, yStart,frameWidth,frameHeight);
                                imgCtr.setImageBitmap(currFrame);
                                handler.postDelayed(mUpdateTask, 200);
                        }
                        int nFrame = 5;
                       
                        xStart = xStart + frameWidth;
                        yStart = yStart + ((((int)(nFrame % framesInRows))-1) * frameWidth);
                       
                }
        };

private void startAnimation(){
                xStart = 0;
                yStart = 0;
               
                handler.removeCallbacks(mUpdateTask);
                handler.postDelayed(mUpdateTask, 200);
        }

grazie mille per l'aiuto  :-).
Miei programmi: FMsoluzioni;

App sviluppate per conto terzi: TLS Travel; RadioNostalgia; 4Clubbers;