CERCA
PER MODELLO
FullScreen Chatbox! :)

Utente del giorno: carotix con ben 2 Thanks ricevuti nelle ultime 24 ore
Utente della settimana: 9mm con ben 9 Thanks ricevuti negli ultimi sette giorni
Utente del mese: 9mm con ben 34 Thanks ricevuti nell'ultimo mese

Visualizzazione dei risultati da 1 a 4 su 4
Discussione:

TransitionDrawable, come clonare il comportamento?

Se questa discussione ti è stata utile, ti preghiamo di lasciare un messaggio di feedback in modo che possa essere preziosa in futuro anche per altri utenti come te!
  1. #1
    Androidiano


    Registrato dal
    Oct 2009
    Messaggi
    97

    Ringraziamenti
    0
    Ringraziato 0 volte in 0 Posts
    Predefinito

    TransitionDrawable, come clonare il comportamento?

    Uella, TransitionDrawable permette di fadeare tra due drawable e io vorrei fare un fade dal primo al secondo e dal secondo ad un terzo.
    Tra l'altro il Transition non permette neanche di avere un controllo sull'animazione, anche per sapere se sta ancora andando o meno.
    So che c'è il metodo scheduleDrawable, ma non ho capito come funziona... (Cioè non so cosa mettere nel "what" (il parametro runnable). Se c'è qualcuno che mi puo fare un esempio... )
    Allora ho provato a fare questo:

    codice:
    package com.animazione.it; 
    
    import android.app.Activity; 
    import android.graphics.Bitmap; 
    import android.graphics.drawable.Drawable; 
    import android.graphics.drawable.LayerDrawable; 
    import android.graphics.drawable.TransitionDrawable; 
    import android.os.Bundle; 
    import android.view.View; 
    import android.view.View.OnClickListener; 
    import android.widget.Button; 
    import android.widget.RelativeLayout; 
    import android.widget.TextView; 
    
    public class Main extends Activity { 
         private RelativeLayout layout; 
         private Button bottone; 
         private TextView testo, debug; 
         private LayerDrawable disegno; 
         private TransitionDrawable prova; 
         private provaDrawable trans; 
          
        /** Called when the activity is first created. */ 
        @Override 
        public void onCreate(Bundle savedInstanceState) { 
            super.onCreate(savedInstanceState); 
            setContentView(R.layout.main); 
            
            layout = (RelativeLayout)findViewById(R.id.layout); 
            disegno = new LayerDrawable(new Drawable[]{this.getResources().getDrawable(R.drawable.earthrise), // <- Questo l'ho preso da Lunar Lander
                   getResources().getDrawable(R.drawable.bianco),  // <- Questo è un png 2x2 tutto bianco
                   getResources().getDrawable(R.drawable.prova)}); // <- Questo è un png mezzo trasparente e mezzo no 
            
            layout.setBackgroundDrawable(disegno); 
            testo = (TextView)findViewById(R.id.text); 
            debug = (TextView)findViewById(R.id.DebugText); 
            debug.setScrollContainer(true); 
             bottone = (Button)findViewById(R.id.Button01); 
            bottone.setOnClickListener(new OnClickListener(){ 
    
                   @Override 
                   public void onClick(View arg0) { 
                        splasha(); 
                         
                   }});     
        } 
        
        private void splasha(){ 
         float tempo = 20000; 
         float incremento = 255/tempo; 
         float alpha; 
         testo.setText(getString(R.string.animazione_progresso)); 
          
          
         for (int i = disegno.getNumberOfLayers()-1; i>-1 ; i--){ 
              alpha=255; 
              while(alpha >= 0){ 
                   disegno.getDrawable(i).setAlpha(Math.round(alpha)); 
                   alpha -= incremento; 
                   layout.invalidate(); // <-- Questo so che non cambia le cose e neanche disegno.invalidateItself() :) 
              } 
         } 
      
         testo.setText(getString(R.string.animazione_finita)); 
        } 
    }
    Pero non mi fa un effetto fade, perché prima fa il ciclo while e solo alla fine di questo mi fa vedere l'effetto, cioè quando l'alfa dei tre drawable è gia a 0.
    Qualcuno sa come mai non mi fa vedere l'effetto graduale?

    (Quello che fa splasha sarebbe/sarà messo in un thread.)

  2.  
  3. #2
    Administrator L'avatar di Andrea


    Registrato dal
    Nov 2008
    Messaggi
    3,368
    Smartphone
    Nexus S, myTouch Slide 4g

    Ringraziamenti
    143
    Ringraziato 880 volte in 323 Posts
    Predefinito

    Veramente c'è l'animationlistener che ti aiuta a capire l'andamento dell'animazione. Hai già guardato?

    Twitter @veke87

  4. #3
    Androidiano


    Registrato dal
    Oct 2009
    Messaggi
    97

    Ringraziamenti
    0
    Ringraziato 0 volte in 0 Posts
    Predefinito

    Allora, da quando ho scritto il post ho creato l'effetto che volevo usando le animation, però queste vanno bene per le view e, ovviamente, per i layout, ma non per i drawable.
    Praticamente nel layout principale ho messo 3 imageview e con l'aiuto dell'animationListener ho fatto partire le alfa animazioni una dopo l'altra, probabilmente avrei potuto usare un set di animation senza usare il listener, ma una volta che ho visto che funzionava mi son rimesso con i TransitionDrawable, per i quali il listener non c'è.
    Così momentaneamente sto facendo esperimenti con i thread e drawable custom/normali.

    EDIT: Questa è l'implementazione che ho fatto usando i LayerDrawable, ma è lento...

    codice:
    public class Main extends Activity implements Runnable { 
         private RelativeLayout layout; 
         private Button bottone; 
         private TextView testo, debug; 
         private LayerDrawable disegno; 
         private Handler handler; 
    
    
         /** Called when the activity is first created. */ 
         @Override 
         public void onCreate(Bundle savedInstanceState) { 
              super.onCreate(savedInstanceState); 
              setContentView(R.layout.main); 
    
              layout = (RelativeLayout)findViewById(R.id.layout); 
              disegno = new LayerDrawable(new Drawable[]{this.getResources().getDrawable(R.drawable.earthrise), // <-- Lunar Lander background 
                        getResources().getDrawable(R.drawable.bianco), // <-- Drawable bianco
                        layout.getBackground()}); // <-- Drawable nero 
              layout.setBackgroundDrawable(disegno); 
    
              testo = (TextView)findViewById(R.id.text); 
              debug = (TextView)findViewById(R.id.DebugText); 
    
              bottone = (Button)findViewById(R.id.Button01); 
              bottone.setOnClickListener(new OnClickListener(){ 
    
                   @Override 
                   public void onClick(View arg0) { 
                        splasha(); 
    
                   }}); 
    
              handler = new Handler(){ 
                   public void handleMessage(Message msg){ 
                        if (msg.arg1 > 0 && msg.arg1 < disegno.getNumberOfLayers()){ //<-Sto if l'ho messo perchè non so se per sbaglio arrivano altri messaggi
                             disegno.getDrawable(msg.arg1).setAlpha(msg.arg2); 
                             layout.invalidate(); // <- If I cut this line (or disegno.invalidateSelf()) the animation become slower. 
                        } else if (msg.arg1 == 0){ 
                             testo.setText(getString(R.string.animazione_finita)); 
                        } 
    
                   } 
              }; 
    
    
         } 
    
         private void splasha(){ 
    
              testo.setText(getString(R.string.animazione_progresso)); 
              new Thread(this).start(); 
    
    
         } 
    
         @Override 
         public void run() { 
              float tempo = 2000; 
              float incremento = 255/tempo; 
              float alpha; 
              Message msg; 
    
              for (int i = disegno.getNumberOfLayers()-1; i>0 ; i--){ 
                   alpha=255; 
                   while(alpha >= 0){ 
                        msg = new Message(); 
                        msg.arg2=Math.round(alpha); 
                        msg.arg1=i; 
                        handler.sendMessage(msg); 
                        alpha -= incremento; 
    
                   } 
              } 
    
    
    
         } 
    }
    Mi sembra che i messaggi vengano gestiti lentamente rispetto a quello che vorrei.
    Ultima modifica di Deadly; 23-03-10 alle 13:39

  5. #4
    Androidiano


    Registrato dal
    Oct 2009
    Messaggi
    97

    Ringraziamenti
    0
    Ringraziato 0 volte in 0 Posts
    Predefinito

    Ho trovato il perché andava piano! Perché sono un pirla!
    Non erano coerenti i valori che gestivano l'incremento e il ciclo while.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire risposte
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Torna su
Privacy Policy