ViewPager2 如何更改子绘图顺序?

ViewPager2 how to change child drawing order?

我正在尝试使用重叠项目(轮播组件)来实现 ViewPager2。 一切似乎都很好,但我的中心项目与下一个项目重叠。我希望我的中心项目位于所有相邻项目的前面。

见下图:

当你使用 ViewPager1 class 我们可以覆盖 getChildDrawingOrder

@Override
    protected int getChildDrawingOrder(int childCount, int i)

在此处查看示例解决方案:link

但是无法派生和扩展 ViewPager2(因为 ViewPager2 class 是最终的)。我该怎么办?

经过一些研究,我最终决定摆脱 ViewPager2 并回到 ViewPager1,因为我可以覆盖 getChildDrawingOrder 函数,然后我按照 this answer 来实现我的目标其实想要。希望当 ViewPager2 很快完成时,他们将使 ViewPager2 class 非最终

底层 ViewPager2 包含一个 RecyclerView,因此如果您想更改 child 绘制顺序,您需要在 RecyclerView 上进行。

虽然它不是官方支持的解决方案,但您可以通过在查看寻呼机上请求第一个 child 来访问 RecyclerView。看到这条评论:

https://issuetracker.google.com/issues/134912610#comment3

val recyclerView = viewPager2.getChildAt(0)

获得 RecyclerView 访问权限后,您可以添加 ChildDrawingOrderCallback

https://developer.android.com/reference/androidx/recyclerview/widget/RecyclerView.ChildDrawingOrderCallback

如果您恰好有 3 个页面并希望将中间页面绘制在其他页面之上,则下面的代码有效。

  recyclerView.setChildDrawingOrderCallback { childCount, i ->
        when (i) {
            0 -> 0
            1 -> 2
            2 -> 1
            else -> throw IllegalStateException("Expected 3 items")
        }
    }