----瀏覽完本文大概需要3分鐘----
昨天母親節(jié),尋思我家女神辛苦了大半輩子,腰落了點(diǎn)毛病,自個(gè)呢又不在身邊,就給她買了靠墊郵去了~轉(zhuǎn)眼這周五又要過520,又開始尋思給對象買點(diǎn)啥好呢,哪都沒問題,誒,愁死了。。。
琢磨了半天,還是先找個(gè)一個(gè)對象再說吧。

說說svg
這個(gè)圖像格式非常棒,基于純字符生成的矢量圖,很多公司都在用,什么微軟啊,啊逗逼啊,蘋果,還有在線的網(wǎng)頁等。
還有各種制作svg的軟件,什么AI啊、還有在線的網(wǎng)站。
總之,svg,體積小活好人人愛。
但是就是這么一個(gè)imba的存在,Android爸爸是沒有解析它的api方法的。
那怎么辦,就這么廢了?
解決辦法無非兩種
-
將svg轉(zhuǎn)換成vector。
vector大家不陌生,可變數(shù)組?不不不,是Android系統(tǒng)下的基于字符生成的矢量圖格式,而且只適用于Android系統(tǒng)!
用插件轉(zhuǎn)換也好,用在線轉(zhuǎn)換也罷,都是一鍵的事,暫且擱下不提 -
使用第3方庫Sharp。
谷歌給它的中文名叫夏普,夏普就類似于Glide,能采用各式各樣的姿勢,360度花樣加載圖像。
可惜Glide美中不足不能加載svg,夏普的出現(xiàn)剛好彌補(bǔ)了這樣的空白。下面重點(diǎn)介紹。
官網(wǎng)的概括:夏普,是適用于在Android上加載SVG??梢詫vg加載為SharpDrawables,并且可以有效地用于顯示在常規(guī)圖像的任何位置,可以作為背景,ImageView控件,StateListDrawable使用。
通常我們使用Glide加載普通圖像都是這樣子的
Glide.with(this).load(R.drawable.logo).into(imageView);
而使用Sharp加載svg圖像是這樣子的
Sharp.loadAsset(getAssets(), "logo.svg").into(imageView);
Sharp.loadResource(getResources(),R.raw.logo).into(imageView);
Sharp.loadString(“svg字符串”).into(imageView);
各位,有木有感覺到一絲絲的震驚呢???
好,沒有,我們繼續(xù)
確實(shí)如你所見,以上都是靜態(tài)加載svg。Sharp還提供了動態(tài)加載svg的方法以及監(jiān)聽其加載過程的一套方法
當(dāng)加載svg的時(shí)候,可以返回一個(gè)Sharp對象,對它可以進(jìn)行監(jiān)聽
Sharp sharp = Sharp.loadAsset(getAssets(), "love.svg")
監(jiān)聽svg開始加載、結(jié)束加載、元素設(shè)置、元素繪制設(shè)置
sharp.setOnElementListener(new OnSvgElementListener() {
@Override
public void onSvgStart() {
}
@Override
public void onSvgEnd() {
}
@Override
public <T> T onSvgElement() {
}
@Override
public <T> void onSvgElementDrawn() {
}
});
其中,在onSvgElement()監(jiān)聽體中,可以更改svg中的元素,比如給指定路徑改顏色
@Override
public <T> T onSvgElement(@Nullable String id, @NonNull T element, @Nullable RectF elementBounds, @NonNull Canvas canvas, @Nullable RectF canvasBounds, @Nullable Paint paint) {
Random random = new Random();
paint.setColor(Color.argb(255,random.nextInt(256),
random.nextInt(256), random.nextInt(256)))
return element;
}
最后放個(gè)效果圖吧~~~~~~

其實(shí)寫到這里,靜態(tài)的svg的使用就基本完事了
可是本文并沒完!
對,不要驚訝,繼續(xù)說說動態(tài)svg的使用
同樣是基于第3方庫完成
先上官方demo的gif,大概感受一下威力

使用的方法就是是抽調(diào)出svg中path路徑完成動畫。
但是如果ui那邊沒有提供svg,只是甩給你一張圖片,格式png或是jpg,那怎么辦呢
比如這樣一張圖

那么要用到接下來介紹的這個(gè)神器Inkscape

一言以概之,就是可以抽取png、jpg等格式圖片中的路徑轉(zhuǎn)換為svg的路徑,挺神吧,而且轉(zhuǎn)換過程非常的簡單和暴力,較之AI要簡單的多
首先用軟件打開這張圖片

另存為,注意保存格式為Inkscape SVG

再導(dǎo)入剛才保存的svg,會發(fā)現(xiàn)此時(shí)操作區(qū)域的圖片周圍多了9個(gè)控制塊

繼續(xù),在菜單欄處選擇路徑->提取位圖輪廓

在彈出的界面中,選擇邊緣檢測,閥值可以作適當(dāng)調(diào)整,然后點(diǎn)更新,點(diǎn)確定,再關(guān)掉此窗口。

回到主界面,在左下角處有個(gè)紅×,用鼠標(biāo)點(diǎn)它一下就好

ok,另保存為svg就好。最后,用編輯器打開svg,在最下面可以發(fā)現(xiàn)path路徑,那么這就是我們要的東西!

最后就是照著官網(wǎng)給的方法,導(dǎo)入這段path,動畫就出來了~
上圖

全文結(jié)束,需要源碼的請留言。