public boolean onTouchEvent(MotionEvent ev) { // Let the ScaleGestureDetector inspect all events. mScaleDetector.onTouchEvent(ev);Dopo la dichiarazione dell'evento subito lo scalegesturedetector "ispeziona", come descritto nel commento...
public boolean onTouchEvent(MotionEvent ev) { // Let the ScaleGestureDetector inspect all events. mScaleDetector.onTouchEvent(ev); final int action = ev.getAction(); switch (action & MotionEvent.ACTION_MASK) {Come di prassi, mascheriamo il byte alto di event.getAction.
public boolean onTouchEvent(MotionEvent ev) {
// Let the ScaleGestureDetector inspect all events.
mScaleDetector.onTouchEvent(ev);
final int action = ev.getAction();
switch (action & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN: {
if (!mScaleDetector.isInProgress()) {
final float x = ev.getX();
final float y = ev.getY();
mLastTouchX = x;
mLastTouchY = y;
mActivePointerId = ev.getPointerId(0);
}
break;
La procedura è sempre quella: in caso di MotionEvent.ACTION_DOWN, se lo ScaleDetector non è in azione, vengono rilevati x e y dell'evento, e i loro valori vengono trasferiti nelle variabili mLastTouchX e mLastTouchY.C'è poi mActivePointerId, variabile alla quale viene attribuito l'id del puntatore 0 (ossia il primo dito che viene appoggiato).
C'è poi l'eventualità di MotionEvent.ACTION_POINTER_1_DOWN.
case MotionEvent.ACTION_POINTER_1_DOWN: { if (mScaleDetector.isInProgress()) { final float gx = mScaleDetector.getFocusX(); final float gy = mScaleDetector.getFocusY(); mLastGestureX = gx; mLastGestureY = gy; } break; }Questa funziona praticamente solo se lo ScaleDetector sta funzionando: rileva il FocusX e il FocusY e li attribuisce alle variabili mLastGestureX e mLastGestureY.
Ecco poi l'eventualità MotionEvent.ACTION_MOVE:
case MotionEvent.ACTION_MOVE: { // Only move if the ScaleGestureDetector isn't processing a gesture. if (!mScaleDetector.isInProgress()) { final int pointerIndex = ev.findPointerIndex(mActivePointerId); final float x = ev.getX(pointerIndex); final float y = ev.getY(pointerIndex); final float dx = x - mLastTouchX; final float dy = y - mLastTouchY; mPosX += dx; mPosY += dy; invalidate(); mLastTouchX = x; mLastTouchY = y; }In assenza di azione dello ScaleDetector, procede pressappoco come quella che conosco.
L'unica differenza è che viene posto in luce il fatto che viene rilevata la coordinata X del puntatore 0.
else{ final float gx = mScaleDetector.getFocusX(); final float gy = mScaleDetector.getFocusY(); final float gdx = gx - mLastGestureX; final float gdy = gy - mLastGestureY; mPosX += gdx; mPosY += gdy; invalidate(); mLastGestureX = gx; mLastGestureY = gy; } break;Questo è un codice che serve per poter traslare anche qualora sia attivo ScaleDetector...
Ma ora ho trovato altri input...
Nessun commento:
Posta un commento