将 ViewPager 触摸事件分派到底层视图
Dispatching ViewPager touch events to underlying view
我有一个包含 2 个页面的 ViewPager。其中 1 个有一个自定义视图以及一些其他小部件。如果该自定义视图使用了触摸事件,我想要的是禁用分页。
这是我的自定义视图中的相关代码:
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,而如果在视图外滑动,ViewPager 将正常工作。我猜我不应该在某些方法上调用 super 但我不确定。
@Override
public boolean onTouchEvent(MotionEvent event) {
ViewParent parent = getParent();
parent.requestDisallowInterceptTouchEvent(true);
return super.onTouchEvent(event) || mGestureDetector.onTouchEvent(event);
}
我有一个包含 2 个页面的 ViewPager。其中 1 个有一个自定义视图以及一些其他小部件。如果该自定义视图使用了触摸事件,我想要的是禁用分页。
这是我的自定义视图中的相关代码:
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,而如果在视图外滑动,ViewPager 将正常工作。我猜我不应该在某些方法上调用 super 但我不确定。
@Override
public boolean onTouchEvent(MotionEvent event) {
ViewParent parent = getParent();
parent.requestDisallowInterceptTouchEvent(true);
return super.onTouchEvent(event) || mGestureDetector.onTouchEvent(event);
}