android - 区分 ViewPager 中的用户滚动和程序化页面更改

标签 android android-viewpager

我的应用程序中有一个 android.support.v4.view.ViewPager,我想区分以编程方式启动的平滑滚动和用户启动的触摸滚动。

我查看了 ViewPager.OnPageChangeListener,我相信答案可能就在其中,但我不确定如何。

最佳答案

好的,事实证明我对 ViewPager.onPageChangeListener 中的答案是正确的。特别是它在于使用onPageScrollStateChanged(int state)ViewPager 中的页面基本上可以处于三种状态:

  1. Dragging:表示分页器当前正在被用户拖动。
  2. 空闲:表示寻呼机处于空闲、稳定状态。
  3. 稳定:表示寻呼机正在稳定到最终位置。

所以拖动状态只有在当前页面被用户物理拖动时才会出现。因此,当用户滑动页面时,状态按以下顺序发生:拖动 -> 稳定 -> 空闲。现在,onPageSelected(int position) 方法在“Settling”和“Idle”状态之间被调用。因此,为了确定页面更改是否是由用户滚动引起的,只需要检查之前的状态是“拖动”并且当前状态是“稳定”。然后,您可以保留一个 boolean 变量来跟踪页面更改是否是用户发起的,并在 onPageSelected(int position) 方法中检查它。

这是我的 onPageScrollStateChanged 方法

public void onPageScrollStateChanged(int state) 
{
    if (previousState == ViewPager.SCROLL_STATE_DRAGGING
            && state == ViewPager.SCROLL_STATE_SETTLING)
        userScrollChange = true;

    else if (previousState == ViewPager.SCROLL_STATE_SETTLING
            && state == ViewPager.SCROLL_STATE_IDLE)
        userScrollChange = false;

    previousState = state;
}

ifelse if 语句不必如此明确,但为了清楚起见,我这样做了。

关于android - 区分 ViewPager 中的用户滚动和程序化页面更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17819970/

相关文章:

android - 在方向之间切换并具有动态非 UI fragment 和单独的布局文件时膨胀异常

android - FragmentActivity 与 ViewPager : Crash on orientation change

java - 将属性设置为 viewpager 的子级

android-viewpager - 如何在 Jetpack Compose Android 中单击按钮时 ScrollView 寻呼机(伴奏库)

android - facebook android sdk中使用的facebook api版本

android - 图像处理:在打开的书中查找突出的页面并进行透视变换

android - 缩放 ViewPager ImageView?

Android——首次启动互动教程

android - 为什么我在 Firebase-Real 数据库中得到的是 ArrayList 而不是 HashMap?

java - java.lang.RuntimeException 的未知原因