網(wǎng)絡(luò)SVG圖片的顯示
1淘讥、通過OkHttp等網(wǎng)絡(luò)框架獲取到SVG圖片的String字符串
2圃伶、使用第3方庫Sharp。
Sharp蒲列,適用于在Android上加載SVG窒朋。可以將svg加載為SharpDrawables蝗岖,并且可以有效地用于顯 示在常規(guī)圖像的任何位置侥猩,可以作為背景,ImageView控件抵赢,StateListDrawable使用欺劳。
- 使用Sharp加載svg:
Sharp.loadAsset(getAssets(), "xx.svg").into(imageView);// 在assets文件夾中
Sharp.loadResource(getResources(),R.raw.xx).into(imageView);// 在res/raw文件夾中
Sharp.loadString(“svg字符串”).into(imageView);// String字符串加載
以上都是靜態(tài)加載svg。Sharp還提供了動(dòng)態(tài)加載svg的方法以及監(jiān)聽其加載過程的一套方法铅鲤,當(dāng)加載svg的時(shí)候划提,可以返回一個(gè)Sharp對(duì)象,對(duì)它可以進(jìn)行監(jiān)聽
Sharp sharp = Sharp.loadString(stringSVG);
監(jiān)聽svg開始加載邢享、結(jié)束加載鹏往、元素設(shè)置、元素繪制設(shè)置
sharp.setOnElementListener(new OnSvgElementListener() {
@Override
public void onSvgStart(@NonNull Canvas canvas, @Nullable RectF bounds) {
}
@Override
public void onSvgEnd(@NonNull Canvas canvas, @Nullable RectF bounds) {
}
@Override
public T onSvgElement(@Nullable String id, @NonNull T element, @Nullable RectF elementBounds, @NonNull Canvas canvas, @Nullable RectF canvasBounds, @Nullable Paint paint) {
if (paint !=null) {
paint.setColor(Color.WHITE);
return element;
}
return null;
}
@Override
public void onSvgElementDrawn(@Nullable String id, @NonNull T element, @NonNull Canvas canvas, @Nullable Paint paint) {
}
});
sharp.into(imageView);
其中骇塘,在svg圖片的加載過程中伊履,經(jīng)常出現(xiàn)圖片顏色變黑的問題韩容,我們可以在onSvgElement()監(jiān)聽體中,更改svg中的元素唐瀑,比如更改顏色:
@Override
public T onSvgElement(@Nullable String id, @NonNull T element, @Nullable RectF elementBounds, @NonNull Canvas canvas, @Nullable RectF canvasBounds, @Nullable Paint paint) {
if (paint !=null) {// paint必須添加判空群凶,否則會(huì)報(bào)異常
paint.setColor(Color.WHITE);
return element;
}
return null;
}
附上本地修改圖片顏色的方法(不適用于直接用Sharp賦值的情形)
- android:tint
<ImageView
android:tint="@color/white"
android:id="@+id/iv_bank"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_centerVertical="true"
android:background="@drawable/ic_kpmr"/>
或者在代碼中:
DrawableCompat.setTint(drawable, getResources().getColor(R.color.white));
- setColorFilter
drawable.setColorFilter(getResources().getColor(R.color.white), PorterDuff.Mode.SRC_ATOP);