我有一个以这个例子为模型的 ViewPager ,我正在实现ViewPager.PageTransformer
:
public class DepthPageTransformer implements ViewPager.PageTransformer {
private static final float MIN_SCALE = 0.75f;
public void transformPage(View view, float position) {
if (position < -1) { // [-Infinity,-1)
view.setAlpha(0);
} else if (position <= 0) { // [-1,0]
view.setAlpha(1);
view.setTranslationX(0);
view.setScaleX(1);
view.setScaleY(1);
} else if (position <= 1) { // (0,1]
view.setAlpha(1 - position);
view.setTranslationX(view.getWidth() * -position);
float scaleFactor = MIN_SCALE + (1 - MIN_SCALE) * (1 - Math.abs(position));
view.setScaleX(scaleFactor);
view.setScaleY(scaleFactor);
} else { // (1,+Infinity]
view.setAlpha(0);
}
}
}
并且效果很好,正如上面链接中的深度页面转换器动画所示。
但是,它目前的工作方式是右边的视图总是低于左边的视图。当您向右滚动时,视图来自下方。向左滚动使当前视图位于新视图下方,新视图滑入顶部。
我想做的是让当前视图始终位于顶部,并让新视图(左或右)从后面/下面进入。
我试过添加
view.bringToFront();
到if(position <= 0)
块,但没有任何变化。我也试过添加
view.bringToFront();
view.invalidate();
和
view.bringToFront();
((View)view.getParent()).invalidate();
一切都无济于事。这些与我能找到的类似 SO 帖子所采用的方法相同,但它们都接受了答案和评论,说它们有效。但我的没有!
无论滑动方向如何,如何让当前视图始终成为最顶层视图?
编辑 1 - 附加细节
正如评论中提到的,我需要知道是否向右或向左滑动以获得相同的动画。
ViewPager 只有三个VerticalViewPager
视图,根据这篇文章,它们显示为。
在 PageTransformer 中,我有以下内容:
@Override
public void transformPage(View view, float position) {
if (position < -1) { // [-Infinity,-1)
view.setAlpha(0);
}
else if(position <= 0){
if(view == first){
view.setAlpha(1 - Math.abs(position));
view.setTranslationX(view.getWidth() * -position);
view.setTranslationY(0);
float scaleFactor = MIN_SCALE + (1 - MIN_SCALE) * (1 - Math.abs(position));
view.setScaleX(scaleFactor);
view.setScaleY(scaleFactor);
}else if(view == second){
view.setAlpha(1);
view.setTranslationX(view.getWidth() * -position);
float yPosition = position * view.getHeight();
view.setTranslationY(yPosition);
}else if(view == third){
// Never happen
}
}
else if (position <= 1) { // [0,1]
if(view == first){
// Never happen
}else if(view == second){
view.setAlpha(1);
view.setTranslationX(view.getWidth() * -position);
float yPosition = position * view.getHeight();
view.setTranslationY(yPosition);
}else if(view == third){
view.setAlpha(1 - position);
view.setTranslationX(view.getWidth() * -position);
view.setTranslationY(0);
float scaleFactor = MIN_SCALE + (1 - MIN_SCALE) * (1 - Math.abs(position));
view.setScaleX(scaleFactor);
view.setScaleY(scaleFactor);
}
} else { // (1,+Infinity]
view.setAlpha(0);
}
}
其中first
,second
和是PagerAdapterthird
中的类型和设置:View
@Override
public View instantiateItem(ViewGroup container, int position) {
if(position == 0){
... stuff ...
vvp.first = img;
... stuff ...
}else if(position == 1){
... stuff ...
vvp.second = img;
... stuff ...
}else if(position == 2){
... stuff ...
vvp.third = img;
... stuff ...
}
}
它有点被破解,但效果很好,并且完全符合我正在寻找的功能。除了bringToFront
不工作的东西。transformPage
但无论我使用原始帖子中的代码还是此编辑中更全面的版本,它都不起作用。
仍然不确定如何使second
(即三个的中间视图)始终位于顶部。我什至尝试了一个通用的
second.bringToFront();
在方法的顶部,但仍然没有。
编辑 2
刚试过view.setZ()
但遇到以下错误:
java.lang.NoSuchMethodError: android.view.View.setZ
所以这个选项也没有了。
编辑 3 - 解决方案
有关我对此问题的解决方案,请参阅下面的答案(使用getChildDrawingOrder
)。
话虽如此,我仍然无法bringToFront
上班,如果您能弄清楚,我会很乐意选择您的答案作为选择的答案。
再次提前感谢。