搜索内容

有一个问题?

如果您有任何疑问,可以在下面询问或输入您要寻找的!

解决viewpager 重新可见时,切换page无动画

生成海报
LeeStudio_
LeeStudio_ 2020-09-04 14:26
阅读需:0

ViewPager 再次由此可见时bug

  • 新项目情景

近期新项目已经做全自动滚屏的banner实际效果,发生了几类出乎意料的难题。
1:因为banner是放到recyclerview 中的head中,全部当滚动recyclerview 至banner到显示屏外再回家,
会发觉,viewpager第一次转换pager 无动漫实际效果,也就是换页速率迅速。
2:当从其他fragment网页页面中转换到有banner的fragment中的情况下,也就是banner中的fragment由
isVisibleToUser=false 变为 isVisibleToUser=true时 会发生viewpager中2个pager卡着没动,一段时间才会修复而且转换无动漫

  • bug情况

当ViewPager不由此可见时,会实行其onDetachedFromWindow方式 ,再度由此可见的时候会实行onAttachedToWindow方式 ,此刻会发生下列bug:
  • 1.在Android4.0上面发生第一次全自动滚动沒有动漫实际效果。
  • 2.在Android5.0上面发生第一次滚动不但沒有动漫实际效果,并且连View也没有。
  • 3.当ViewPager全自动滚动到一半的情况下,将其掩藏后,没法全自动滑完。会发生滑一半的状况。
  • bug缘故

   @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        mFirstLayout = true;
    }

   void setCurrentItemInternal(int item, boolean smoothScroll, boolean always, int velocity) {
           .....\\省去一部分编码

        if (mFirstLayout) {
            // We don't have any idea how big we are yet and shouldn't have any pages either.
            // Just set things up and let the pending layout handle things.
            mCurItem = item;
            if (dispatchSelected) {
                dispatchOnPageSelected(item);
            }
            requestLayout();
        } else {
            populate(item);
            scrollToItem(item, smoothScroll, velocity, dispatchSelected);
        }
    }

WTF!!! 仔细观看
viewpager 源代码中有一个mFirstLayout 成员函数,当mFirstLayout=true时,是不动scrollToItem方式 的,
因此 会造成 网页页面再次由此可见时,第一次转换是沒有动漫的!!!!!!!!!!!!!

  • 解决方案

承继viewpager 重写 onAttachedToWindow()方式 ,反射面mFirstLayout 成员函数 改动值

 @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        /**
         * 设ViewPager中有3张相片
         * 直至彻底掩藏此ViewPager,并实行了onDetachedFromWindow
         * 再回家时,可能发生bug,第一次滚动时沒有动漫实际效果,而且,经常会出现view沒有载入的状况
         */
        try {
            Field mFirstLayout = ViewPager.class.getDeclaredField("mFirstLayout");
            mFirstLayout.setAccessible(true);
            mFirstLayout.set(this, false);

            setCurrentItem(getCurrentItem());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
  • 修补:当ViewPager全自动滚动到一半的情况下,将其掩藏后,没法全自动滑完。会发生滑一半的状况。
  @Override
    protected void onDetachedFromWindow() {
        if (((Activity) getContext()).isFinishing()) {
            super.onDetachedFromWindow();
        }
    }

PS:假如能处理您的bug,可否赞一下~

评论
  • 消灭零回复