Autore Topic: Dare animazione ad una bitmap  (Letto 1975 volte)

Offline MusA

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
Dare animazione ad una bitmap
« il: 04 Novembre 2010, 16:43:26 CET »
0
Ragazzi sto implementando un giochino tipo puzzle.Al centro dello schermo vi sono 9 tasselli statici e intorno a questi 9 tasselli mobili. Se si preme sui tasselli mobili si visualizzerà una risposta, mentre se si preme sui tasselli statici si visualizzerà una domanda. Se l'utilizzatore trascina la risposta giusta sulla domanda corrispondente, il tassello mobile ruoterà, scomparirà e al posto del tassello statico si visualizzerà una porzione della immagine da risolvere. Ora, i miei tasselli mobili sono delle bitmap. Come faccio a creare queste animazioni senza ricorrere ad un layout XML?E quindi come faccio ad aggiungere una animazione alla mia bitmap che è stata trascinata nel posto giusto e quindi essa stessa ruoterà?? Ho trovato solo soluzioni per ImageView identificate con il loro id da un layout XML.
Che devo fare?? Aiutoooooo sto impazzendo!

Ho riportati il costruttore dei tasselli preso dalla mia classe TileElement, la creazione del tassello e quando dovrebbe partire l'animazione:

Codice (Java): [Seleziona]
public TileElement(int position, String question, String answer, String imageResourceId, ImageResource imageResource, Bitmap bitmap, int x, int y) { //assegnazioni del costruttore}

//----------------------------------------------------------------------

TileElement tasselloMobile1 = new TileElement(1, "Qual è il suo nome?", "Ilaria", "tile1", (new ImageResource("tile", "www.xxx.net", new ImageDescription(48, 48, ImageFormat.Png))),BitmapFactory.decodeResource(getResources(), R.drawable.tile_a), 20, 20);

//----------------------------------------------------------------------

if (event.getAction() == MotionEvent.ACTION_UP) {
                        if (tasselloMobile1.isTouched()) {
                                if(tasselloMobile1.getX() > 55 && tasselloMobile1.getX() < 105) {
                                        if(tasselloMobile1.getY() > 135 && tasselloMobile1.getY() < 185) {
                                                // Animazione: il tassello mobile ruota e scompare e al posto di quello statico compare una porzione di
                                                //immagine
                                               
                                        }

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:Dare animazione ad una bitmap
« Risposta #1 il: 05 Novembre 2010, 09:18:08 CET »
0
Sarebbe meglio che specificassi meglio il tipo di animazione che vuoi fare, e che effetto vuoi raggiungere, ma intanto perché non dai un'occhiata a questo link?
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline MusA

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
Re:Dare animazione ad una bitmap
« Risposta #2 il: 06 Novembre 2010, 10:52:51 CET »
0
Di questo esempio non ho capito bene come è strutturata la classe...è un'unica classe o alcune linee di codice devo riportarle altrove?Non c'è il sorgente di questo esempio e non lo sto capendo...

Offline MusA

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
Re:Dare animazione ad una bitmap
« Risposta #3 il: 06 Novembre 2010, 12:08:18 CET »
0
Allora, per ora questa è la mia interfaccia di gioco:



Posso muovere i tasselli che sono in alto e sotto la schermata, per esempio:




A questo tassello è associato una risposta:



Premendo su uno dei nove tasselli centrali si visualizzerà una domanda:



Se si crede che si è trovato domanda e risposta corretta, si dovrà trascinare il tassello mobile su quello statico al centro:



Ora, il tassello azzurro con l'immagine del puzzle dovrà ruotare su se stesso di 360° e poi rimpicciolirsi fino a sparire...

Non so se sono stata chiara.
Comunque l'interfaccia è ancora tutta da sistemare
« Ultima modifica: 06 Novembre 2010, 13:46:43 CET da MusA »

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:Dare animazione ad una bitmap
« Risposta #4 il: 08 Novembre 2010, 10:17:02 CET »
+1
In quel link si fa riferimento a 2 cose:
1. Si crea un'estensione della classe Drawable, chiamandola BitmapDrawable. Benché abbia lo stesso nome di una classe di graphics.android, è una semplice estensione della Drawable, con qualche info in più

2.Successivamente, tutte le altre operazioni citate, vengono effettuate nella tua activity, e distinguiamo una fase di init, in cui aggiungiamo tutti i frames dell'animazione, e una fase in cui l'animazione viene fatta partire.

Questa è la fase di inizializzazione, in cui creo la mia animazione. Non faccio la cosa a runtime poiché è una cosa che utilizzo spesso, per cui è meglio precalcolara.

Codice (Java): [Seleziona]
Drawable frame1 = new BitmapDrawable(b1);
animDrawable.addFrame(frame1, 250);
Drawable frame2 = new BitmapDrawable(b2);
animDrawable.addFrame(frame2, 250);
Drawable frame3 = new BitmapDrawable(b3);
animDrawable.addFrame(frame3, 250);
Drawable frame4 = new BitmapDrawable(b4);
animDrawable.addFrame(frame4, 250);
Drawable frame5 = new BitmapDrawable(b5);
animDrawable.addFrame(frame5, 250);
Drawable frame6 = new BitmapDrawable(b6);
animDrawable.addFrame(frame6, 250);
...

Successivamente, creo al volo una ImageView (in maniera programmatica e non via xml), a cui associo l'animazione come background.

Codice (Java): [Seleziona]
ImageView img = new ImageView(this);
img.setBackgroundDrawable(animDrawable);

Infine, aggiungo un thread che fa partire l'animazione utilizzando un Handler:

Codice (Java): [Seleziona]
Handler startAnimation = new Handler() {
  public void handleMessage(Message msg) {
    super.handleMessage(msg);
    animDrawable.start();
  }
};

e lo faccio partire attraverso quest'operazione:

Codice (Java): [Seleziona]
Message msg = new Message();
startAnimation.sendMessage(msg);

Questo sistema prevede che tu crei preventivamente i fotogrammi dell'animazione, e questa cosa può essere fatta in 2 modi:
Li disegni a manina, oppure li crei al volo, durante la fase della creazione dei frame dell'animDrawable.
Per fare questo devi prendere l'animazione di base e ruotarla/zoomarla per quel che ti serve. A quel punto hai il nuovo frame da aggiungere all'anim. (questo caso è quello che ti serve, visto che si tratta di un'animazione in cui non si aggiungono/tolgono dettagli).

Se non volessi utilizzare tutto questo, potresti prevedere tu un sistema di animazione della bitmap, in cui:
1. organizzi i frame in un'unica pagina.
2. quando hai bisogno di animare la bitmap, crei un thread (se vuoi un timertask) che, a intervalli regolari, aggiorni  la bitmap prendendo un frame dell'animazione a pagina unica.
Leggiti questo snippet, perché potrebbe esserti utile.
Purtroppo non sono potuto entrare nel dettaglio di molte cose, perché rischierei di dilungarmi troppo.
Se hai problemi/dubbi o altro, sarò felice di aiutarti.

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

http://www.androidpatterns.com/

Offline MusA

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
Re:Dare animazione ad una bitmap
« Risposta #5 il: 09 Novembre 2010, 10:49:08 CET »
0
Scusami non è che potresti postare un sorgente nel quale usi la tecnica secondo la quale aggiorni i frame di un bitmap usando un thread? Non sono tanto pratica :(

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:Dare animazione ad una bitmap
« Risposta #6 il: 09 Novembre 2010, 11:05:44 CET »
0
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline MusA

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
Re:Dare animazione ad una bitmap
« Risposta #7 il: 09 Novembre 2010, 13:01:37 CET »
0
Non riesco ad adattarlo al gioco...perchè la mia nimazione deve comparire al posto della mia bitmap e in determinate condizioni...non devo sempre disegnare una animazione...

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:Dare animazione ad una bitmap
« Risposta #8 il: 09 Novembre 2010, 14:48:10 CET »
0
ok.
ho pensato ad un'altra cosa.
Come stai renderizzando la grafica?

Usi una view? un canvas? una surfaceview?
Con ognuno di questi oggetti, la funzione onDraw si occupa di stampare a schermo la tua grafica.
Attraverso lo snippet che ti ho segnalato, hai il modo di prendere i fotogrammi che compongono l'animazione.
Supponiamo di essere già alla fase in cui dobbiamo disegnare l'animazione, una procedura potrebbe essere la seguente:
1. identifichi la bitmap.
2. supponiamo che tu abbia un intero, maxFrames, che contiene il numero di fotogrammi dell'animazione, ed un altro intero, currFrame, che contiene il numero di fotogramma corrente, inizialmente = 0
3. Ad ogni chiamata della funzione onDraw prevedi 2 fasi: la prima calcola un'eventuale animazione, e la seconda renderizza tutte le bitmap della pagina.

PRIMA FASE: se la bitmap prevede che inizi l'animazione, ti occupi di prenderti la bitmap corrispondente al frame currFrame, la copi nella bitmap che dovrà essere animata, e incrementi currFrame.
Fintantoiché currFrame <= maxFrames, ad ogni chiamata onDraw la bitmap avrà un "disegno" diverso; termini quando currFrame=maxFrames, escludendo quest'ultimo valore.

SECONDA FASE: prendi la lista di tutte le tue bitmap, e le stampi. Ad ogni chiamata onDraw la bitmap verrà renderizzata con un fotogramma nuovo ogni volta (fino a fine animazione) e le eltre bitmap resteranno uguali.

Senza animazioni, la prima fase non farà niente.


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

http://www.androidpatterns.com/

Offline MusA

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
Re:Dare animazione ad una bitmap
« Risposta #9 il: 09 Novembre 2010, 14:59:58 CET »
0
Uso una surfaceView... stavo appunto cercando di utilizzare il codice dello snipper che mi avevi indicato adattandolo agli esempi che mi hai linkato... però sto facendo troppa confusione!  :'(

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:Dare animazione ad una bitmap
« Risposta #10 il: 09 Novembre 2010, 15:15:41 CET »
0
ok.
prova a leggere questo da zero, cioè seguendo tutti i passi che vengono proposti.
Credo che ti apriranno la mente e avrai più chiare molte più cose.

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

http://www.androidpatterns.com/

Offline MusA

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
Re:Dare animazione ad una bitmap
« Risposta #11 il: 09 Novembre 2010, 15:21:39 CET »
0
Gli ho già visti tutti questi esempi...  :D mo li studio per bene comunque... grazie per le info!  :-*

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:Dare animazione ad una bitmap
« Risposta #12 il: 09 Novembre 2010, 15:26:49 CET »
0
ok.
Se hai problemi su quelli, ne possiamo discutere.

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

http://www.androidpatterns.com/