参考文章
Glide坑遇记:宽度铺满高度自适应 & GIF加载之坑
Glide - 图片重设大小 和 缩放
需求
公司需要根据手机屏幕的宽度,等比缩放图片的高度,如果图片的宽度 > 手机的宽度,是要等比缩放宽高。如果图片的宽度 <= 手机屏幕的宽度,不进行缩放
更新
2020-05-18
/**
* @date 创建时间:2020/5/18 0018
* @auther gaoxiaoxiong
* @Descriptiion 根据传入的宽度,放大高度
**/
static class PhotoViewImageViewTarget extends CustomTarget<Bitmap> {
PhotoView photoView;
int phoneWidth;
public PhotoViewImageViewTarget(PhotoView photoView, int phoneWidth) {
this.photoView = photoView;
this.phoneWidth = phoneWidth;
}
@Override
public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
if (resource!=null){
//获取原图的宽高
int resourceWidth = resource.getWidth();
int resourceHeight = resource.getHeight();
FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) photoView.getLayoutParams();
float scaleWidth = 0.0f;
scaleWidth = (float) phoneWidth / (float) resourceWidth;
if (resourceWidth > 1000){
layoutParams.width = (int) (resourceWidth * scaleWidth);
layoutParams.height = (int) (resourceHeight * scaleWidth);
}else {
if (resourceWidth > phoneWidth){
layoutParams.width = (int) (resourceWidth * scaleWidth);
layoutParams.height = (int) (resourceHeight * scaleWidth);
}else {
layoutParams.width = resourceWidth;
layoutParams.height = resourceHeight;
}
}
int height = resource.getHeight();//原始高度
layoutParams.height = height;
photoView.setLayoutParams(layoutParams);
photoView.setImageBitmap(resource);
}
}
@Override
public void onLoadCleared(@Nullable Drawable placeholder) {
}
}
======以下为老版本
使用方法
ScaleGeometricRatioTransform scaleGeometricRatioTransform = new ScaleGeometricRatioTransform(ScreentUtil.getInstance().getScreenWidth(mActivity),mActivity);
Glide.with(SPMobileApplication.getInstance())
.load("图片地址")
.asBitmap()
.skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.transform(scaleGeometricRatioTransform)
.listener(new RequestListener<String, Bitmap>() {
@Override
public boolean onException(Exception e, String model, Target<Bitmap> target, boolean isFirstResource) {
return false;
}
@Override
public boolean onResourceReady(Bitmap resource, String model, Target<Bitmap> target, boolean isFromMemoryCache, boolean isFirstResource) {
LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) imageView.getLayoutParams();
layoutParams.width = resource.getWidth();
layoutParams.height = resource.getHeight();
imageView.setLayoutParams(layoutParams);
return false;
}
})
.into(imageView);
ScreentUtil.getInstance().getScreenWidth(mActivity);是获取屏幕的宽度
代码实现
/**
* @author : gaoxiaoxiong
* @date :2019/8/28 0028
* @description:根据手机屏幕,等比缩放ImageView,ImageView是横向拉满的
**/
public class ScaleGeometricRatioTransform implements Transformation<Bitmap> {
private int phoneWidth = 0;//显示的宽度
private Context mContext;
BitmapPool mBitmapPool = null;
private WeakReference<Context> contextWeakReference;
public ScaleGeometricRatioTransform(int phoneWidth, Context context) {
contextWeakReference = new WeakReference<Context>(context);
this.phoneWidth = phoneWidth;
this.mContext = contextWeakReference.get();
mBitmapPool = Glide.get(mContext).getBitmapPool();
}
@Override
public Resource<Bitmap> transform(Resource<Bitmap> resource, int outWidth, int outHeight) {
Bitmap source = resource.get();
int resoreWidth = source.getWidth();
int resoreHeight = source.getHeight();
float scaleWidth = 0.0f, scaleHeight = 0.0f;
scaleWidth = (float) phoneWidth / (float) resoreWidth;
Matrix matrix = new Matrix();
if (resoreWidth > 1000){
matrix.postScale(scaleWidth, scaleWidth);
}else {
if (resoreWidth > phoneWidth) {
matrix.postScale(scaleWidth, scaleWidth);
}else {
matrix.postScale(1.0f, 1.0f);
}
}
Bitmap newbm = Bitmap.createBitmap(source, 0, 0, resoreWidth, resoreHeight, matrix, true);
return BitmapResource.obtain(newbm, this.mBitmapPool);
}
@Override
public String getId() {
return this.getClass().getName();
}
}
<ImageView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/iv_child_view_floorimageview"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
小结
1、 Bitmap.createBitmap(source, 0, 0, resoreWidth, resoreHeight, matrix, true);
该方法是放入原始的宽高,后面的matrix者是对原始宽高进行缩放的操作
2、当你在Transformation进行图片放大缩小的操作,不会影响到ImageView的宽高,所以你要最后获取转换图片的宽高大小,进行动态的设置
3、如果不设置transform,直接写listener,从resource里面获取的是被压缩过的图片
网友评论