Glide+wrap_content踩坑记录

一个ImageView加载不同图片的时候,如果宽度/高度设置的是wrap_content,那么在切换图片之前需要调用setImageResourse(0)将上一份图片清理,不然会出现图片加载过小的问题。

原理是因为Glide针对于wrap_content的宽/高,会主动进行一次计算逻辑

ViewTarget里有相关逻辑处理

    void getSize(@NonNull SizeReadyCallback cb) {
      // 在这里计算宽/高
      int currentWidth = getTargetWidth();
      int currentHeight = getTargetHeight();
      if (isViewStateAndSizeValid(currentWidth, currentHeight)) {
        cb.onSizeReady(currentWidth, currentHeight);
        return;
      }

      if (!cbs.contains(cb)) {
        cbs.add(cb);
      }
      if (layoutListener == null) {
        ViewTreeObserver observer = view.getViewTreeObserver();
        layoutListener = new SizeDeterminerLayoutListener(this);
        observer.addOnPreDrawListener(layoutListener);
      }
    }
复制代码

然后看getTargetWidth

    private int getTargetWidth() {
      int horizontalPadding = view.getPaddingLeft() + view.getPaddingRight();
      LayoutParams layoutParams = view.getLayoutParams();
      int layoutParamSize = layoutParams != null ? layoutParams.width : PENDING_SIZE;
      return getTargetDimen(view.getWidth(), layoutParamSize, horizontalPadding);
    }
    
    private int getTargetDimen(int viewSize, int paramSize, int paddingSize) {
      int adjustedParamSize = paramSize - paddingSize;
      if (adjustedParamSize > 0) {
        return adjustedParamSize;
      }

      if (waitForLayout && view.isLayoutRequested()) {
        return PENDING_SIZE;
      }

      // 如果imageView本身已经有了宽/高,那么就直接用当前的宽/高,这里的宽/高是通过getWidth()/getHeight()获取的
      int adjustedViewSize = viewSize - paddingSize;
      if (adjustedViewSize > 0) {
        return adjustedViewSize;
      }

      if (!view.isLayoutRequested() && paramSize == LayoutParams.WRAP_CONTENT) {
        return getMaxDisplayLength(view.getContext());
      }
      return PENDING_SIZE;
    }

复制代码

其实很简单,就是因为在第一张图加载后,后续ImageView再加载图片的时候,getWidth()/getHeight()就已经有了对应的值了,会沿用上一次的宽/高

这里要注意setImageResourse后续不能直接进行Glide加载图片,需要将加载请求posthandler里处理,等view的绘制完成之后才能再调用加载。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享