安卓 - ViewPager 滚动重置

6
我在我的应用程序中使用了一个ViewPager,其中包含一个水平布局的图像,以实现分页画廊。
当我仅测试视图时,即作为活动的主要视图时,它可以正常工作。然而,当我将其作为另一个布局的一部分包含时,滚动(或轻扫)变得奇怪。如果在滑动过程中,它会在一半左右重置到原始位置(只有非常快的轻扫才能正常工作)。
有什么想法是什么问题吗?
以防万一有任何相关性,视图是从XML填充并添加到继承类PagerAdapter中。
1个回答

9

是的,默认情况下,ViewPager和其他可滚动项不兼容。当我需要做这样的事情时,我通常会子类化ViewPager以创建一个能够识别可以滚动的子项的对象。然后在我的onInterceptTouchEvent()中,我检查触摸区域是否在该子项内,并且不拦截触摸事件,以便子项有机会处理它。类似于以下内容:

/**
 * Override to not intercept touch events within our scroller if it exists.
 */
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    if(scrollerId != 0) {
        View scroller = findViewById(scrollerId);
        if(scroller != null) {
            Rect rect = new Rect();
            scroller.getHitRect(rect);
            if(rect.contains((int)ev.getX(), (int)ev.getY())) {
                return false;
            }
        }
    }
    return super.onInterceptTouchEvent(ev);
}

然后,您需要一种设置“scrollerId”的方法(一个简单的公共方法即可)。
请注意,如果您正在使用ScrollView垂直滚动元素并具有ViewPager子项,则需要采用不同的方法。创建ScrollView的子类,检测垂直滚动方向并放弃水平滚动,以便ViewPager接管。
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    switch (ev.getAction()) {
        case MotionEvent.ACTION_DOWN:
            xDistance = yDistance = 0f;
            lastX = ev.getX();
            lastY = ev.getY();
            break;
        case MotionEvent.ACTION_MOVE:
            final float curX = ev.getX();
            final float curY = ev.getY();
            xDistance += Math.abs(curX - lastX);
            yDistance += Math.abs(curY - lastY);
            lastX = curX;
            lastY = curY;
            if (xDistance > yDistance)
                return false;
    }

    return super.onInterceptTouchEvent(ev);
}

我想到了MotionEvents...我从来没有完全理解过那些东西,但也许示例代码会帮助我到达那里...我现在只是要尝试一下。 - Saad Farooq
嗯...可以啊。但既然我现在开始理解了,我估计很快就会遇到另一个问题,因为我打算让ViewPager中的图像可点击并启动活动。有什么提示吗...我想我应该捕获ACTION_MOVE并让ACTION_DOWN类似于您的第二个示例。 - Saad Farooq
不,这应该不是什么大问题。在ImageView上设置您的“onClickListener”,并确保将它们设置为可点击(无论是在XML布局中还是在代码中),那么您就可以了。单击操作与移动事件的路径略有不同。 - Brian Dupuis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接