android - 更新支持库后,ViewPager 变得显示不正确的页面

标签 android android-viewpager android-support-library

我将 Google 支持库更新为 rev. 23.2.0。并且 ViewPager 变成显示错误的页面 View 。
ViewPager 使用自定义页面转换器:

private class ZoomOutPageTransformer implements ViewPager.PageTransformer {

    private static final float MIN_SCALE = 0.85f;

    private float mCenterOffset;
    private boolean mIsFixedCenterOffset = false;

    public void transformPage(View view, float position) {
        final int pageWidth = view.getWidth();
        final int pageHeight = view.getHeight();

        if(!mIsFixedCenterOffset) {
            mCenterOffset = position;
            mIsFixedCenterOffset = true;
        }

        position -= mCenterOffset;

        if (position <= 1) {
            final float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position));
            final float vertMargin = pageHeight * (1 - scaleFactor) / 2;
            final float horzMargin = pageWidth * (1 - scaleFactor) / 2;

            if (position < 0) {
                view.setTranslationX(horzMargin - vertMargin / 2);
            } else {
                view.setTranslationX(-horzMargin + vertMargin / 2);
            }

            view.setScaleX(scaleFactor);
            view.setScaleY(scaleFactor);
        }
    }
}

并且有页边距:

ViewPager viewPager = (ViewPager) v.findViewById(R.id.vpDaySlider);
mAdapter = new DayPagerAdapter(getActivity(), fm, mWeekNumber);
viewPager.setAdapter(mAdapter);
viewPager.addOnPageChangeListener(this);
viewPager.setPageTransformer(false, new ZoomOutPageTransformer());
Point display = SettingsManager.getDisplaySize(getContext());
final int padding = (int)(display.x * 0.1);
viewPager.setPageMargin(padding);

现在,它看起来像下面这样:
enter image description here
我什至不知道bug在哪里...如何修复它?我需要页面填充父空间并仅在滚动时缩小。
LogCat 中的警告:

W/FragmentManager: moveToState: Fragment state for DayFragment{24ec179 #2 id=0x7f0c00b4} not updated inline; expected state 3 found 2

已添加 我意识到这是一个多么严重的错误。 ZoomOutPageTransformer 修复页面的第一个位置。它必须为 0 或接近于零,但更新后位置的第一个值 > 1(例如我手机上的 1.1),但下一个(第二个)值是真实页面位置(对于我的手机:0)。
因为发生了什么?我认为这是 ViewPager 的错误行为。

最佳答案

我修复了这个错误:

private static class ZoomOutPageTransformer implements ViewPager.PageTransformer {

        private static final float MIN_SCALE = 0.85f;

        private ViewPager mViewPager;
        private float mPositionFixer;
        private boolean isSetFixer = false;

        public  ZoomOutPageTransformer(ViewPager viewPager) {
            mViewPager = viewPager;
        }

        public void transformPage(View view, float position) {
            final int pageWidth = view.getWidth();
            final int pageHeight = view.getHeight();

            if(!isSetFixer) {
                final int mClientWidth = mViewPager.getMeasuredWidth() -
                        mViewPager.getPaddingLeft() - mViewPager.getPaddingRight();
                mPositionFixer = ((float)mViewPager.getPaddingStart()) / mClientWidth;
                isSetFixer = true;
            }

            position -= mPositionFixer;

            if (position <= 1) {
                final float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position));
                final float vertMargin = pageHeight * (1 - scaleFactor) / 2;
                final float horzMargin = pageWidth * (1 - scaleFactor) / 2;

                if (position < 0) {
                    view.setTranslationX(horzMargin - vertMargin / 2);
                } else {
                    view.setTranslationX(-horzMargin + vertMargin / 2);
                }

                view.setScaleX(scaleFactor);
                view.setScaleY(scaleFactor);
            }
        }
    }

虽然我无法理解支持库版本中的这个错误。 23.2.0。

关于android - 更新支持库后,ViewPager 变得显示不正确的页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35673238/

相关文章:

java - 如何更改 ScrollView 内布局的大小?

android - ViewPager 中的 ListView 第一次不刷新 (Android)

android - 使用 root 安装 APK,处理 "/data/local/tmp/"文件夹的新限制

android - 突出显示或下划线选定的 TabPageIndicator

android - 在 ViewPager 中滑动半页(来自兼容包)

android-support-library - 在 Leanback 中使用支持库中的字体

Android 支持库 27.1.0 新方法 requireActivity()、requireContext()

android - 如何使用嵌套 fragment (Android 4.2)在 ViewPager 中添加 fragment

android - 在 Android Nougat 中打开 PDF 文件时显示空白屏幕

Android 打印,为什么当我尝试从我的手机打印时收到警告