移除ViewPager2过度滚动动画

22

找不到删除ViewPager2过度滚动阴影动画的方法。 我知道在ViewPager上,您可以直接将overscrollMode属性设置为never,但是在ViewPager2上无效。

已尝试以下内容:

<androidx.viewpager2.widget.ViewPager2
        android:id="@+id/viewPager"
        android:layout_width="match_parent"
    android:layout_height="match_parent"
        android:overScrollMode="never"/>
binding.viewPager.apply {
        adapter = adapter
        orientation = ViewPager2.ORIENTATION_VERTICAL
        overScrollMode = ViewPager2.OVER_SCROLL_NEVER
        offscreenPageLimit = if (containsVideo) 2 else 5
}

ViewPager2可能没有将overScrollMode转发到其内部使用的RecyclerView。您能否提交一个功能请求 - ianhanniballake
@ianhanniballake,已经准确地提交了,谢谢。 - Daniel Kim
https://issuetracker.google.com/issues/134912610 - JHowzer
刚刚在这个小问题上浪费了很多时间,这个问题及其答案应该得到更多的关注! - ColonD
7个回答

45

解决方案

binding.viewPager2.apply {
    adapter = vpAdapter
    orientation = ViewPager2.ORIENTATION_VERTICAL
    registerOnPageChangeCallback(pageChangeCallback)
    (getChildAt(0) as RecyclerView).overScrollMode = RecyclerView.OVER_SCROLL_NEVER
}

请提供不使用数据绑定的解决方案。 - galaxigirl
3
findViewById(R.id.viewPagerIdFromLayout).apply { (getChildAt(0) as? RecyclerView)?.overScrollMode = RecyclerView.OVER_SCROLL_NEVER } 请注意,这是代码,而不是常规文本。 - Phehaz
3
不确定这个答案最初是何时编写的,但目前 overScrollModeOVER_SCROLL_NEVERView 上的函数/常量,而不是 RecyclerView。因此,答案可以简化为 fun ViewPager2.disableOverscroll() {getChildAt(0).overScrollMode = View.OVER_SCROLL_NEVER} - tir38

15

假如有人在寻找 Java 解决方案

View child = viewPager2.getChildAt(0);
if (child instanceof RecyclerView) {
    child.setOverScrollMode(View.OVER_SCROLL_NEVER);
}

4

Kotlin扩展:

fun ViewPager2.removeOverScroll() {
    (getChildAt(0) as? RecyclerView)?.overScrollMode = View.OVER_SCROLL_NEVER
}

如果您在Fragment/Activity中使用它:

viewPager.removeOverScroll()

2

在Java中,你可以简单地这样做

viewpager2.getChildAt(0).setOverScrollMode(RecyclerView.OVER_SCROLL_NEVER);


如果使用.getChildAt(0)引用的子项不在Recycle View中怎么办?它会抛出异常。当前代码没有处理这种情况。请[编辑]以处理此类情况。 - Abhishek Dutt

0

我的 Kotlin 代码版本在我的项目中运行,无需绑定:

// over scroll animation
val child: View = pager.getChildAt(0)

if (child is RecyclerView) {
    child.overScrollMode = View.OVER_SCROLL_NEVER
}

谢谢。


0

这个对我有用:

val child = binding.<your viewPager camelCase id>.getChildAt(0)
    (child as? RecyclerView)?.overScrollMode = View.OVER_SCROLL_NEVER

-1

使用 android:overScrollMode="never"

 <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/infoViewPager"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:overScrollMode="never"
        app:layout_constraintBottom_toTopOf="@id/guideLine1"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        />

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接