首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有HorizontalScrollView片段的垂直HorizontalScrollView

带有HorizontalScrollView片段的垂直HorizontalScrollView
EN

Stack Overflow用户
提问于 2017-10-19 11:32:28
回答 1查看 635关注 0票数 1

我有一个VerticalViewPager,它的Fragment内容想要水平滚动。垂直分页工作正常,直到水平内容足够大才能滚动。在此之后,触摸事件不会传递给ViewPager,因此分页不再有效。

MVCE

这可以通过设置一个简单的项目来复制,就像我刚才发布的这个答案中给出的那样。

fragment_one.xml文件替换为

代码语言:javascript
复制
<?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:我尝试将之类的答案转换为水平滚动,但没有成功。我要继续在这方面做实验。
  • 这不是一个DoubleViewPager,但我觉得解决方案应该是类似的。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-23 04:06:51

为了回答这个问题和其他类似的问题,理解Android如何处理触摸事件非常有帮助。我的富勒对此的回答在这里,但我将包括下面的摘要图。

HorizontalScrollView (图中的ViewGroup B)在VerticalViewPager (ViewGroup A)有机会之前处理所有的触摸事件。因此,解决方案是使用onInterceptTouchEvent()VerticalViewPager中有选择地过滤掉垂直卷轴。因此,只使用GestureDetector.SimpleOnGestureListener.onScroll()是最简单的。

为了实现这一点,您需要对VerticalViewPager类进行相关的更改:

代码语言:javascript
复制
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);
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46828920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档