Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android tips(十二)--)Android開發中使用矢量圖

Android tips(十二)--)Android開發中使用矢量圖

編輯:關於Android編程

本文我們將介紹一些關於Android矢量圖的相關知識點。最新的項目中要求以矢量圖替代傳統的.png資源文件,所以特意學習了一下Android中的矢量圖相關概念,不得不說矢量圖還是一個比較好的適配方案。Android從Android5.0開始引入了對矢量圖的支持,但是其並不支持svg這種矢量圖片格式,,而是以VectorDrawable的方式來實現矢量圖的效果。

Google官方關於矢量圖的相關說明:VectorDrawable相關說明

下面我們將詳細的介紹一下矢量圖的基本概念以及Android中對矢量圖的使用。

(一)什麼是矢量圖

這裡暫時引用一下百科中對矢量圖的定義:

矢量圖,也稱為面向對象的圖像或繪圖圖像,在數學上定義為一系列由線連接的點。矢量文件中的圖形元素稱為對象。每個對象都是一個自成一體的實體,它具有顏色、形狀、輪廓、大小和屏幕位置等屬性。

矢量圖是根據幾何特性來繪制圖形,矢量可以是一個點或一條線,矢量圖只能靠軟件生成,文件占用內在空間較小,因為這種類型的圖像文件包含獨立的分離圖像,可以自由無限制的重新組合。它的特點是放大後圖像不會失真,和分辨率無關,適用於圖形設計、文字設計和一些標志設計、版式設計等

可縮放矢量圖形是基於可擴展標記語言(標准通用標記語言的子集),用於描述二維矢量圖形的一種圖形格式。它由萬維網聯盟制定,是一個開放標准,其簡稱為SVG,android中對矢量圖的支持就是對SVG的支持,其是W3C組織推薦的矢量圖標准。

這裡我就簡單的引用W3C中對SVG矢量圖的介紹:

SVG 指可伸縮矢量圖形 (Scalable Vector Graphics)

SVG 用來定義用於網絡的基於矢量的圖形,SVG 使用 XML 格式定義圖形

SVG 圖像在放大或改變尺寸的情況下其圖形質量不會有所損失

SVG 是萬維網聯盟的標准,SVG 與諸如 DOM 和 XSL 之類的 W3C 標准是一個整體

簡單來說SVG矢量圖就是一個使用XML標識圖片格式的萬維網聯盟標准,更多關於SVG的相關說明:asp">SVG簡介

(2)矢量圖有什麼好處

我們都知道Android系統已經為我們提供了PNG,JPG,drawable,.9.path圖片等,為什麼又為我們提供了SVG矢量圖呢?

與其他圖像格式相比,使用 SVG 的優勢在於:

SVG 可被非常多的工具讀取和修改(比如記事本)

SVG 與 JPEG 和 GIF 圖像比起來,尺寸更小,且可壓縮性更強。

SVG 是可伸縮的,SVG 圖像可在任何的分辨率下被高質量地打印

SVG 可在圖像質量不下降的情況下被放大

SVG 圖像中的文本是可選的,同時也是可搜索的(很適合制作地圖)

SVG 可以與 Java 技術一起運行,SVG 文件是純粹的 XML

矢量圖在實現的時候圖片質量不會下降,下面具體我們可以看一下一個簡單的例子:

然後我們看一下實現的效果:

這裡寫圖片描述

然後我們更新一下圖片的顯示大小,再繼續看一下:

這裡寫圖片描述

可以發現當圖片顯示變大時圖片也沒有失真的情況,顯示的情況還是和100dp的時候是相似的,而且我們也沒有保存多分drawable圖片資源,這樣使用矢量圖代替資源文件的話還可以減小我們的apk文件大小等。

(3)開發過程中如何使用矢量圖替換Png Icon<喎?/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPjwvcD4NCjxwPtXiwO/S1EFuZHJvaWQgU3R1ZGlvzqrA/aOsvNnI587Sw8fQ6NKq1Nq1zbDmsb7Jz8q508PKuMG/zbyjrNDo0qrU2s/uxL/W0NL9yOvQwrXEvObI3b/ic3VwcG9ydC12ZWN0b3ItZHJhd2FibGWjrLKix9JhcHBjb21wYXQtdje/4rXEsOaxvtKq1NoyMy4yLjAroaO2+MfSxOO7udKq0N64xM/CZ3JhZGxltcTP4LnYxeTWw6OssrvSqsjDZ3JhZGxl1Nq5ub2otcTKsbryzqrE49Tatc2w5rG+KEFQSTIx0tTPwim1xMfpv/bPwsn6s8nV67bU09qyu82sw9y2yLXEcG5nzsS8/qOs0vLOqmFuZHJvaWQgc3R1ZGlvMS40tcTKsbry1qez1sHLyrjBv828oaM8L3A+DQrI57n7xOO1xGdyYWRsZbLlvP61xLDmsb7OqjIuMNLUz8KjrMTj06a4w9Xiw7TQ3rjEDQo8cHJlIGNsYXNzPQ=="brush:java;"> android { defaultConfig { // 不讓gradle自動生成不同屏幕分辨率的png圖 generatedDensities = [] } aaptOptions { additionalParameters "--no-version-vectors" } }

如果你的gradle插件版本是2.0+,你 應該這麼修改

android {
    defaultConfig {
         vectorDrawables.useSupportLibrary = true
    }
}

經過上面的設置之後我們就可以在我們的Android項目中使用矢量圖了。

(4)使用Android Studio創建矢量圖資源

右鍵res目錄創建Vector Asset資源

這裡寫圖片描述

設置Asset Type,選擇SVG資源,設置SVG資源大小

這裡寫圖片描述

在drawable目錄下生成vector資源文件

這裡寫圖片描述

(5)矢量圖標簽的相關說明

可以發現我們生成的矢量圖資源文件其實是一個drawable文件:


    

這裡的drawable資源文件的根節點是vector,我們都知道drawable中的節點都是對應著一個Java對象的,而vector是VectorDrawable對應的根標簽,Android中矢量圖對應的Java對象就是VectorDrawable。

然後android:width與android:height對應矢量圖的實際大小,這裡需要說明的是矢量圖是可以無限大, 但通常情況下一個圖片都應該有一個原始大小, 假如你將此VectorDrawable作為一個ImageView的src, ImageView的大小都設置為wrap_content, 則ImageView對應的實際大小就是這裡設置的大小。

繼續我們看一下android:viewportWidth與android:viewportHeight,它們是指當前Drawable對應的虛擬Canvas的大小, 之所以說是虛擬的是因為實際上並不存在這樣一個Canvas, 又之所以需要這個值是因為在標簽中的路徑數據要基於具體的坐標系來繪制.

而標簽對應路徑信息, 這裡的path與我們自定義繪制圖形時用的Path原理一樣, 就是記錄一些繪圖操作, 具體對應其中的pathData.PathData中對應的路徑描述符號不需要我們去記, 通常情況下由繪圖軟件生成svg圖片再從svg文件中提取。

(6)如何在View中引用

添加自定義屬性命名空間
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"

在layout布局文件中的根節點添加xmlns:app的命名空間

在ImageView中設置src

可以發現這裡使用的是srcCompat而非src屬性

為View對象設置Backgraound
Resources resources = context.getResources(Resources, int, Theme);
Theme theme = context.getTheme();
Drawable drawable = VectorDrawableCompat.create(resources, R.drawable.vector_drawable, theme);
view.setBackground(drawable);

最後我們看一下它的展示效果:

這裡寫圖片描述

(7)如何編寫VectorDrawable資源文件

我們可以看到VectorDrawable資源文件的編寫很復雜,那麼我們如何編寫VectorDrawable文件呢?其實編寫VectorDrawable資源文件我們可以首先生成一個SVG文件,然後使用Android Studio的SVG工具生成VectorDrawable資源文件。具體步驟如下:

美工交付.svg文件

使用Android Studio加載本地.svg文件並生成VectorDrawable資源文件

生成最終的svg drawable資源文件

這裡寫圖片描述

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