Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android開發游記:VectorDrawable矢量圖兼容性問題的解決方案

android開發游記:VectorDrawable矢量圖兼容性問題的解決方案

編輯:關於Android編程

安卓5.0Lollipop發布以來VectorDrawable作為安卓環境下的矢量化圖形的方式一直由於兼容性問題而很少被用到,由於只能用於5.0以上系統,導致現在多少安卓機無法使用而一直被開發人員無限擱置。在官方給出兼容性的解決方案之前,開發者社區已經有幾個解決方案了。比如:

https://github.com/trello/victor
https://github.com/telly/MrVector
https://github.com/wnafee/vector-compat

但是就效果和易用性而言,我個人並不看好,其中MrVector已經停止維護,而vector-compat也已經很長時間沒有更新過,而且經博主測試發現僅適用於Android gradle plugin 1.4以下的版本,1.5以後存在無法正確編譯的問題。

官方也一直沒有給出一個 VectorDrawableCompat 支持庫來解決兼容性問題。

Android gradle plugin 1.5發布以後,加入了一個跟VectorDrawable有關的新功能。Android build tools 提供了另外一種解決兼容性的方案,如果編譯的版本是5.0之前的版本,那麼build tools 會把VectorDrawable生成對應的png圖片,這樣在5.0以下的版本則使用的是生成的png圖,而在5.0以上的版本中則使用VectorDrawable

在build.gradle添加generatedDensities配置,可以配置生成的png圖片的密度:

    defaultConfig {
        applicationId "com.liaoinstan.vectordrawablesupport"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        generatedDensities = ['hdpi', 'xhdpi']
    }

不配置,默認全部生成。

那麼,接下來測試一下:

創建一個支持5.0以下版本的工程,我這裡最低支持到15,不配置generatedDensities 默認全部生成

    defaultConfig {
        applicationId "com.liaoinstan.vectordrawablesupport"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }

在drawable下創建一個vector.xml配置一張矢量圖:


然後在布局中添加一個ImageView引用該矢量圖:

效果如下:

 

這裡寫圖片描述

 

然後打包編譯,從工程目錄下找到編譯生成的apk文件,路徑如下:

VectorDrawableSupport\app\build\outputs\apk

然後將apk使用解壓軟件解壓,在res文件夾下可以找到生成的各個屏幕密度對應的資源文件:

 

這裡寫圖片描述

 

裡面分別為不同分辨率的屏幕生成了不同規格的png圖片

 

這裡寫圖片描述

 

這種方案缺失解決了目前存在的VectorDrawable 的向下兼容的問題,但是為VectorDrawable 提供了各種復雜動畫效果的AnimatedVectorDrawable依然無法在5.0以下的機型使用。

目前也沒有什麼較好的解決方案,一般通過機型的適配來為不同安卓版本制作2種資源,一種是支持動畫的給5.0以上機器使用,一種是不支持動畫的給5.0以下的機型使用。在使用AnimatedVectorDrawable的時候,把 AnimatedVectorDrawable資源放到 drawable-v21 目錄中,並且在 drawable 中提供一個和 AnimatedVectorDrawable 同名字的資源來在 5.0之前的版本使用,在這個 xml 文件中可以使用一個 selector 來替代這個動畫。

注意有時候為了簡潔可能會把VectorDrawable下的pathData放到string.xml中,然後在VectorDrawable下引用,如:

如果通過生成png來兼容5.0以下機型的話,會報pathData錯誤,編譯器不會去讀取string.xml,我也不知道為啥要這樣限制,總之只能把pathData寫到VectorDrawable下。

AnimatedVectorDrawable確實是一個非常實用的工具,能夠通過配置來實現各種復雜的動畫效果,讓人眼前一亮,但是目前的兼容性問題卻很讓人頭疼,改天再寫寫AnimatedVectorDrawable吧。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved