移除 ViewPager2 Overscroll 动画

Posted

技术标签:

【中文标题】移除 ViewPager2 Overscroll 动画【英文标题】:Remove ViewPager2 Overscroll animation 【发布时间】:2019-11-14 15:53:48 【问题描述】:

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

已经尝试了以下

<androidx.viewpager2.widget.ViewPager2
        android:id="@+id/viewPager"
        android:layout_
    android:layout_
        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。可以file a feature request吗? @ianhanniballake 马上归档,谢谢 issuetracker.google.com/issues/134912610 只是在这个小问题上浪费了很多时间,这个问题及其答案值得更多关注! 【参考方案1】:

解决方案

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

【讨论】:

请提供无数据绑定的解决方案 @galaxigirl findViewById(R.id.viewPagerIdFromLayout).apply (getChildAt(0) as? RecyclerView)?.overScrollMode = RecyclerView.OVER_SCROLL_NEVER 不确定这个答案最初是什么时候写的,但目前overScrollModeOVER_SCROLL_NEVERView 上的函数/常量,而不是RecyclerView。所以答案减少到fun ViewPager2.disableOverscroll() getChildAt(0).overScrollMode = View.OVER_SCROLL_NEVER【参考方案2】:

万一有人在寻找 Java 解决方案

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

【讨论】:

【参考方案3】:

作为 Kotlin 扩展:

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

并且您正在片段/活动中使用它:

viewPager.removeOverScroll()

【讨论】:

【参考方案4】:

这个对我有用:

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

【讨论】:

【参考方案5】:

在我的项目中工作的我的 kotlin 代码版本,没有绑定:

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

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

谢谢。

【讨论】:

【参考方案6】:

使用 android:overScrollMode="never"

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

【讨论】:

以上是关于移除 ViewPager2 Overscroll 动画的主要内容,如果未能解决你的问题,请参考以下文章

ViewPager2+Fragment操作笔记

ViewPager2+Fragment操作笔记

ViewPager2+Fragment操作笔记

ViewPager2+Fragment操作笔记

ViewPager2嵌套RecyclerView滑动冲突解决办法

无法使用数据绑定绑定 viewpager2 数据