Fresco是一款強(qiáng)大的圖片加載和處理框架,讓圖片顯示成圓形是很常見的使用場(chǎng)景跪楞,用Fresco的話使用下面的代碼就可以了:
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/avatar"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_margin="1dp"
fresco:placeholderImage="@drawable/user_default_head"
fresco:placeholderImageScaleType="fitCenter"
fresco:roundAsCircle="true" />
然后在代碼中設(shè)置顯示圖片:
draweeView.setImageURI("圖片URI");
但是如果圖片是一張GIF圖的話,顯示成圓形圖片就是失效,而顯示成一個(gè)正方形的圖片继控。
網(wǎng)上搜索了一下斟薇,常見的解決方案有:
1,給SimpleDraweeView設(shè)置這個(gè)屬性 app:roundWithOverlayColor="@color/white"耍攘,當(dāng)然榕栏,屬性值要設(shè)置成跟背景一致的顏色;這種方法有個(gè)缺陷蕾各,就是不適用背景不是純色的場(chǎng)景榛了;
2势告,相對(duì)比較麻煩的方法,思路是這樣:取到GIF圖之后截取第一楨轉(zhuǎn)成bitmap,然后對(duì)bitmap做變換土童,將其裁剪成圓形,然后顯示链沼,具體代碼可以參考:當(dāng)背景不是純色了讨,F(xiàn)resco解決gif不能轉(zhuǎn)圓形問題的終極方案
以上兩種方案要么不兼容所有場(chǎng)景,要么太重钧排,都不是太優(yōu)雅的解決方案敦腔。后來用過一番尋找,發(fā)現(xiàn)Fresco的github下有人提出了同樣的問題恨溜,然后官方給出了終極解決方案:
draweeView.getHierarchy().setActualImageScaleType(ScalingUtils.ScaleType.CENTER_CROP);
ImageDecodeOptions imageDecodeOptions = new ImageDecodeOptionsBuilder()
.setForceStaticImage(true)
.build();
ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri)
.setResizeOptions(new ResizeOptions(width, height))
.setCacheChoice(ImageRequest.CacheChoice.SMALL)
.setImageDecodeOptions(imageDecodeOptions)
.build();
PipelineDraweeControllerBuilder builder = Fresco.getDraweeControllerBuilderSupplier().get()
.setOldController(draweeView.getController())
.setImageRequest(request);
draweeView.setController(builder.build());
主要代碼如下:
ImageDecodeOptions imageDecodeOptions = new ImageDecodeOptionsBuilder()
.setForceStaticImage(true)
.build();
imageRequest.setImageDecodeOptions(imageDecodeOptions)
即對(duì)圖片強(qiáng)制使用靜態(tài)解碼的方式解碼符衔。官方地址如下:
roundascircle does not work with GIFs starting with 1.0.0 #1695