范围
有一个包含两个片段的viewpager。其中一个片段具有侦听X轴onTouch变化的布局。
问题
当触摸并沿着X轴滑动时,布局几乎无法获取所有Action.Move事件。似乎viewpager具有返回true的onInterceptTouchEvent。
问题
是否真的可以覆盖viewpager的行为以使其与我的布局共同工作?因此,完美的情况是布局拦截其上的所有onTouch事件,而viewpager则管理其余的onTouch事件。谢谢!
有一个包含两个片段的viewpager。其中一个片段具有侦听X轴onTouch变化的布局。
当触摸并沿着X轴滑动时,布局几乎无法获取所有Action.Move事件。似乎viewpager具有返回true的onInterceptTouchEvent。
是否真的可以覆盖viewpager的行为以使其与我的布局共同工作?因此,完美的情况是布局拦截其上的所有onTouch事件,而viewpager则管理其余的onTouch事件。谢谢!
你是正确的,我相信每个滚动容器都会拦截触摸事件,但你可以防止它。你可以在你的布局上放置一个触摸监听器:
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
pager.requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
pager.requestDisallowInterceptTouchEvent(false);
break;
}
}
getParent().request...
就足够了,父级将传播请求。这使得在自定义视图中更加灵活可用。request...
就足够了。但实际上必须为每个触摸事件都调用它。这就是为什么你必须在 onTouch()
中这样做。 @dev_android类似的情况(但不使用ViewPager),将此代码添加到需要触摸事件的视图中,对我起到了作用。如果适用于您的用例,请添加对除 ACTION_MOVE
之外的 MotionEvent 的检查。
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_MOVE) {
this.getParent().requestDisallowInterceptTouchEvent(true);
return true;
} else {
return super.onTouchEvent(event);
}
}
getParent().requestDisallowInterceptTouchEvent(true);
我曾经遇到过类似的问题。
我的情况是在ViewPager
上设置了一个OnTouchListener
,但当接收触摸事件的子元素有onClick
时,它无法接收到触摸事件。
我所做的是扩展ViewPager类,并在方法onInterceptTouchEvent(boolean)
中调用我的点击监听器,这样就可以正常工作了。只要小心不要拦截错误的事件。