子类化ViewPager打破动画

时间:2012-11-05 22:58:11

标签: android android-viewpager android-animation

在我的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)按钮点击在页面之间移动。但是,使用子类会在页面之间中断动画。当我用android.support.v4.view.ViewPager调用setCurrentItem(position, true)时,我会在页面之间滚动动画。当我使用子类进行相同的调用时,屏幕会有一个非常短暂的“闪烁”,然后自动绘制新页面。

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

更新

我尝试了几件事,希望我能幸运并找到解决方案。我查看了我正在扩展的android.support.v4.view.ViewPager的源代码,发现该实际滚动代码的“MOST”在onTouchEvent(MotionEvent event)方法中。我尝试使用普通的视图寻呼机并调用下面的消息来使用触摸事件,而不是继承它:

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

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

0 个答案:

没有答案