androidAnonDev
androidAnonDev

Reputation: 459

Android: Implementation fling in onTouchListener of custom view

I create custom ImageView with some features and my problem is implementation fling. Now view has drag and zoom features. Here is onTouchListener:

@Override
public boolean onTouchEvent(MotionEvent event) {
    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:
            oldDist = spacing(event);
            if (oldDist > 10f) {
                savedMatrix.set(matrix);
                midPoint(mid, event);
                mode = ZOOM;
            }
            break;
        case MotionEvent.ACTION_UP:
            float[] values = new float[9];
            matrix.getValues(values);
        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 newDist = spacing(event);
                if (newDist > 10f) {
                    matrix.set(savedMatrix);
                    float scale = newDist / oldDist;
                    //SOME CODE
                }
            }
            break;
    }
    invalidate();
    return true;
}

I want to detect fling in listener and smoothly translate matrix after fling. I would be very grateful if there is a working solution for my task.

Upvotes: 0

Views: 1026

Answers (1)

sadat
sadat

Reputation: 4352

You can GestureDetector,

class MyGestureListener implements GestureDetector.OnGestureListener {

    @Override
    public boolean onFling(MotionEvent event1, MotionEvent event2,
                           float velocityX, float velocityY) {
        if (event1.getY() - event2.getY() > SWIPE_MIN_DISTANCE && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) {
            return true; 
        } else if (event2.getY() - event1.getY() > SWIPE_MIN_DISTANCE && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) {
            return true; 
        }
        return true;
    }

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

    @Override
    public void onShowPress(MotionEvent motionEvent) {

    }

    @Override
    public boolean onSingleTapUp(MotionEvent motionEvent) {
        return false;
    }

    @Override
    public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
        return false;
    }

    @Override
    public void onLongPress(MotionEvent motionEvent) {

    }
}

your onTouch method,

@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
    return new GestureDetectorCompat(getActivity(), new MyGestureListener()).onTouchEvent(motionEvent);
}

Upvotes: 1

Related Questions