一个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加载图片,需要将加载请求post
到handler
里处理,等view的绘制完成之后才能再调用加载。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END