我有以下ViewPager
:
我正在尝试构建一个封面流程视图。这意味着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
来反转当前项目后的绘图顺序。
注意:我已经尝试了所有可用的库,但没有任何效果。
我希望天才能帮助我:)
答案 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);
}