在ViewPager的一半反转绘图顺序

时间:2017-07-30 01:10:42

标签: android android-viewpager android-view coverflow

我有以下ViewPager

Screenshot

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

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

我可以调用pager.setPageTransformer(false,PageTransformer()),如上图所示,或setPageTransformer(true, PageTransformer()),它会反转绘图顺序。

问题是,我需要中间视图(绿色)位于其邻居(蓝色,灰色)前面。

我阅读了一些关于view.bringToFront()的帖子,但我找不到这种方法的解决方案。 中间视图到前端的解决方案很酷,但这只有在一次可见三个视图时才有效。有五个视图,第五个视图仍然与第四个视图重叠。 (令人困惑,不是吗?^^)

顺便说一句,我的minSdk是16到18,因此不可能升高(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来反转当前项目后的绘图顺序。

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

我希望天才能帮助我:)

1 个答案:

答案 0 :(得分:1)

你可以覆盖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);
}