- Fresco是
- 支持
Android2.3以上的版本 - 還沒(méi)有用過(guò)的點(diǎn)這里中文文檔和基本用法
今天介紹下使用技巧, 基本的用法我也就不多說(shuō)了
使用技巧

重置圖片寬高
非常有用的一個(gè)技巧
ps: 我最開(kāi)始沒(méi)這樣壓縮時(shí), 把4張5M左右的圖不做處理直接顯示, app直接卡著動(dòng)不了, 內(nèi)存秒升到300M+, 多么痛的領(lǐng)悟
使用場(chǎng)景:
比如一個(gè)電商app有一個(gè)曬單功能, 用戶傳了幾張產(chǎn)品的曬單圖片, 現(xiàn)在的手機(jī)拍出的圖基本都是5MB左右了
不可能就把這么大的圖片完全顯示上去, 這樣的話app一會(huì)就卡死了
但是在商品詳情頁(yè)顯示用戶的曬單圖片時(shí), 可能只需要顯示200*200的圖片, 就需要使用到下面的方法了
壓縮成一個(gè)
200*200的圖片
FrescoUtils.resetImageSize(200, 200, Uri.parse(imgUrl), sdv_cart_image);
/**
* 重置指定鏈接圖片的寬高
* <p>等比例縮放
*
* @param width 需要縮放的寬
* @param height 需要縮放的高
* @param uri 網(wǎng)絡(luò)圖片的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);
}
```
---
####圖片高度自適應(yīng)
使用場(chǎng)景:
`SimpleDraweeView`本身是**不支持高度自適應(yīng)**的, 文檔也有說(shuō)到
如果必須要使用, 只能通過(guò)一些特殊的方法來(lái)實(shí)現(xiàn)
比如經(jīng)常見(jiàn)到的一些長(zhǎng)圖高度都是`3000px、5000px、10000px`等等
顯示這些長(zhǎng)圖的控件下面可能還會(huì)有其他的布局`View`之類的
**在加載時(shí)我們不知道到圖片的準(zhǔn)確高度**
這種情況就必須使用高度自適應(yīng)了
>
`FrescoUtils.setControllerListener(sdv_goods_detail, "http://*****.jpg", 1080);`
```
/**
* 通過(guò)imageWidth的寬度,自動(dòng)適應(yīng)高度
* @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<ImageInfo>() {
@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("在保存圖片時(shí)出錯(cuò)");
return false;
}
return true;
}
/**
* 獲取下載圖片請(qǐng)求
*
* @param url
* @return
*/
public static ImageRequest getImageRequest(String url) {
return ImageRequestBuilder
.newBuilderWithSource(Uri.parse(url))
.setProgressiveRenderingEnabled(true)
.build();
}
```
---
####支持圖片URI格式
**顯示一個(gè)本地路徑的圖**
`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));
}
```
**顯示一個(gè)工程里的資源圖片**
`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");`
```
/**
* 指定網(wǎng)絡(luò)鏈接圖片資源讓SimpleDraweeView顯示
* @param simpleDraweeView
* @param paramString
*/
public static void setImageUrl(SimpleDraweeView simpleDraweeView, String paramString) {
simpleDraweeView.setImageURI(Uri.parse(paramString));
}
```
---