【问题标题】:Dispatching ViewPager touch events to underlying view将 ViewPager 触摸事件分派到底层视图
【发布时间】:2015-03-09 19:05:18
【问题描述】:

我有一个有 2 页的 ViewPager。其中之一有一个自定义视图以及其他一些小部件。如果该自定义视图使用了触摸事件,我想要的是禁用分页。

这是我自定义视图中的相关代码:

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

ViewPager 是一个普通的,没有重写任何方法。那么,我必须重写哪些方法以及如何在滚动事件位于视图区域内时,该事件不再传递给 ViewPager,而如果在视图之外滑动,则 ViewPager 正常工作。我猜我不应该在某些方法上调用 super,但我不确定。

【问题讨论】:

    标签: android events android-viewpager touch dispatch


    【解决方案1】:
    @Override
    public boolean onTouchEvent(MotionEvent event) {
    
        ViewParent parent = getParent();
    
        parent.requestDisallowInterceptTouchEvent(true);
    
        return super.onTouchEvent(event) || mGestureDetector.onTouchEvent(event);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多