public class Immagine extends View{ private float bordo=50f; private float X,Y; int activePointerIndex=0;; int activePointerId=0; private Drawable mImage; private float posX,posY; private float lastX,lastY; private ScaleGestureDetector SGD; private float scale=1; public Immagine(Context context) { super(context); setBackgroundColor(Color.BLACK); mImage=getResources().getDrawable(R.drawable.facciadaculo); mImage.setBounds(0, 0, mImage.getIntrinsicHeight(), mImage.getIntrinsicHeight()); SGD=new ScaleGestureDetector(context,new ScaleListener()); } @Override public boolean onTouchEvent(MotionEvent event){ SGD.onTouchEvent(event); int action=event.getAction() & MotionEvent.ACTION_MASK; switch(action){ case MotionEvent.ACTION_DOWN: X=event.getX(); Y=event.getY(); lastX=X; lastY=Y; activePointerId=event.getPointerId(0); break; case MotionEvent.ACTION_MOVE: activePointerIndex=event.findPointerIndex(activePointerId); X=event.getX(activePointerIndex); Y=event.getY(activePointerIndex); posX+=(X-lastX); posY+=(Y-lastY); invalidate(); lastX=X; lastY=Y; break; case MotionEvent.ACTION_POINTER_UP: int oldPointerIndex=(event.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK)>>MotionEvent.ACTION_POINTER_INDEX_SHIFT; int oldPointerId=event.getPointerId(oldPointerIndex); if(oldPointerId==activePointerId){ int newPointerIndex=oldPointerIndex==0? 1:0; lastX=event.getX(newPointerIndex); lastY=event.getY(newPointerIndex); activePointerId=event.getPointerId(newPointerIndex); } break; } return true; } @Override public void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.save(); canvas.translate(posX,posY); canvas.scale(scale, scale); mImage.draw(canvas); canvas.restore(); } class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener{ @Override public boolean onScale(ScaleGestureDetector SGD){ scale*=SGD.getScaleFactor(); invalidate(); return true; } } }e mi esercito a riscriverlo da capo.
Ecco: primo punto di dubbio. Cosa si inserisce nel costruttore?
Ovviamente, la risorsa da caricare, più le dimensioni dell'immagine.
Ecco, si usa un Drawable.
public class Immagine extends View{
private Drawable mImage;
public Immagine(Context context) {
super(context);
mImage=getResources().getDrawable(R.drawable.facciadaculo);
mImage.setBounds(0,0,mImage.getIntrinsicWidth(),mImage.getIntrinsicHeight());
}
}
Tutto qui quello che è minimamente necessario.Il resto sarà aggiunta di dopo.
Una volta fatto questo, si va all'evento onTouchEvent.
Ma manca una cosa fondamentale: l'evento onDraw!
Studiamocelo un po'...
Quello è il minimo necessario per mettere a video l'immagine.
@Override public void onDraw(Canvas canvas){ super.onDraw(canvas); canvas.save(); mImage.draw(canvas); canvas.restore(); }E in effetti questo è sufficiente per mostrare l'immagine!
Mandala! Cancello e poi riscrivo.
public class Immagine extends View{ private Drawable mImage; public Immagine(Context context) { super(context); mImage=getResources().getDrawable(R.drawable.facciadaculo); mImage.setBounds(0,0,mImage.getIntrinsicWidth(),mImage.getIntrinsicHeight()); } @Override public void onDraw(Canvas canvas){ super.onDraw(canvas); canvas.save(); mImage.draw(canvas); canvas.restore(); } }Ecco, il codice riscritto da me a memoria funziona!
Ora dobbiamo aggiungere onTouchEvent.
@Override public boolean onTouchEvent(MotionEvent event){ float X,Y; float lastX=0,lastY=0; int action=event.getAction() & MotionEvent.ACTION_MASK; switch(action){ case MotionEvent.ACTION_DOWN: X=event.getX(); Y=event.getY(); lastX=X; lastY=Y; break; case MotionEvent.ACTION_MOVE: X=event.getX(); Y=event.getY(); posX+=(X-lastX); posY+=(Y-lastY); invalidate(); lastX=X; lastY=Y; break; } return true; }Questo è stato un codice fallimentare!
Non posso dichiarare le variabili come variabili locali nel contesto di un metodo.
Ottengo un'immagine che vola via a una velocità pazzesca!
Dichiarandole all'inizio, alla dichiarazione della classe Immagine, ottengo il risultato voluto:
public class Immagine extends View{ private Drawable mImage; float X,Y; float lastX=0,lastY=0; float posX=0,posY=0; public Immagine(Context context) { super(context); mImage=getResources().getDrawable(R.drawable.facciadaculo); mImage.setBounds(0,0,mImage.getIntrinsicWidth(),mImage.getIntrinsicHeight()); }
Un altro "mandala" lo facciamo?...
E dai!
public class Immagine extends View{ float X,Y,lastX,lastY,posX,posY; Drawable mImage; public Immagine(Context context) { super(context); mImage=getResources().getDrawable(R.drawable.facciadaculo); mImage.setBounds(0,0,mImage.getIntrinsicWidth(),mImage.getIntrinsicHeight()); } @Override public boolean onTouchEvent(MotionEvent event){ switch(event.getAction() & MotionEvent.ACTION_MASK){ case MotionEvent.ACTION_DOWN: X=event.getX(); Y=event.getY(); lastX=X; lastY=Y; break; case MotionEvent.ACTION_MOVE: X=event.getX(); Y=event.getY(); posX+=(X-lastX); posY+=(Y-lastY); invalidate(); lastX=X; lastY=Y; break; } return true; } @Override public void onDraw(Canvas canvas){ super.onDraw(canvas); canvas.save(); canvas.translate(posX,posY); mImage.draw(canvas); canvas.restore(); } }Perfetto... qualche piccola dimenticanza, come quella del metodo translate del canvas, ma niente di più!
Nessun commento:
Posta un commento