在我的 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 进行子类化,我看不到任何改变这种行为的方法。