Scrivere il codice di un'immagine scrollabile nell'ambito di una View.
public class Immagine extends View { Context context; Drawable mImage; float lastX,lastY,posX,posY; public Immagine(Context context) { super(context); this.context=context; mImage=getResources().getDrawable(R.drawable.bona); mImage.setBounds(0,0,200,200); } @Override public boolean onTouchEvent(MotionEvent event){ switch(event.getAction()){ case MotionEvent.ACTION_DOWN: lastX=event.getX(); lastY=event.getY(); break; case MotionEvent.ACTION_MOVE: posX+=event.getX()-lastX; posY+=event.getY()-lastY; invalidate(); lastX=event.getX(); lastY=event.getY(); break; } return true; } @Override public void onDraw(Canvas canvas){ super.onDraw(canvas); canvas.save(); canvas.translate(posX,posY); mImage.draw(canvas); canvas.restore(); } }Ho dimenticato di sottrarre a getX e getY dell'evento Move il valore di lastX e lastY, ossia delle coordinate dell'ultima posizione.
o Ripetere l'esercizio.
Voglio provare a lasciare il codice solo alla creazione dell'immagine, per vedere cosa ottengo. Secondo me la mancanza dell'evento onDraw dovrebbe lasciarmi la view vuota:
public class Immagine extends View { Context context; Drawable mImage; public Immagine(Context context) { super(context); this.context=context; mImage=getResources().getDrawable(R.drawable.bona); mImage.setBounds(0,0,300,300); } }Sì, è così!
Ora aggiungo onDraw senza il codice per il movimento:
public class Immagine extends View { Context context; Drawable mImage; public Immagine(Context context) { super(context); this.context=context; mImage=getResources().getDrawable(R.drawable.bona); mImage.setBounds(0,0,300,300); } @Override public void onDraw(Canvas canvas){ super.onDraw(canvas); canvas.save(); mImage.draw(canvas); canvas.restore(); } }Ecco, con questo codice l'immagine appare.
Però, ovviamente, non si sposta.
Ora riscrivo il codice completo.
public class Immagine extends View { Context context; Drawable mImage; float lastX,lastY,posX,posY; public Immagine(Context context) { super(context); this.context=context; mImage=getResources().getDrawable(R.drawable.bona); mImage.setBounds(0,0,300,300); } @Override public boolean onTouchEvent(MotionEvent event){ switch(event.getAction()){ case MotionEvent.ACTION_DOWN: lastX=event.getX(); lastY=event.getY(); break; case MotionEvent.ACTION_MOVE: posX+=event.getX()-lastX; posY+=event.getY()-lastY; invalidate(); lastX=event.getX(); lastY=event.getY(); } return true; } @Override public void onDraw(Canvas canvas){ super.onDraw(canvas); canvas.save(); canvas.translate(posX,posY); mImage.draw(canvas); canvas.restore(); } }Ho dimenticato di aggiungere il metodo translate del canvas, subito ricordato e corretto.
Nessun commento:
Posta un commento