ViewPagers的隐式Z-Ordering

时间:2013-03-19 21:04:31

标签: android android-viewpager android-support-library

我正在尝试实施一个与标有ViewPager.PageTransformer的{​​{3}}几乎相同的DepthPageTransformer(位于页面底部)。

然而,不是让层次结构遵循z-index从左到右减小的模式(即从右下方显示的视图),我希望z-index从左到右增加(视图到左边将出现在下面)。

作为第一次尝试,我基本上交换了代表从左侧和右侧进入的页面的示例中的代码,但我发现有一个隐式的z排序,左边的页面总是右上方的页面,当您向右滑动以查看页面时,它将会正常滑动,但消失的视图将在新输入的视图的“顶部”消失。

有没有办法调整 ViewPager 提供的网页的z-indices?

我的第一直觉是以某种方式从支持库中复制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);
        }
    }
}

2 个答案:

答案 0 :(得分:12)

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由ViewPager.setPageTransformer()

中的reverseDrawingOrder布尔标志在内部设置

答案 1 :(得分:0)

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