用手指拖曳圖片
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;
}
}
}