android - 在 ViewPager 的一半处反转绘制顺序

标签 android android-viewpager android-view coverflow

我有以下 ViewPager:

Screenshot

我正在尝试构建一个封面流 View 。这意味着 ViewPager 中 View 的位置和大小会根据触摸输入而变化。

除了 View 的绘制顺序外,我的实现一切正常。

我可以调用上图中的 pager.setPageTransformer(false,PageTransformer()),或者调用 setPageTransformer(true, PageTransformer())颠倒绘制顺序。

问题是,我需要中间 View (绿色)在它的邻居(蓝色、灰色)前面。

我阅读了一些关于 view.bringToFront() 的帖子,但我找不到使用该方法的解决方案。 中间 View 到前端的解决方案会很酷,但这只有在同时显示三个 View 时才有效。如果有五个 View ,第五个 View 仍然会与第四个 View 重叠。 (令人困惑,不是吗?^^)

顺便说一下,我的 minSdk 是 16 到 18,所以 elevation(Lollipop) 是不可能的。

这是我当前的 PageTransformer

class PageTransformer() : ViewPager.PageTransformer {
    val MIN_SCALE = 0.75f

    override fun transformPage(view: View, position: Float) {
        val pageWidth = view.width
        val pageHeight = view.height
        var vertMargin = pageHeight * (1 - MIN_SCALE) / 2
        var horzMargin = pageWidth * (1 - MIN_SCALE) / 2
        view.scaleX = MIN_SCALE
        view.scaleY = MIN_SCALE
        if (position < -2) { // [-Infinity,-1)
            // This page is way off-screen to the left.
            view.translationX = horzMargin - vertMargin / 2
        } else if (position <= 2) { // [-1,1]
            // Modify the default slide transition to shrink the page as well
            val scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position))
            vertMargin = pageHeight * (1 - scaleFactor) / 2
            horzMargin = pageWidth * (1 - scaleFactor) / 2
            if (position < 0) {
                view.translationX = horzMargin - vertMargin / 2
            } else {
                view.translationX = -horzMargin + vertMargin / 2
            }
            // Scale the page down (between MIN_SCALE and 1)
            view.scaleX = scaleFactor
            view.scaleY = scaleFactor
            view.rotationY = position * -30
        } else { // (1,+Infinity]
            // This page is way off-screen to the right.
            view.translationX = -horzMargin + vertMargin / 2
        }
    }
}

综上所述,我需要一个 ViewPager,它可以在当前 Item 之后反转其绘制顺序。

注意:我已经尝试了所有可用的库,但没有任何效果。

希望有高人能帮帮我:)

最佳答案

可以覆盖viewpager类的getChildDrawingOrder: 像这样

@Override
protected int getChildDrawingOrder (int childCount, int i) {
    int j = getCurrentItem ();
    if (i == j) {
        return childCount - 1;
    }

    if (i == childCount - 1) {
        return j;
    }

    if (j == 0) {
        if (i == 1) {
            i = 2;
        } else if (i == 2) {
            i = 1;
        }
    }

    return super.getChildDrawingOrder (childCount, i);
}

关于android - 在 ViewPager 的一半处反转绘制顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45395463/

相关文章:

android - 什么时候使用谷歌 "Application Licensing"?

android - Phonegap 3.3 构建 Android 失败

android - 如何在我的一个 viewpager 页面中访问我的按钮?

android - 删除菜单图标和标题之间的空格

java - ListView 共享元素转换问题

java - 添加指向 AlertDialog 上按钮的链接,该按钮在应用程序启动时显示

android - 检查图像是否为黑色

android - ViewPagerAndroid 不使用 React-Native 在 ScrollView 下渲染

android - 带有 Google Map API v2 的 ViewPager 变黑

android - 使FAB不被夹在底部导航栏内