一般情况下,很多时候都是对图片做等比缩放调整,很少有需求是调整View的大小,今天我带领大家使用Glide实现根据图片强制缩放View的大小。
Glide加载图片的代码一般是这样的
Glide.with(this)
.asBitmap()
.load(R.mipmap.chongge2)
.into(image_view);
以上into的参数是ImageView对象,但是还有一个into方法,传递的是Target
对象,我们查一下该into的源码:
/**
* Set the target the resource will be loaded into.
*
* @param target The target to load the resource into.
* @return The given target.
* @see RequestManager#clear(Target)
*/
@NonNull
public <Y extends Target<TranscodeType>> Y into(@NonNull Y target) {
return into(target, /*targetListener=*/ null, Executors.mainThreadExecutor());
}
与ImageView有关的Target
是:ImageViewTarget
、BitmapImageViewTarget
、DrawableImageViewTarget
、ThumbnailImageViewTarget
,其中BitmapImageViewTarget
、DrawableImageViewTarget
、ThumbnailImageViewTarget
都是ImageViewTarget
子类。这里就拿ImageViewTarget
来举例。
以下自定义ImageViewTarget:
/**
* 根据图片,强制调整View的大小
*/
public class UniformScaleTransformation extends ImageViewTarget<Bitmap> {
private ImageView target;
public UniformScaleTransformation(ImageView target) {
super(target);
this.target = target;
}
@Override
protected void setResource(Bitmap resource) {
if(resource == null){
return;
}
view.setImageBitmap(resource);
//获取原图的宽高
int width = resource.getWidth();
int height = resource.getHeight();
//获取imageView的宽
int imageViewWidth = target.getWidth();
//计算缩放比例
float sy = (float) (imageViewWidth * 0.1) / (float) (width * 0.1);
//计算图片等比例放大后的高
int imageViewHeight = (int) (height * sy);
ViewGroup.LayoutParams params = target.getLayoutParams();
params.height = imageViewHeight;
target.setLayoutParams(params);
}
}
重写setResource方法,根据bitmap大小调整View的大小。
使用代码如下:
Glide.with(this)
.asBitmap()
.load(R.mipmap.chongge3)
.into(new UniformScaleTransformation(image_view));
设置布局,我们让ImageView的高度设置为500dp,设置背景色
<ImageView
android:id="@+id/image_view"
android:layout_width="match_parent"
android:layout_height="500dp"
android:background="#f0f0c0"
android:layout_gravity="center"
android:visibility="visible"
android:layout_marginTop="40dp" />
在使用UniformScaleTransformation
之前的效果如下:
图片.png
看到ImageView的背景才知道,图片在ImageView的中央,图片并没有和ImageView完全重合,使用UniformScaleTransformation
之后,ImageView会根据图片大小自动和图片重合。效果如下:
图片.png