android中的Handle onClick()和onTouch()都是

android中的Handle onClick()和onTouch()都是,android,Android,我在同一个imageView上执行了onClick()和onTouch(),在onClick()上执行了简单的open Gallery,但问题是我的onClick()不工作,而onTouch()工作正常。有人能告诉我到底是什么问题吗?谢谢。这是我的密码 boolean isMoved=true; Matrix matrix=new Matrix(); Matrix savedMatrix=new Matrix(); PointF startPoint=new PointF

我在同一个imageView上执行了onClick()和onTouch(),在onClick()上执行了简单的open Gallery,但问题是我的onClick()不工作,而onTouch()工作正常。有人能告诉我到底是什么问题吗?谢谢。这是我的密码

boolean isMoved=true;
    Matrix matrix=new Matrix();
    Matrix savedMatrix=new Matrix();
    PointF startPoint=new PointF();
    PointF midPoint=new PointF();
    float oldDist = 1f;
    int NONE = 0;
    int DRAG = 1;
    int ZOOM = 2;
    int mode = NONE;
public boolean onTouch(View v, MotionEvent event) {

        ImageView imageView = (ImageView) v;
        imageView.setScaleType(ScaleType.MATRIX);

        switch (event.getAction() & MotionEvent.ACTION_MASK) {

        case MotionEvent.ACTION_DOWN:
            matrix.set(imageView.getImageMatrix());
            isMoved = false;
            startPoint.set(event.getX(), event.getY());
            savedMatrix.set(matrix);
            mode = DRAG;
            break;

        case MotionEvent.ACTION_UP:
            if (!isMoved) {
                v.performClick();
            }
            break;

        case MotionEvent.ACTION_POINTER_UP:
            mode = NONE;
            savedMatrix.set(matrix);
            break;

        case MotionEvent.ACTION_MOVE:

            if (mode == DRAG) {
                matrix.set(savedMatrix);
                matrix.postTranslate(event.getX() - startPoint.x, event.getY()
                        - startPoint.y);
            } else if (mode == ZOOM) {

                float newDist = spacing(event);
                if (newDist > 10f) {
                    matrix.set(savedMatrix);
                    float scale = newDist / oldDist;
                    matrix.postScale(scale, scale, midPoint.x, midPoint.y);
                }
            }
            isMoved = true;
            break;

        case MotionEvent.ACTION_POINTER_DOWN:

            oldDist = spacing(event);

            if (oldDist > 10f) {
                savedMatrix.set(matrix);
                midPoint(midPoint, event);
                mode = ZOOM;
                isMoved = false;
            }
            break;
        }

        imageView.setImageMatrix(matrix);
        return true;
    }
@SuppressLint("FloatMath")
    private float spacing(MotionEvent event) {
        float x = event.getX(0) - event.getX(1);
        float y = event.getY(0) - event.getY(1);
        return (float) Math.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);
    }

你还没有给出你的onclick代码,所以我想那是可以的。 您正在从ontouch返回true,返回false在那里它将起作用
如果要执行onClick,那么必须从ontouch返回false。

您还没有给出onClick代码,所以我认为这样可以。 您正在从ontouch返回true,返回false在那里它将起作用
当您返回true时,那么onClick method not execute如果您还想执行onClick,那么您必须从ontouch返回false。

您可以使用以下逻辑来区分
ontouch()
onClick()

宣布:

private static final int DurationOfClick = 2000;  //duration of tap on screen
private long clickTime;
现在在
onTouch(视图v,运动事件)
中写入条件

@Override
public boolean onTouch(View v, MotionEvent event) {
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN: {
            clickTime = Calendar.getInstance().getTimeInMillis();
            break;
        }
        case MotionEvent.ACTION_UP: {
            long duration = Calendar.getInstance().getTimeInMillis() - clickTime;
            if(duration < DurationOfClick) {
                //click event has occurred write ur code
            }else{
                //touch event has occurred write ur code
            }
        }
    }
    return true;
}
@覆盖
公共布尔onTouch(视图v,运动事件){
开关(event.getAction()){
case MotionEvent.ACTION\u DOWN:{
clickTime=Calendar.getInstance().getTimeInMillis();
打破
}
case MotionEvent.ACTION\u UP:{
长持续时间=Calendar.getInstance().getTimeInMillis()-单击时间;
if(持续时间<点击持续时间){
//单击事件已发生,请写入您的代码
}否则{
//发生触摸事件并写入ur代码
}
}
}
返回true;
}

您可以使用以下逻辑来区分
onTouch()
onClick()

宣布:

private static final int DurationOfClick = 2000;  //duration of tap on screen
private long clickTime;
现在在
onTouch(视图v,运动事件)
中写入条件

@Override
public boolean onTouch(View v, MotionEvent event) {
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN: {
            clickTime = Calendar.getInstance().getTimeInMillis();
            break;
        }
        case MotionEvent.ACTION_UP: {
            long duration = Calendar.getInstance().getTimeInMillis() - clickTime;
            if(duration < DurationOfClick) {
                //click event has occurred write ur code
            }else{
                //touch event has occurred write ur code
            }
        }
    }
    return true;
}
@覆盖
公共布尔onTouch(视图v,运动事件){
开关(event.getAction()){
case MotionEvent.ACTION\u DOWN:{
clickTime=Calendar.getInstance().getTimeInMillis();
打破
}
case MotionEvent.ACTION\u UP:{
长持续时间=Calendar.getInstance().getTimeInMillis()-单击时间;
if(持续时间<点击持续时间){
//单击事件已发生,请写入您的代码
}否则{
//发生触摸事件并写入ur代码
}
}
}
返回true;
}
无论是
onClick()
还是
onTouch()
都是手势检测器,有一个消费系统。每次您在设备的触觉上做一个手势时,附加到此特定视图的所有手势检测器(
onClick()
onTouch()
onDoubleTap()
…)都将逐个调用。如果在GestureDetector的末尾返回true,则事件将被消耗,其他GestureDetector将不会被调用。如果返回false,则不会使用事件,并调用下一个GestureDetector

因此,为了执行
onClick()
onTouch()之后调用的
onClick()
,请确保在它的末尾返回false。

两个
onClick()
onTouch()
都是手势检测器,并且有一个消费系统。每次您在设备的触觉上做一个手势时,附加到此特定视图的所有手势检测器(
onClick()
onTouch()
onDoubleTap()
…)都将逐个调用。如果在GestureDetector的末尾返回true,则事件将被消耗,其他GestureDetector将不会被调用。如果返回false,则不会使用事件,并调用下一个GestureDetector


因此,要执行
onClick()
onTouch()之后调用的
onClick()
,请确保在其末尾返回false。

下面的thnik代码将对您有所帮助,请尝试以下操作

  ImageView image_name = (ImageView) findViewById(R.id.image); //Find your image here
    image_name.setOnTouchListener(new OnTouchListener() {

        public boolean onTouch(View v, MotionEvent event) {
            Log.d("test", "ontouch");
            return false;
        }
    });
    image_name.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
            Log.d("test", "onclick");
        }

    });

或者你可以使用android go-through的GestureDetector属性我下面的thnik代码对你有帮助,试试这个

  ImageView image_name = (ImageView) findViewById(R.id.image); //Find your image here
    image_name.setOnTouchListener(new OnTouchListener() {

        public boolean onTouch(View v, MotionEvent event) {
            Log.d("test", "ontouch");
            return false;
        }
    });
    image_name.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
            Log.d("test", "onclick");
        }

    });

或者你可以使用android go-through的GestureDetector属性我正在使用GestureDetector并解决我的问题。谢谢你的建议这是我的答案

private GestureDetector gestureDetector;
gestureDetector = new GestureDetector(this, new SingleTapConfirm());

public boolean onTouch(View v, MotionEvent event) {

        ImageView imageView = (ImageView) v;
        imageView.setScaleType(ScaleType.MATRIX);
        if (gestureDetector.onTouchEvent(event)) {
            v.performClick();
        } else {
            switch (event.getAction() & MotionEvent.ACTION_MASK) {

            case MotionEvent.ACTION_DOWN:


                matrix.set(imageView.getImageMatrix());
                // isMoved = false;
                startPoint.set(event.getX(), event.getY());
                savedMatrix.set(matrix);
                mode = DRAG;
                break;

            case MotionEvent.ACTION_UP:
                /*
                 * if (!isMoved) { v.performClick(); }
                 */
                break;

            case MotionEvent.ACTION_POINTER_UP:
                mode = NONE;
                savedMatrix.set(matrix);
                break;

            case MotionEvent.ACTION_MOVE:

                if (mode == DRAG) {
                    matrix.set(savedMatrix);
                    matrix.postTranslate(event.getX() - startPoint.x,
                            event.getY() - startPoint.y);
                } else if (mode == ZOOM) {

                    float newDist = spacing(event);
                    if (newDist > 10f) {
                        matrix.set(savedMatrix);
                        float scale = newDist / oldDist;
                        matrix.postScale(scale, scale, midPoint.x, midPoint.y);
                    }
                }
                // isMoved = true;
                break;

            case MotionEvent.ACTION_POINTER_DOWN:

                oldDist = spacing(event);

                if (oldDist > 10f) {
                    savedMatrix.set(matrix);
                    midPoint(midPoint, event);
                    mode = ZOOM;
                    // isMoved = false;
                }
                break;
            }

            imageView.setImageMatrix(matrix);
        }
        return true;
    }

    @SuppressLint("FloatMath")
    private float spacing(MotionEvent event) {
        float x = event.getX(0) - event.getX(1);
        float y = event.getY(0) - event.getY(1);
        return (float) Math.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 class SingleTapConfirm extends SimpleOnGestureListener {

        @Override
        public boolean onSingleTapUp(MotionEvent event) {
            return true;
        }
    }

我正在使用手势检测器解决我的问题。谢谢你的建议这是我的答案

private GestureDetector gestureDetector;
gestureDetector = new GestureDetector(this, new SingleTapConfirm());

public boolean onTouch(View v, MotionEvent event) {

        ImageView imageView = (ImageView) v;
        imageView.setScaleType(ScaleType.MATRIX);
        if (gestureDetector.onTouchEvent(event)) {
            v.performClick();
        } else {
            switch (event.getAction() & MotionEvent.ACTION_MASK) {

            case MotionEvent.ACTION_DOWN:


                matrix.set(imageView.getImageMatrix());
                // isMoved = false;
                startPoint.set(event.getX(), event.getY());
                savedMatrix.set(matrix);
                mode = DRAG;
                break;

            case MotionEvent.ACTION_UP:
                /*
                 * if (!isMoved) { v.performClick(); }
                 */
                break;

            case MotionEvent.ACTION_POINTER_UP:
                mode = NONE;
                savedMatrix.set(matrix);
                break;

            case MotionEvent.ACTION_MOVE:

                if (mode == DRAG) {
                    matrix.set(savedMatrix);
                    matrix.postTranslate(event.getX() - startPoint.x,
                            event.getY() - startPoint.y);
                } else if (mode == ZOOM) {

                    float newDist = spacing(event);
                    if (newDist > 10f) {
                        matrix.set(savedMatrix);
                        float scale = newDist / oldDist;
                        matrix.postScale(scale, scale, midPoint.x, midPoint.y);
                    }
                }
                // isMoved = true;
                break;

            case MotionEvent.ACTION_POINTER_DOWN:

                oldDist = spacing(event);

                if (oldDist > 10f) {
                    savedMatrix.set(matrix);
                    midPoint(midPoint, event);
                    mode = ZOOM;
                    // isMoved = false;
                }
                break;
            }

            imageView.setImageMatrix(matrix);
        }
        return true;
    }

    @SuppressLint("FloatMath")
    private float spacing(MotionEvent event) {
        float x = event.getX(0) - event.getX(1);
        float y = event.getY(0) - event.getY(1);
        return (float) Math.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 class SingleTapConfirm extends SimpleOnGestureListener {

        @Override
        public boolean onSingleTapUp(MotionEvent event) {
            return true;
        }
    }

似乎您正在尝试通过触摸使ImageView既可单击也可移动。如果是这样的话,那么我建议研究SimpleStatureDetector。似乎您正在尝试通过触摸使ImageView既可单击也可移动。如果是这样的话,那么我建议研究SimpleStatureDetector。