ViewPager如何区分自动切换和手势滑动切换

简介: ViewPager是一个很常见的组件,不仅支持收拾滑动切换页面,我们还可以通过`viewPager.setCurrentItem(index)`来切换到指定的页面,那么他们如何区分呢?我们知道ViewPager可以添加`ViewPager.OnPageChangeListener`监听器,可以监听切换的状态。通过观察`ViewPager.OnPageChangeListener#onPageScrollStateChanged(int state)`方法中state的输出,发现了手势切换和自动切换的规律。

ViewPager是一个很常见的组件,不仅支持收拾滑动切换页面,我们还可以通过viewPager.setCurrentItem(index)来切换到指定的页面,那么他们如何区分呢?

我们知道ViewPager可以添加ViewPager.OnPageChangeListener监听器,可以监听切换的状态。通过观察ViewPager.OnPageChangeListener#onPageScrollStateChanged(int state)方法中state的输出,发现了手势切换和自动切换的规律,具体规律如下:

手势滑动翻页的log:

OnPageChangeListener onPageScrollStateChanged state:1
OnPageChangeListener onPageScrollStateChanged state:2
OnPageChangeListener onPageSelected position:1
OnPageChangeListener onPageScrollStateChanged state:0

代码翻页的log:

OnPageChangeListener onPageScrollStateChanged state:2
OnPageChangeListener onPageSelected position:9
OnPageChangeListener onPageScrollStateChanged state:0

根据log可以得出如下结论:

手势滑动翻页,是1、2、0(ViewPager.SCROLL_STATE_DRAGGING、ViewPager.SCROLL_STATE_SETTLING、ViewPager.SCROLL_STATE_IDLE)
代码翻页,是2、0(ViewPager.SCROLL_STATE_SETTLING、ViewPager.SCROLL_STATE_IDLE)

根据这个规律,我们可以写出以下代码:我们在onPageScrollStateChanged判断是否是手动的状态,并且可以在onPageSelected方法中使用这个状态。

/**
 * 是否是用户手动切换ViewPager
 */
private boolean manualDraging = false;

viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        LogUtils.e(TAG, "OnPageChangeListener onPageScrolled:" + position);
    }

    @Override
    public void onPageSelected(int position) {
        // 如果是手动模式,就暂停播放,同时清除掉各种状态;
        if (manualDraging) {
            LogUtils.e(TAG, "手动切换");
        } else {
            LogUtils.e(TAG, "代码切换");
        }
    }


    @Override
    /**
     * 代码翻页,是2、0(ViewPager.SCROLL_STATE_SETTLING、ViewPager.SCROLL_STATE_IDLE)
     * 手动滑动翻页,是1、2、0(ViewPager.SCROLL_STATE_DRAGGING、ViewPager.SCROLL_STATE_SETTLING、ViewPager.SCROLL_STATE_IDLE)
     * {@link ViewPager.SCROLL_STATE_IDLE}
     * {@link ViewPager.SCROLL_STATE_DRAGGING}
     * {@link ViewPager.SCROLL_STATE_SETTLING}
     */
    public void onPageScrollStateChanged(int state) {
        LogUtils.e(TAG, "OnPageChangeListener onPageScrollStateChanged state:" + state);
        switch (state) {
            case ViewPager.SCROLL_STATE_IDLE:
                manualDraging = false;
                break;
            case ViewPager.SCROLL_STATE_DRAGGING:
                manualDraging = true;
                break;
            case ViewPager.SCROLL_STATE_SETTLING:
                break;
            default:
                break;
        }
    }
});
相关文章
|
Android开发
Android 使用ViewPager实现手动左右切换页面和底部点点跟随切换效果
Android 使用ViewPager实现手动左右切换页面和底部点点跟随切换效果
190 0
不用涉及到各种冲突常规打造酷炫下拉视差效果SmartRefreshLayout+ViewPager+RecyclerView
不用涉及到各种冲突常规打造酷炫下拉视差效果SmartRefreshLayout+ViewPager+RecyclerView
255 0
|
6月前
|
Android开发
Android SystemUI去掉拖动亮度条QSPanel界面隐藏功能
Android SystemUI去掉拖动亮度条QSPanel界面隐藏功能
131 0
|
JavaScript 开发者
组件切换-应用切换动画和 mode 方式|学习笔记
快速学习组件切换-应用切换动画和 mode 方式
124 0
组件切换-应用切换动画和 mode 方式|学习笔记
BottomNavigationView使用,配合ViewPager、修改图标大小、去掉文字等
BottomNavigationView使用,配合ViewPager、修改图标大小、去掉文字等
669 0
BottomNavigationView使用,配合ViewPager、修改图标大小、去掉文字等
|
缓存
仿微信PhotoView+Viewpager浏览视频,图片,切换下一页前一页恢复原本大小
仿微信PhotoView+Viewpager浏览视频,图片,切换下一页前一页恢复原本大小
239 0
仿微信PhotoView+Viewpager浏览视频,图片,切换下一页前一页恢复原本大小
|
小程序 JavaScript
小程序自定义底部导航栏,切换不同页面显示不同tabBar
小程序自定义底部导航栏,切换不同页面显示不同tabBar
3590 0
小程序自定义底部导航栏,切换不同页面显示不同tabBar
|
API Android开发 索引
复杂type页面封装库,支持多种状态切换和下拉刷新上拉加载
目录介绍 1.复杂页面库介绍 2.本库优势亮点 2.1 支持多种状态切换管理 2.2 支持添加多个header和footer 2.3 支持侧滑功能和拖拽移动 2.4 其他亮点介绍 3.如何使用介绍 3.
1261 0
|
移动开发 Android开发 iOS开发
ReactNative切换Tab改变状态栏
Ready 现在大多数的ReactNative使用的路由都是react navigation.本示例就以react-navigation为例.解决其中遇到有需要切换tab来改变顶部状态栏字体以及背景色的需求 Go only have a single line of code componentDidMount() { this.
1387 0
2-VIII--ViewPager滑动监听与自定义滑动特效
零、前言 [1]. 使用上文项目:1-VIII--ViewPager的基本使用 [2].对ViewPager的addOnPageChangeListener三个回调方法分析 [3].
1272 0