user7457615
user7457615

Reputation:

Handle onClick() and onTouch() Both,android

I have perform onClick() and onTouch() on same imageView, simple open Gallery on onClick(),but problem is that my onclick() not work,while onTouch() work properly. can anyone clear me what was actual problem.Thank you. Here is my code..,

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);
    }

Upvotes: 0

Views: 510

Answers (5)

user7457615
user7457615

Reputation:

I am using GestureDetector and my issue solve. Thank you for suggestions here is my answer..,

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;
        }
    }

Upvotes: 0

Cedric Franck
Cedric Franck

Reputation: 526

Both onClick() and onTouch() are GesturesDetectors and there is a system of consumption. Each time you make a Gesture on the tactile of the device, all the GesturesDetectors (onClick(), onTouch(), onDoubleTap()...) attached to this specific view will be called one by one. If at then end of the GestureDetector you return true, then the event is consummed and the others GestureDetector will not be call. If you return false, the event is not consummed and the next GestureDetector is called.

So in order to perform onClick() wich is called after onTouch() be sure to return false at the end of it.

Upvotes: 2

Nazim ch
Nazim ch

Reputation: 854

I thnik code below wil be helpful for you ,try this

  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");
        }

    });

or you can use GestureDetector property of android go through this

Upvotes: 0

rafsanahmad007
rafsanahmad007

Reputation: 23881

you can use the following logic to distinguish between onTouch() and onClick()

Declare:

private static final int DurationOfClick = 2000;  //duration of tap on screen
private long clickTime;

Now in onTouch(View v, MotionEvent event) write the condition..

@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;
}

Upvotes: 0

Rishikesh pathak
Rishikesh pathak

Reputation: 433

You havent given your onclick code so i assume that will be ok. You are returning true from ontouch return false there it will work When you return true then onClick method not execute if you want to execute onclick also then you have to return false from ontouch.

Upvotes: 0

Related Questions