Java MotionEvent.ACTION\u DOWN在Android中不工作
我正在编写一个android应用程序,使用拖动和缩放。但是当我编程Java MotionEvent.ACTION\u DOWN在Android中不工作,java,android,touch-event,Java,Android,Touch Event,我正在编写一个android应用程序,使用拖动和缩放。但是当我编程触摸类时,MotionEvent.ACTION\u DOWN,MotionEvent.ACTION\u POINTER\u DOWN和MotionEvent.ACTION\u MOVE不起作用。如何修复我的代码 触摸类: private static final int NONE = 0; private static final int DRAG = 1; private static final int ZOOM = 2;
触摸
类时,MotionEvent.ACTION\u DOWN
,MotionEvent.ACTION\u POINTER\u DOWN
和MotionEvent.ACTION\u MOVE
不起作用。如何修复我的代码
触摸类:
private static final int NONE = 0;
private static final int DRAG = 1;
private static final int ZOOM = 2;
private static final float MAX_ZOOM = 3f;
private static final float MIN_ZOOM = 3f;
public boolean onTouch(View view, MotionEvent event) {
int mode = NONE;
float oldDistance = 1f;
Matrix matrix = new Matrix();
Matrix savedMatrix = new Matrix();
PointF start = new PointF();
PointF mid = new PointF();
ImageView imageView = (ImageView)view;
switch(event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
savedMatrix.set(matrix);
start.set(event.getX(), event.getY());
mode = DRAG;
break;
case MotionEvent.ACTION_POINTER_DOWN:
oldDistance = spacing(event);
if(oldDistance > 10f) {
savedMatrix.set(matrix);
midPoint(mid, event);
mode = ZOOM;
}
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
mode = NONE;
break;
case MotionEvent.ACTION_MOVE:
if(mode == DRAG) {
matrix.set(savedMatrix);
matrix.postTranslate(event.getX() - start.x, event.getY() - start.y);
}
else if(mode == ZOOM) {
float newDistance = spacing(event);
if(newDistance > 10f) {
matrix.set(savedMatrix);
float scale = newDistance / oldDistance;
float[] values = new float[9];
matrix.getValues(values);
float currentScale = values[Matrix.MSCALE_X];
if(scale * currentScale > MAX_ZOOM)
scale = MAX_ZOOM / currentScale;
else if (scale * currentScale < MIN_ZOOM)
scale = MIN_ZOOM / currentScale;
matrix.postScale(scale, scale, mid.x, mid.y);
}
}
break;
}
imageView.setImageMatrix(matrix);
return true;
}
private float spacing(MotionEvent event) {
float x = event.getX(0) - event.getX(1);
float y = event.getY(0) - event.getY(1);
return FloatMath.sqrt(x * x + y * y);
}
private void midPoint(PointF point, MotionEvent event) {
float x = event.getX(0) + event.getX(1);
float y = event.getY(0) + event.getY(1);
point.set(x / 2, y / 2);
}
private static final int NONE=0;
专用静态最终整数拖动=1;
私有静态最终整数缩放=2;
专用静态最终浮点最大值(放大倍数=3f);
专用静态最终浮点最小值\缩放=3f;
公共布尔onTouch(视图、运动事件){
int模式=无;
浮动距离=1f;
矩阵=新矩阵();
矩阵savedMatrix=新矩阵();
PointF start=新的PointF();
PointF mid=新的PointF();
ImageView ImageView=(ImageView)视图;
开关(event.getAction()&MotionEvent.ACTION\u掩码){
case MotionEvent.ACTION\u DOWN:
savedMatrix.set(矩阵);
set(event.getX(),event.getY());
模式=拖动;
打破
case MotionEvent.ACTION\u指针\u向下:
oldDistance=间距(事件);
如果(旧距离>10f){
savedMatrix.set(矩阵);
中点(中点,事件);
模式=缩放;
}
打破
case MotionEvent.ACTION\u UP:
case MotionEvent.ACTION\u指针\u向上:
模式=无;
打破
case MotionEvent.ACTION\u移动:
如果(模式==拖动){
矩阵集(savedMatrix);
postTranslate(event.getX()-start.x,event.getY()-start.y);
}
else if(模式==缩放){
浮动新距离=间距(事件);
如果(新距离>10f){
矩阵集(savedMatrix);
浮动比例=新距离/旧距离;
浮点[]值=新浮点[9];
矩阵。获取值(值);
float currentScale=值[Matrix.MSCALE_X];
如果(缩放*当前缩放>最大缩放)
比例=最大缩放/当前比例;
else if(缩放*当前缩放<最小缩放)
比例=最小缩放/当前比例;
矩阵。后标度(标度、标度、中x、中y);
}
}
打破
}
设置图像矩阵(矩阵);
返回true;
}
专用浮点间距(MotionEvent事件){
float x=event.getX(0)-event.getX(1);
float y=event.getY(0)-event.getY(1);
返回FloatMath.sqrt(x*x+y*y);
}
专用空心中点(点F点、MotionEvent事件){
float x=event.getX(0)+event.getX(1);
float y=event.getY(0)+event.getY(1);
点集(x/2,y/2);
}
是否有必要使用switch case语句?您可能更容易阅读,但当我这样做时>>
if (event.getAction() == MotionEvent.ACTION_UP){
} else if (event.getAction() == MotionEvent.ACTION_DOWN) {
} else if (event.getAction() == MotionEvent.ACTION_MOVE) {
}
它很好用。此外,您应该在case语句中添加日志调用,以了解是否正在调用您的onTouch,以及它会和不会通过哪些情况。您还可以记录掩码传递的值和事件代码?这些都会有帮助。请尽量弄清楚实际问题是什么。”“不工作”是一个非常模糊的解释。这是否与您的
MAX\u ZOOM
和MIN\u ZOOM
值相等有关?我的意思是我的事件没有进入开关中的任何案例
(MotionEvent.ACTION\u DOWN
,MotionEvent.ACTION\u POINTER\u DOWN
和MotionEvent.ACTION\u MOVE
)Eric->不,我用不同的值测试它,但它还不起作用。@Vahid你读过这篇文章吗: