Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ViewPagers的隐式Z-排序_Android_Android Viewpager_Android Support Library - Fatal编程技术网

Android ViewPagers的隐式Z-排序

Android ViewPagers的隐式Z-排序,android,android-viewpager,android-support-library,Android,Android Viewpager,Android Support Library,我正在尝试实现一个ViewPager.PageTransformer,它几乎与标签上的DepthPageTransformer(位于页面底部)相同 但是,与其让层次结构遵循z索引从左到右减少的模式(即,右侧视图将从下方显示),我希望z索引从左到右增加(左侧视图将从下方显示) 作为第一次尝试,我基本上交换了示例中表示从左到右的页面的代码,但我发现存在一个隐式的z顺序,即左侧的页面始终位于页面右侧的上方,因此当您滑动以查看右侧的页面时,它将很好地滑入,但消失的视图将在新输入视图的“顶部”消失 是否有

我正在尝试实现一个
ViewPager.PageTransformer
,它几乎与标签上的
DepthPageTransformer
(位于页面底部)相同

但是,与其让层次结构遵循z索引从左到右减少的模式(即,右侧视图将从下方显示),我希望z索引从左到右增加(左侧视图将从下方显示)

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

是否有任何方法可以调整
ViewPager提供的页面的z索引?

我的第一反应是以某种方式从支持库复制
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);
        }
    }
}
公共类DepthPageTransformer实现ViewPager.PageTransformer{
专用静态浮动最小刻度=0.75f;
公共页面(视图、浮动位置){
int pageWidth=view.getWidth();
if(位置<-1){/[-无穷大,-1)
//这个页面在屏幕的左边。
视图。setAlpha(0);

}else if(位置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布尔标志在内部设置,您可以使用.bringToFront();方法。

在ViewPager代码的最底部还有一个类
ViewPositionComparator
,用于实际确定页面的顺序。您的回答让我找到了这个。这个答案非常好。如果您更改
ViewPager.setPageTransformer()的第一个参数
改为
false
,然后在类内只需将
视图.setTranslationX(页面宽度*-位置);
更改为
视图.setTranslationX(0)
,反之亦然。仅此而已,你不必在
ViewPager
类中使用任何其他方法。天哪,我对这件事很感兴趣。我必须感谢你!对于在你的页面转换中看到随机页面排序的任何人,请发表评论……如果你正在进行自制回收并重新使用你的页面视图,回收的
LayoutParams
将混淆关于Z顺序的
ViewPager
,因为顺序位置保留在那里。确保将
LayoutParams
重置为某个合理的通用
ViewGroup。在重新添加到
ViewPager
之前,LayoutParams
值。