Autore Topic: Callback del metodo onDraw su una View  (Letto 889 volte)

Offline capa89

  • Nuovo arrivato
  • *
  • Post: 8
  • Respect: 0
    • Mostra profilo
Callback del metodo onDraw su una View
« il: 29 Luglio 2011, 19:58:37 CEST »
0
Salve, ho un piccolo dilemma riguardo il metodo onDraw, come faccio a capire quando il sistema ha terminato di disegnare la mia view dopo aver invocato il metodo invalidate()?

Codice (Java): [Seleziona]
public class myView extends View{

        private Context c;
               
        public myView(Context context, AttributeSet att) {
               
                super(context, att);
               
                //Now i add the listener to this view
                this.setOnTouchListener(new OnTouchListener(){

                        public boolean onTouch(View v, MotionEvent e) {
                                //Codice di gestione vario
                                v.invalidate();
                               //Codice per eventuali azioni successive
                                return false;
                        }
                       
                });
        }
//ecc ecc

Ora se volessi eseguire delle animazioni dopo v.invalidate() (per esempio o qualsiasi altro codice che sporca in qualche modo il processo di disegno della view) dovrei attendere la fine del metodo onDraw, esiste un metodo callback o qualche evento che viene scatenato dopo la fine del disegno? Grazie per eventuali risposte!

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +507
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Callback del metodo onDraw su una View
« Risposta #1 il: 30 Luglio 2011, 01:18:44 CEST »
0
Senza perderci troppo tempo, sovrascrivi il metodo onDraw e dopo che chiami il super ci piazzi la tua animazione ;)

Codice (Java): [Seleziona]
public class myView extends View{

        private Context c;
               
        public myView(Context context, AttributeSet att) {
               
                super(context, att);
               
                //Now i add the listener to this view
                this.setOnTouchListener(new OnTouchListener(){

                        public boolean onTouch(View v, MotionEvent e) {
                                //Codice di gestione vario
                                v.invalidate();
                               //Codice per eventuali azioni successive
                                return false;
                        }
                       
                });
        }
       
        @Override
        protected void onDraw (Canvas canvas){
                super.onDraw(canvas);
                //Qui puoi fare quello che vuoi
        }

Offline capa89

  • Nuovo arrivato
  • *
  • Post: 8
  • Respect: 0
    • Mostra profilo
Re:Callback del metodo onDraw su una View
« Risposta #2 il: 30 Luglio 2011, 02:03:48 CEST »
0
Il metodo onDraw lo ho sovrascritto, in esso eseguo tutti i disegni del caso (la mia view è più complessa di quella dell'esempio).
Il flusso di lavoro che la view deve eseguire è: invalidate() -> ridisegna la view aggiornata -> esegui delle animazioni conclusive.

Quindi tu mi dici che in realta mi basta inserire le animazioni al fondo del metodo onDraw, dopo aver disegnato...ok provo e vi faccio sapere, se è cosi semplice allora mi sono perso in un bicchiere d'acqua lol

Grazie per la risposta comunque!

Offline capa89

  • Nuovo arrivato
  • *
  • Post: 8
  • Respect: 0
    • Mostra profilo
Re:Callback del metodo onDraw su una View
« Risposta #3 il: 30 Luglio 2011, 19:17:46 CEST »
0
Allora avevi ragione bastava inserire il codice dopo aver disegnato, solo che stranamente le animazioni non vengono eseguite.

La View principale contiene una matrice di SphereView (di qui posto sotto l'intero codice), al fondo del metodo onDraw eseguo un for nel quale per ogni pallina che deve essere mossa viene invocato il metodo doAnimation, il risultato è che le sfere vengno correttemente disegnate ma non si muovo di un millimetro!

Codice (Java): [Seleziona]
public class SphereView extends View{

        private int x,y;
        private Bitmap image;
        private TranslateAnimation animation;
        private Paint paint;
       
        public static final int size = 50;              //The size of the generic sphere image
       
        public SphereView(Context context, int color, int x, int y) {
                super(context);
                image = BitmapFactory.decodeResource(context.getResources(), Sphere.getResourceImage(color));
                this.x = x;
                this.y = y;
                paint = new Paint();
                paint.setAntiAlias(true);
                paint.setFilterBitmap(true);
        }
       
        public void updatePosition(int x, int y){
                this.x = x;
                this.y = y;
        }
       
        protected void onDraw(Canvas canvas){
                super.onDraw(canvas);
                canvas.drawBitmap(image, x, y, paint);
        }
       
        public void doAnimation(int endY){
                animation = new TranslateAnimation(this.x, this.x, this.y, endY*size);
                animation.setDuration(500);
                animation.setFillAfter(true);
                this.startAnimation(animation);
        }
       
}