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
值。