【问题标题】:Android viewpager with DepthPageTransformer z-index issue具有 DepthPageTransformer z-index 问题的 Android viewpager
【发布时间】:2015-09-17 17:32:13
【问题描述】:

我使用 DepthPageTransformer 实现了一个 viewpager,在页面中我有一些输入(单选、复选框、选择选项...)。它工作正常,除了一个有线错误:有时当我点击页面 P1 上的位置(x,y)时,页面 P2 的该位置的输入被触发。

P1:

P2(P1之后的那个):

现在当我点击页面 P1 上的这个位置时:

我得到P2页面显示的选择选项:

类似于web开发中的z-index问题。

DepthPage Transformer 的代码与文档中的相同:http://developer.android.com/training/animation/screen-slide.html#pagetransformer

public class DepthPageTransformer implements ViewPager.PageTransformer {
private static final float MIN_SCALE = 0.75f;
@Override
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]
        // Use the default slide transition when moving to the left page
        view.setAlpha(1);
        view.setTranslationX(0);
        view.setScaleX(1);
        view.setScaleY(1);

    } else if (position <= 1) { // (0,1]
        // Fade the page out.
        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 { // (1,+Infinity]
        // This page is way off-screen to the right.
        view.setAlpha(0);
    }
}
}

关于如何解决这个重叠问题的任何想法?

【问题讨论】:

    标签: android android-layout android-viewpager android-animation


    【解决方案1】:

    试试这个:

    public class DepthPageTransformer implements ViewPager.PageTransformer {
    private static final float MIN_SCALE = 0.75f;
    @Override
    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]
        // Use the default slide transition when moving to the left page
        view.setAlpha(1);
        view.setTranslationX(0);
        view.setScaleX(1);
        view.setScaleY(1);
        // -------- THIS LINE ---
        view.bringToFront();
        // -------- THIS LINE ---
    
    } else if (position <= 1) { // (0,1]
        // Fade the page out.
        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 { // (1,+Infinity]
        // This page is way off-screen to the right.
        view.setAlpha(0);
    }
    }
    }
    

    【讨论】:

    • 我会试一试并回复你 ASP ,谢谢你抽出时间和回答:)
    【解决方案2】:

    你只需要颠倒绘制顺序:

            mPager.setPageTransformer(true, new DepthPageTransformer());
    

    在任何情况下,您都可以使用代码示例here

    【讨论】:

    • 宾果游戏!最佳解决方案:)
    【解决方案3】:

    其他解决方案是使用 OnPageChangeListener:

    pager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { }
        @Override public void onPageSelected(final int position) {
            pager.postDelayed(new Runnable() {
                @Override
                public void run() {
                    pagerAdapter.getItem(position).getView().bringToFront();
                }
            }, 300);
        }
        @Override public void onPageScrollStateChanged(int state) { }
    });
    

    效率更高。

    【讨论】:

    • 这怎么比第一个效率高?
    • 第一种方式 view.bringToFront() 每次调用 transformPage 时都会调用。这可能是 10 倍或更多。我在 android 4.1 上对此进行了测试,有时布局会闪烁。当调用 onPageSelected 看起来没问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 2011-09-07
    • 2014-08-02
    • 2013-05-22
    • 2011-08-14
    • 2012-10-21
    • 1970-01-01
    相关资源
    最近更新 更多