Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 带有水平滚动视图内部片段的垂直视图寻呼机_Android_Android Viewpager_Horizontalscrollview_Touch Event - Fatal编程技术网

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
    :我尝试将答案转换为类似和的水平滚动,但没有成功。我将继续在这方面进行试验
  • 这不是一个简单的问题,但我觉得解决方案应该是类似的

为了回答这个问题和其他类似问题,了解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);
        }
    }
}

为了回答这个问题和其他类似的问题,了解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,我写了一篇关于它的博客,也许这将有助于人们研究这个话题: