【问题标题】:ViewPager2 how to change child drawing order?ViewPager2如何更改子绘图顺序?
【发布时间】:2020-01-13 05:31:42
【问题描述】:

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

见下图:

当您使用 ViewPager1 类时,我们可以覆盖 getChildDrawingOrder

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

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

但是 ViewPager2 不能被派生和扩展(因为 ViewPager2 类是最终的)。我该怎么办?

【问题讨论】:

  • 你可以尝试在你的dimens.xml文件中添加两行26dp-42dp跨度>
  • 边距没有多大帮助,因为它们不会改变子绘制顺序

标签: android android-viewpager android-viewpager2


【解决方案1】:

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

虽然它不是官方支持的解决方案,但您可以通过在视图寻呼机上询问第一个孩子来访问 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")
        }
    }

【讨论】:

  • 为了支持可变数量的项目,我将“setChildDrawingOrderCallback”实现为 setChildDrawingOrderCallback { childCount, i -> IntArray(childCount) { it }.reversedArray()[i] }
【解决方案2】:

经过一番研究,我最终决定摆脱 ViewPager2 并回到 ViewPager1,因为我可以覆盖 getChildDrawingOrder 函数,然后我按照this answer 来实现我真正想要的。希望 ViewPager2 很快会最终确定,他们将使 ViewPager2 类非最终类

【讨论】:

猜你喜欢
  • 2022-08-15
  • 2023-03-08
  • 1970-01-01
  • 2020-10-19
  • 2016-02-03
  • 2014-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多