- Fresco是
- 支持
Android2.3
以上的版本 - 还没有用过的点这里中文文档和基本用法
今天介绍下使用技巧, 基本的用法我也就不多说了
使用技巧
重置图片高度
高度自适应
下载图片到本地
常用的图片URI格式
重置图片宽高
非常有用的一个技巧
ps: 我最开始没这样压缩时, 把4张5M左右的图不做处理直接显示, app直接卡着动不了, 内存秒升到300M+, 多么痛的领悟
使用场景:
比如一个电商app
有一个晒单功能, 用户传了几张产品的晒单图片, 现在的手机拍出的图基本都是5MB
左右了
不可能就把这么大的图片完全显示上去, 这样的话app
一会就卡死了
但是在商品详情页显示用户的晒单图片时, 可能只需要显示200*200
的图片, 就需要使用到下面的方法了
压缩成一个
200*200
的图片
FrescoUtils.resetImageSize(200, 200, Uri.parse(imgUrl), sdv_cart_image);
/**
* 重置指定链接图片的宽高
* 等比例缩放
*
* @param width 需要缩放的宽
* @param height 需要缩放的高
* @param uri 网络图片的URI
* @param image 显示图片的控件
*/
public static void resetImageSize(int width, int height, Uri uri, SimpleDraweeView image) {
ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri)
.setResizeOptions(new ResizeOptions(width, height))
.build();
PipelineDraweeController controller = (PipelineDraweeController) Fresco.newDraweeControllerBuilder()
.setOldController(image.getController())
.setImageRequest(request)
.build();
image.setController(controller);
}
```
---
####图片高度自适应
使用场景:
`SimpleDraweeView`本身是**不支持高度自适应**的, 文档也有说到
如果必须要使用, 只能通过一些特殊的方法来实现
比如经常见到的一些长图高度都是`3000px、5000px、10000px`等等
显示这些长图的控件下面可能还会有其他的布局`View`之类的
**在加载时我们不知道到图片的准确高度**
这种情况就必须使用高度自适应了
>
`FrescoUtils.setControllerListener(sdv_goods_detail, "http://*****.jpg", 1080);`
```
/**
* 通过imageWidth的宽度,自动适应高度
* @param simpleDraweeView view
* @param imagePath Uri
* @param imageWidth width
*/
public static void setControllerListener(final SimpleDraweeView simpleDraweeView, String imagePath, final int imageWidth) {
final ViewGroup.LayoutParams layoutParams = simpleDraweeView.getLayoutParams();
ControllerListener controllerListener = new BaseControllerListener() {
@Override
public void onFinalImageSet(String id, @Nullable ImageInfo imageInfo, @Nullable Animatable anim) {
if (imageInfo == null) {
return;
}
int height = imageInfo.getHeight();
int width = imageInfo.getWidth();
layoutParams.width = imageWidth;
layoutParams.height = (int) ((float) (imageWidth * height) / (float) width);
simpleDraweeView.setLayoutParams(layoutParams);
}
@Override
public void onIntermediateImageSet(String id, @Nullable ImageInfo imageInfo) {
}
@Override
public void onFailure(String id, Throwable throwable) {
throwable.printStackTrace();
}
};
DraweeController controller = Fresco.newDraweeControllerBuilder().setControllerListener(controllerListener).setUri(Uri.parse(imagePath)).build();
simpleDraweeView.setController(controller);
}
```
---
####下载图片到本地
```
/** 图片在本地sd卡文件名 */
public static final String HEAD_PICTURE_PATH = "head_pic.jpg";
/** 图片在本地sd卡的目录 */
public static final String HEAD_PICTURE_DIR = Environment.getExternalStorageDirectory().getAbsolutePath() + "/missbear/";
/**
* 下载图片保存到本地路径
*
* @param context
* @param url
*/
public static void downloadHeadPic(final Context context, String url) {
Fresco.getImagePipeline().fetchDecodedImage(getImageRequest(url), context).subscribe(new BaseBitmapDataSubscriber() {
@Override
public void onNewResultImpl(Bitmap bitmap) {
saveBitmapToSdCard(bitmap);
}
@Override
public void onFailureImpl(DataSource dataSource) {}
}, CallerThreadExecutor.getInstance());
}
/**
* 保存图片到SD卡
*
* @param bitmap
*/
private static boolean saveBitmapToSdCard(Bitmap bitmap) {
if (bitmap == null) {
return false;
}
File appDir = new File(HEAD_PICTURE_DIR);
if (!appDir.exists()) {
appDir.mkdir();
}
File file = new File(appDir, HEAD_PICTURE_PATH);
try {
FileOutputStream outputStream = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
outputStream.flush();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
LogUtils.i("在保存图片时出错");
return false;
}
return true;
}
/**
* 获取下载图片请求
*
* @param url
* @return
*/
public static ImageRequest getImageRequest(String url) {
return ImageRequestBuilder
.newBuilderWithSource(Uri.parse(url))
.setProgressiveRenderingEnabled(true)
.build();
}
```
---
####支持图片URI格式
**显示一个本地路径的图**
`FrescoUtils.setImageLocal(sdv_pic, "/storage/emulated/0/Android/data/com.okhqb.missbear/cache/1492398117360.jpg");`
```
/**
* 指定本地图片让SimpleDraweeView显示
*
* @param simpleDraweeView
* @param paramString 本地图片路径
*/
public static void setImageLocal(SimpleDraweeView simpleDraweeView, String paramString) {
simpleDraweeView.setImageURI(Uri.parse("file://" + paramString));
}
```
**显示一个工程里的资源图片**
`FrescoUtils.setImageResources(sdv_pic, R.mipmap.ic_launcher);`
```
/**
* 指定工程里的图片资源让SimpleDraweeView显示
* @param simpleDraweeView
* @param paramInt
*/
public static void setImageResources(SimpleDraweeView simpleDraweeView, int paramInt) {
String packageName = "your package name";
simpleDraweeView.setImageURI(Uri.parse("res://" + packageName + "/" + paramInt));
}
```
**常用的图片URI格式**
`FrescoUtils.setImageUrl(sdv_pic, "https://*****.jpg");`
```
/**
* 指定网络链接图片资源让SimpleDraweeView显示
* @param simpleDraweeView
* @param paramString
*/
public static void setImageUrl(SimpleDraweeView simpleDraweeView, String paramString) {
simpleDraweeView.setImageURI(Uri.parse(paramString));
}
```
---