Viewpager glide 加载图片引发的bug

项目里面用了Viewpager +fragment 加载图片,但是在一些设备上viewpager 滑动非常卡!找了很久的原因都不知道为什么卡!用了blockcanary,wetest 等辅助查看卡顿点, cpu 内存 状态,没看出有什么异常的,后来在做图片优化的时候发现了原因。在fragment加载图片的时候

   RequestOptions options = new RequestOptions().format(DecodeFormat.PREFER_RGB_565).
override(SizeUtils.getMeasuredWidth(rootView), SizeUtils.getMeasuredHeight(rootView));
        Glide.with(this).load(R.drawable.news_bg).apply(options).into(new SimpleTarget<Drawable>() {
            @Override
            public void onResourceReady(@NonNull Drawable resource, 
@Nullable Transition<? super Drawable> transition) {
                mRlBannerRoot.setBackground(resource);
            }
        });

断点发现第一次的时候 resourse

Viewpager glide 加载图片引发的bug

第二个fragment

Viewpager glide 加载图片引发的bug

滑倒第二fragment的时候

Viewpager glide 加载图片引发的bug

后面一个

Viewpager glide 加载图片引发的bug

界面几乎一模一样的,测量出来的宽高怎么就完全不同了!用的是同一个fragment。

Viewpager glide 加载图片引发的bug

Viewpager glide 加载图片引发的bug

测量结果不同,测量结果和glide overrideWidth,height 之后的resourse 的结果也不同!

  public static int[] measureView(final View view) {
        ViewGroup.LayoutParams lp = view.getLayoutParams();
        if (lp == null) {
            lp = new ViewGroup.LayoutParams(
                    ViewGroup.LayoutParams.MATCH_PARENT,
                    ViewGroup.LayoutParams.WRAP_CONTENT
            );
        }
        int widthSpec = ViewGroup.getChildMeasureSpec(0, 0, lp.width);
        int lpHeight = lp.height;
        int heightSpec;
        if (lpHeight > 0) {
            heightSpec = View.MeasureSpec.makeMeasureSpec(lpHeight, View.MeasureSpec.EXACTLY);
        } else {
            heightSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
        }
        view.measure(widthSpec, heightSpec);
        return new int[]{view.getMeasuredWidth(), view.getMeasuredHeight()};
    }

 断点发现测量是有问题的,因为传进来的view 如果高度是 matchParent lp.height = -1,这个时候是按照 UNSPECIFIED 就是想要多大就有多大,fragment 里面有个scrollView

Viewpager glide 加载图片引发的bug

所以最终的测量高度就是所有内容的总高度,第一个页面内容短所以高度小!那宽度呢?测量宽度每次都是一样的!

算一下 长宽比 = 1320/742 = 3277/1841 = 2350/1320 = 2072/1164 =1.78 应该glide 按照图片长宽比做了处理了。

这样所有MATCH_PARENT 加载的图片都可能要比我实际需要的大很多!

源头就是这个mesureView 方法的问题了,如果view 设置了确定的宽高 那没问题,如果是matchparent 就有问题了,再次警告随便copy别人的代码是有风险的。glide 尽管设置了 override width height 但实际出现的效果是按照长宽比来缩放的。

 

上一篇:mvvm 请谨慎复用view


下一篇:java-是否可以在代码内设置单个视图组的内容视图?