Android開發(fā)之SVG的使用

----瀏覽完本文大概需要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方法的。
那怎么辦,就這么廢了?

解決辦法無非兩種

  1. 將svg轉(zhuǎn)換成vector。

    vector大家不陌生,可變數(shù)組?不不不,是Android系統(tǒng)下的基于字符生成的矢量圖格式,而且只適用于Android系統(tǒng)!
    用插件轉(zhuǎn)換也好,用在線轉(zhuǎn)換也罷,都是一鍵的事,暫且擱下不提

  2. 使用第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方庫完成

AnimatedSvgView

先上官方demo的gif,大概感受一下威力

官方demo的gif圖

使用的方法就是是抽調(diào)出svg中path路徑完成動畫。

但是如果ui那邊沒有提供svg,只是甩給你一張圖片,格式png或是jpg,那怎么辦呢
比如這樣一張圖

需要轉(zhuǎn)換成svg的圖

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


Image 152.png

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


Image 152.png

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


Image 153.png

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

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

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


Image 156.png

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

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

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

全文結(jié)束,需要源碼的請留言。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容