Android 带有水平滚动视图内部片段的垂直视图寻呼机
我有一个要水平滚动的Android 带有水平滚动视图内部片段的垂直视图寻呼机,android,android-viewpager,horizontalscrollview,touch-event,Android,Android Viewpager,Horizontalscrollview,Touch Event,我有一个要水平滚动的片段内容。垂直分页工作正常,直到水平内容足够大,可以滚动为止。之后,触摸事件不会传递到ViewPager,因此分页不再工作 MVCE 这可以通过设置一个简单的项目来复制,如我刚刚发布的文章中所示 将fragment\u one.xml文件替换为 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schema
片段
内容。垂直分页工作正常,直到水平内容足够大,可以滚动为止。之后,触摸事件不会传递到ViewPager
,因此分页不再工作
MVCE
这可以通过设置一个简单的项目来复制,如我刚刚发布的文章中所示
将fragment\u 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>
并将文本设置为足以水平滚动的任何长度
我尝试过的事情
- 当前位置那很快就变成了一条死胡同,因为它显然是一条死胡同。我曾考虑将视图转换为
,但这不是一个简单的项目HorizontalNextedScrollView
- 自定义
:我尝试将答案转换为类似和的水平滚动,但没有成功。我将继续在这方面进行试验HorizontalScrollView
- 这不是一个简单的问题,但我觉得解决方案应该是类似的
HorizontalScrollView
(图中的视图组B)正在处理所有触摸事件,而VerticalViewPage
(视图组A)才有机会处理这些事件。因此,解决方案是在VerticalViewPage
中使用onInterceptTouchEvent()
有选择地过滤掉垂直滚动条。为此,只需使用GestureDetector.SimpleOnGestureListener.onScroll()
就可以了
以下是您需要对类进行的相关更改,以实现这一点:
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);
}
}
}
为了回答这个问题和其他类似的问题,了解Android框架如何处理触摸事件非常有帮助。我的,但我将包括下面的摘要图表
HorizontalScrollView
(图中的视图组B)正在处理所有触摸事件,而VerticalViewPage
(视图组A)才有机会处理这些事件。因此,解决方案是在VerticalViewPage
中使用onInterceptTouchEvent()
有选择地过滤掉垂直滚动条。为此,只需使用GestureDetector.SimpleOnGestureListener.onScroll()
就可以了
以下是您需要对类进行的相关更改,以实现这一点:
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);
}
}
}
我碰巧写了一些类似的东西,但是我的案例是VerticalViewPage和HorizontalViewPager而不是HorizontalScrollView,我写了一篇关于它的博客,也许这会帮助人们研究这个话题:我碰巧写了一些类似的东西,但是我的案例是VerticalViewPage和HorizontalViewPager而不是HorizontalScrollView,我写了一篇关于它的博客,也许这将有助于人们研究这个话题: