1

在我的 Android 应用程序中,我有一个使用视图寻呼机显示 4 个以上页面(片段)的活动。我通过调用在每个屏幕上实现了在页面之间移动的按钮:

pager.setCurrentItem(position, true);

视图寻呼机和片段都按我的意愿工作。然后我开始寻找一种解决方案来禁用用户在页面之间滑动,以便页面之间的转换仅由按钮处理。我发现的解决方案在一些 stackoverflow 文章以及This Blog中提到,建议子类化视图寻呼机以拦截触摸事件以禁用滑动。我通过子类化视图寻呼机类来遵循这些示例,如下所示:

public class ViewPager extends android.support.v4.view.ViewPager {

    private boolean enabled;

    public ViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.enabled = true;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (this.enabled) {
            return super.onTouchEvent(event);
        }

        return false;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        if (this.enabled) {
            return super.onInterceptTouchEvent(event);
        }

        return false;
    }

    public void setSwipingEnabled(boolean enabled) {
        this.enabled = enabled;
    }

}


使用子类视图寻呼机并按需要setSwipingEnabled(false)进行调用。用户不能再通过滑动手势在页面之间移动,我仍然可以通过调用setCurrentItem(int position, boolean smoothScroll). 但是,使用子类会破坏页面之间的动画。当我setCurrentItem(position, true)使用 android.support.v4.view.ViewPager 调用时,我会在页面之间获得非常干净的滚动动画。当我使用子类进行相同的调用时,屏幕有一个非常短暂的“闪光”,然后自动绘制新页面。

我想知道如何修复动画,同时保留禁用用户在页面之间滑动的能力。我非常感谢任何帮助。如果您需要任何其他信息,请告诉我。到目前为止,我已经使用运行 2.3.5 的三星设备和针对 Android 2.3.3 的 AVD 模拟器进行了测试。

更新:

我已经尝试了几件事,希望我能走运并找到解决方案。我查看了android.support.v4.view.ViewPager我正在扩展的源代码,发现实际滚动代码的“大部分”在onTouchEvent(MotionEvent event)方法中。我没有将其子类化,而是尝试使用普通视图寻呼机并调用以下内容来使用触摸事件:

pager.setOnTouchListener(new View.onTouchListener() {
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return true;
    }
});

这样做部分有效。它可以防止滑动触发滚动到下一个视图。然而,来自 android.support.v4.view.ViewPager 的方法在将触摸事件传递给该方法onInterceptTouchEvent(MotionEvent event)之前会进行小滚动作为拦截的一部分。onTouchEvent()如果不对 ViewPager 进行子类化,我看不到任何改变这种行为的方法。

4

0 回答 0