android怎么监听多点触摸_android 多点触控
在android中多指觸控通過OnTouchListener監聽器監聽,觸控事件在onTouch方法中分析處理。
在單指觸控中,我們常用的三個方法ACTION_DOWN、ACTION_UP、ACTION_MOVE,在多指觸控中也會用到,不過用法稍有不同。
多指觸控中多了ACTION_POINTER_DOWN、ACTION_POINTER_UP兩種情況,這幾個情況的觸發用法在下面源碼中標注:
switch (event.getAction() &MotionEvent.ACTION_MASK) {case MotionEvent.ACTION_DOWN: //第一根手指按下時觸發
mode = 1;break;case MotionEvent.ACTION_POINTER_DOWN: //第二根或以上的手指按下時觸發
mode += 1;break;case MotionEvent.ACTION_UP: //所有手指都離開時觸發
mode = 0;break;case MotionEvent.ACTION_POINTER_UP: //當有兩根及以上手指觸碰屏幕,其一離開時觸發
mode -= 1;break;case MotionEvent.ACTION_MOVE: //此事件非常靈敏,只要有手指觸碰屏幕,便會一直觸發
if (mode >= 2) {
}break;
}
觸碰的手指數可用event.getPointerCount()方法獲取。
放大縮小:
此功能可通過手指之間的前后距離倍數來確定放大縮小的倍數,不這樣稍微麻煩了點,我們可以用ScaleGestureDetector來實現:
scaleGestureDetector = new ScaleGestureDetector(this, newScaleGestureDetector.OnScaleGestureListener() {
@Overridepublic booleanonScale(ScaleGestureDetector detector) {float factor =detector.getScaleFactor();float x =detector.getFocusX();float y =detector.getFocusY();
Show.log("onScale:" + factor + ";" + x + ";" +y);
matrix.postScale(factor, factor, x, y);
iv.setImageMatrix(matrix);return true;
}
@Overridepublic booleanonScaleBegin(ScaleGestureDetector detector) {
Show.log("onScaleBegin");return true;
}
@Overridepublic voidonScaleEnd(ScaleGestureDetector detector) {
Show.log("onScaleEnd");
}
});
iv=(ImageView) findViewById(R.id.img_test);
iv.setOnTouchListener(newOnTouchListener() {
@Overridepublic booleanonTouch(View v, MotionEvent event) {\
scaleGestureDetector.onTouchEvent(event);return true;
}
});
多指滑動:
先獲取各點的中點,而后根據中點的位移來進行判斷,下面是一個簡單樣例:
public class MainActivity extendsActivity {privateImageView iv;
Matrix matrix= newMatrix();privatePointF startPoint;privatePointF nowPoint;
@Overrideprotected voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startPoint= newPointF();
nowPoint= newPointF();
iv=(ImageView) findViewById(R.id.img_test);
iv.setOnTouchListener(newOnTouchListener() {
@Overridepublic booleanonTouch(View v, MotionEvent event) {switch (event.getAction() &MotionEvent.ACTION_MASK) {caseMotionEvent.ACTION_DOWN:caseMotionEvent.ACTION_POINTER_DOWN:
setEventPoint(event,startPoint);break;caseMotionEvent.ACTION_MOVE:
setEventPoint(event,nowPoint);
Show.log("move:"+getDistance(startPoint,nowPoint));
matrix.postTranslate(nowPoint.x-startPoint.x,nowPoint.y-startPoint.y);
startPoint.set(nowPoint.x,nowPoint.y);break;caseMotionEvent.ACTION_UP:
setEventPoint(event,nowPoint);
Show.log("end:"+getDistance(startPoint,nowPoint));break;
}
iv.setImageMatrix(matrix);return true;
}
});
}private voidsetEventPoint(MotionEvent event, PointF startPoint) {float x = 0, y = 0;final int pointerCount =event.getPointerCount();for (int i = 0; i < pointerCount; i++) {
x+=event.getX(i);
y+=event.getY(i);
}
x= x /pointerCount;
y= y /pointerCount;
startPoint.set(x,y);
}private floatgetDistance(PointF point1,PointF point2){float x = point1.x-point2.x;float y = point1.y-point2.y;return (float) Math.sqrt(x * x + y *y);
}
}
總結
以上是生活随笔為你收集整理的android怎么监听多点触摸_android 多点触控的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信小程序学习心得----订咖啡
- 下一篇: 单目slam LoopClosing之S