我有一个VerticalViewPager,它的Fragment内容想要水平滚动。垂直分页工作正常,直到水平内容足够大才能滚动。在此之后,触摸事件不会传递给ViewPager,因此分页不再有效。
MVCE
这可以通过设置一个简单的项目来复制,就像我刚才发布的这个答案中给出的那样。
将fragment_one.xml文件替换为
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<HorizontalScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerInParent="true" >
<TextView
android:id="@+id/textview"
android:textSize="30sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</HorizontalScrollView>
</RelativeLayout>并将文本设置为任何足以水平滚动的长度。
我试过的东西
NestedScrollView:这很快就成了死胡同,因为它显然是不适用于水平滚动。我考虑过将源代码转换为HorizontalNextedScrollView,但这不是一个简单的项目。HorizontalScrollView:我尝试将这和这之类的答案转换为水平滚动,但没有成功。我要继续在这方面做实验。发布于 2017-10-23 04:06:51
为了回答这个问题和其他类似的问题,理解Android如何处理触摸事件非常有帮助。我的富勒对此的回答在这里,但我将包括下面的摘要图。

HorizontalScrollView (图中的ViewGroup B)在VerticalViewPager (ViewGroup A)有机会之前处理所有的触摸事件。因此,解决方案是使用onInterceptTouchEvent()在VerticalViewPager中有选择地过滤掉垂直卷轴。因此,只使用GestureDetector.SimpleOnGestureListener.onScroll()是最简单的。
为了实现这一点,您需要对VerticalViewPager类进行相关的更改:
public class VerticalViewPager extends ViewPager {
GestureDetector mDetector;
private void init() {
// ...
mDetector = new GestureDetector(getContext(), new VerticalScrollListener());
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
super.onInterceptTouchEvent(flipXY(ev));
flipXY(ev);
return mDetector.onTouchEvent(ev);
}
class VerticalScrollListener extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY) {
return Math.abs(distanceY) > Math.abs(distanceX);
}
}
}https://stackoverflow.com/questions/46828920
复制相似问题