Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MotionEvent.ACTION\u DOWN在Android中不工作_Java_Android_Touch Event - Fatal编程技术网

Java MotionEvent.ACTION\u DOWN在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;

我正在编写一个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;

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你读过这篇文章吗: