用手指拖曳圖片

step 1

用 onTouchEvent() 偵測動作

在手指第一次觸碰時先記錄該點

public boolean onTouchEvent(MotionEvnet ev){

mScaleDetector.onTouchEvent(ev);

final int action = ev.getAction();

switch(action & MotionEvent.ACTION_MASK){

case MotionEvent.ACTION_DOWN:{

final float x = ev.getX();

final float y = ev.getY();

mLastTouchX = x;

mLastTouchY = y;

mActivePointerId = ev.getPointerId(0);

break;

}

}

}

setp 2

記錄觸碰點移動時的座標

與先前記錄的觸碰點做比較,算出移動距離

case MotionEvent.ACTION_MOVE:{

final int pointerIndex = ev.findPointerIndex(mActionPointerId);

final float x = ev.getX(pointerIndex);

final float y = ev.getY(pointerIndex);

if(!mScaleDetector.isInProgress()){

final float dx = x - mLastTouchX;

final float dy = y - mLastTouchY;

mPosX += dx;

mPosY += dy;

/*防止移動出界*/

if(mPosX < 0 || mPosX > screenWidth - mIcon.getWidth() * mScaleFactor || mPosY < 0 || mPosY > screenHeight - mIcon.getHeight() * mScaleFactor){

mPosX -= dx;

mPosY -= dy;

}

invalidate();

}

mLastTouchX = x;

mLastTouchY = y;

break;

}

程式碼合併

public boolean onTouchEvent(MotionEvnet ev){

mScaleDetector.onTouchEvent(ev);

final int action = ev.getAction();

switch(action & MotionEvent.ACTION_MASK){

case MotionEvent.ACTION_DOWN:{

final float x = ev.getX();

final float y = ev.getY();

mLastTouchX = x;

mLastTouchY = y;

mActivePointerId = ev.getPointerId(0);

break;

}

case MotionEvent.ACTION_MOVE:{

final int pointerIndex = ev.findPointerIndex(mActionPointerId);

final float x = ev.getX(pointerIndex);

final float y = ev.getY(pointerIndex);

if(!mScaleDetector.isInProgress()){

final float dx = x - mLastTouchX;

final float dy = y - mLastTouchY;

mPosX += dx;

mPosY += dy;

/*防止移動出界*/

if(mPosX < 0 || mPosX > screenWidth - mIcon.getWidth() * mScaleFactor || mPosY < 0 || mPosY > screenHeight - mIcon.getHeight() * mScaleFactor){

mPosX -= dx;

mPosY -= dy;

}

invalidate();

}

mLastTouchX = x;

mLastTouchY = y;

break;

}

}

}