1. 程式人生 > >SVG-Android開源庫——SVG圖片相容及效能優化解決方案

SVG-Android開源庫——SVG圖片相容及效能優化解決方案

SVG向量圖在圖片表現力方面遠遠優於PNG點陣圖,同時在可維護性和修改性方面也比點陣圖要方便很多。儘管Android在5.0版本就引入了SVG圖片的解決方案:Vector。然而,相容性和效能方面卻是差強人意,以至於至今都未能廣泛使用。

同樣的,常用另一套SVG圖片解決方案IconFont,在使用性、功能甚至效能方面有非常多的侷限性。

本篇部落格給大家帶來一套較為不錯的解決方案:SVG-Android,相比於Vector,其在相容性方面能夠相容到4.0及以上,同時在效能方面,也有了質的提升。

PS:主要思想參考的微信的SVG解決方案。

一、SVG-Android效果演示

這裡寫圖片描述 這裡寫圖片描述
這裡寫圖片描述 這裡寫圖片描述
這裡寫圖片描述

這裡寫圖片描述

二、SVG-Android接入文件

三、SVG-Android實現原理

1、預解析

從對Vector的效能測試資料來看,大部分耗時都在解析xml和繪製渲染兩個階段。為了提高效能,SVG-Android的做法是將部分耗時操作由執行時轉移到編譯前,也就是預解析。同時,由於svg檔案的fillData的資料在Android中表現為Path,這部分計算量也是可以預先計算好的。

所以,SVG-Generator庫會將Vector檔案提前解析生成用於直接渲染的SVGRenderer類,另外fillData的每個指令數也會預先計算好,直接生成Java Path程式碼,SVGDrawable只要通過SVGRenderer就能畫出svg圖形了。

這裡寫圖片描述

2、無感知

為了提高開發效率,我們希望開發者在使用SVG圖片的時候能夠和使用常規的PNG一樣,可以在layout檔案中直接使用@drawable/xxx,或者java程式碼中使用R.drawable.xxx。為了解決這個問題,我們採用偷天換日的方式,使用SVG-Generator生成一張空的shape檔案,放入到drawable-anydpi中,同時會將對應的SVGDrawableConstantState預先注入到Resources的sPreloadedDrawables快取中,攔截掉所有對shape的獲取請求。

這裡寫圖片描述

本部落格不定期持續更新,歡迎關注和交流: