5

我正在尝试实现一个与此处标记的示例ViewPager.PageTransformer几乎相同的示例(它位于页面底部)。DepthPageTransformer

但是,与其让层次结构遵循 z-index 从左到右减小的模式(即右侧的视图将从下方出现),我希望 z-index 从左到右增加(左侧的视图将从下面出现)。

作为第一次尝试,我基本上交换了示例中表示从左侧与右侧进入的页面的代码,但我发现存在隐式 z 排序,使得左侧的页面始终高于右侧的页面,因此当您向右滑动查看页面时,它会很好地滑动,但消失的视图将消失在新输入视图的“顶部”。

有什么方法可以调整 a 所服务页面的 z 索引 ViewPager吗?

我的第一直觉是以某种方式ViewPager从支持库中复制代码,并修改类以执行我的命令,但我不清楚该类中隐式排序的来源。

这是我的(主要是扯掉)PageTransformer

public class DepthPageTransformer implements ViewPager.PageTransformer {
    private static float MIN_SCALE = 0.75f;

    public void transformPage(View view, float position) {

        int pageWidth = view.getWidth();

        if (position < -1) { // [-Infinity,-1)
            // This page is way off-screen to the left.
            view.setAlpha(0);

        } else if (position <= 0) { // [-1,0]  
            view.setAlpha(1 + position);

            // Counteract the default slide transition
            view.setTranslationX(pageWidth * -position);

            // Scale the page down (between MIN_SCALE and 1)
            float scaleFactor = MIN_SCALE
                    + (1 - MIN_SCALE) * (1 - Math.abs(position));
            view.setScaleX(scaleFactor);
            view.setScaleY(scaleFactor);

        } else if (position <= 1) { // (0,1]            
            view.setAlpha(1);
            view.setTranslationX(0);
            view.setScaleX(1);
            view.setScaleY(1);

        } else { // (1,+Infinity]
            // This page is way off-screen to the right.
            view.setAlpha(0);
        }
    }
}
4

2 回答 2

13

ViewPager 页面的绘制顺序由ViewPager.setPageTransformer()方法的第一个参数决定。

查看方法签名:

public void setPageTransformer (boolean reverseDrawingOrder, ViewPager.PageTransformer transformer)

reverseDrawingOrder参数文档说:“如果提供的 PageTransformer 需要从最后一个到第一个而不是从第一个到最后一个绘制页面视图,则为 true。”

在内部,当 ViewPager 页面绘制顺序正在确定时,它会调用:

protected int getChildDrawingOrder(int childCount, int i) {
    final int index = mDrawingOrder == DRAW_ORDER_REVERSE ? childCount - 1 - i : i;
    final int result = ((LayoutParams) mDrawingOrderedChildren.get(index).getLayoutParams()).childIndex;
    return result;
}

mDrawingOrder 由 reverseDrawingOrder 布尔标志在内部设置ViewPager.setPageTransformer()

于 2013-03-29T16:14:17.867 回答
0

你可以使用 .bringToFront(); 方法。

于 2014-01-10T13:10:13.463 回答