user3102515
user3102515

Reputation: 21

Dispatching ViewPager touch events to underlying view

I have a ViewPager that has 2 pages. On 1 of them there is a custom view along with some other widgets. What I want is to disable paging if the touch event was used by that custom view.

Here's the relevant code from my custom view:

class OscilloscopeView extends View implements GestureDetector.OnGestureListener {

    OscilloscopeView(Context context){

        mGestureDetector = new GestureDetectorCompat(context, this);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        return super.onTouchEvent(event) || mGestureDetector.onTouchEvent(event);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {

        return super.dispatchTouchEvent(event) || mGestureDetector.onTouchEvent(event);
    }

    @Override
    public boolean onDown(MotionEvent motionEvent) {
        Log.d("MDETECTOR", "onDown: " + motionEvent.toString());
        return true;
    }

    @Override
    public void onShowPress(MotionEvent motionEvent) {

    }

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

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
        int dHPos = (int) (distanceX / mWidth * points.length / 2);
        if (Utilities.around(hPosition - dHPos, 0, points.length / 4))
            hPosition -= dHPos;
        triggerLevel += (2 * distanceY / mHeight * max);
        invalidate();
        return true;
    }

    @Override
    public void onLongPress(MotionEvent motionEvent) {
        hPosition = 0;
        triggerLevel = 0;
    }

    @Override
    public boolean onFling(MotionEvent motionEvent, MotionEvent motionEvent2, float v, float v2) {
        Log.d("MDETECTOR", "onFling: " + motionEvent.toString());
        return true;
    }
}

The ViewPager is a normal one, no methods overridden. So, what methods must I override and how so that if the scroll event is located inside the view area, that event is no longer passed to the ViewPager, while if a swipe outside of the view, the ViewPager works normally. I'm guessing I shouldn't call super on some methods but I'm not sure.

Upvotes: 0

Views: 947

Answers (1)

user3102515
user3102515

Reputation: 21

@Override
public boolean onTouchEvent(MotionEvent event) {

    ViewParent parent = getParent();

    parent.requestDisallowInterceptTouchEvent(true);

    return super.onTouchEvent(event) || mGestureDetector.onTouchEvent(event);
}

Upvotes: 1

Related Questions