我们要展示一个长图上部分(600 * 850的图片 展示在100 * 200的ImageView上。优先展示上部分,相当于将centerCrop改为topCrop)如下图:
我们都知道ImageView的scaleType的centerCrop是我们最常用的,会按最合适的比例裁剪,保留中间部分。还是这个图片,效果如下图:
但是需求是展示顶部;
思路:我们计算出图片的宽高,然后将高度安装既定的比例裁剪。得到顶部的一个图片。然后再展示到imageView上
方案1:
计算图片宽高:方式有很多种,我们仅列一种:
//通过glide获取宽高以及bitmap
Glide.with(context).asBitmap()
.load(url)
.into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(@NonNull @NotNull Bitmap resource, @Nullable @org.jetbrains.annotations.Nullable Transition<? super Bitmap> transition) {
int maxWidth = resource.getWidth();
int maxHeight = resource.getHeight() * (176 * 100 / 315) / 100;
try {
//裁剪获取(0, 0, maxWidth, maxHeight)范围的图像
Bitmap smallBitmap =Bitmap.createBitmap(resource, 0, 0, maxWidth, maxHeight);
iv_image_xxl.setImageBitmap(smallBitmap);
} catch (Exception ex) {
LxUtils.setImage(context, url, holder.iv_image_xxl);
}
}
});
方案2:阿里OSS的图片(如果合适,优先采用)
如果是使用的阿里云OSS储存的图片。那样还有更简介的方式:
我们可以通过oss图片处理(缩放+裁剪)来得到我们想要的图片
虽然oss提供了获取图片的信息:
但是这样需要网络请求,不采取
可以通过图片缩放+自定义裁剪去处理;
其他处理方式可自行查看文档
1.缩放,将图片缩放至一个合适的比例。这样为的是得到一个我们已知的宽度。
2.根据比例。算出我们要得到的高度
3.根据宽高进行裁剪(裁剪规则如下图url)
原图:
https://image-demo.oss-cn-hangzhou.aliyuncs.com/example.jpg
结果图片:
如果裁剪时候高度不够。那样我们可以通过android自带的scaleType的centerCrop再去适配。
方案3:七牛OSS的图片(如果合适,优先采用)
原理同上
原图:
https://oss.p74.cn/homepageImg_408390.jpg
结果图片:
https://oss.p74.cn/homepageImg_408390.jpg?imageMogr2/thumbnail/1000x/crop/!1000x400a0a0