編輯:關於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項目中使用矢量圖了。 (4)使用Android Studio創建矢量圖資源 (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中引用 在layout布局文件中的根節點添加xmlns:app的命名空間 可以發現這裡使用的是srcCompat而非src屬性 最後我們看一下它的展示效果: (7)如何編寫VectorDrawable資源文件 我們可以看到VectorDrawable資源文件的編寫很復雜,那麼我們如何編寫VectorDrawable文件呢?其實編寫VectorDrawable資源文件我們可以首先生成一個SVG文件,然後使用Android Studio的SVG工具生成VectorDrawable資源文件。具體步驟如下: 美工交付.svg文件 使用Android Studio加載本地.svg文件並生成VectorDrawable資源文件 生成最終的svg drawable資源文件
android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
Resources resources = context.getResources(Resources, int, Theme);
Theme theme = context.getTheme();
Drawable drawable = VectorDrawableCompat.create(resources, R.drawable.vector_drawable, theme);
view.setBackground(drawable);
滾輪選擇控件Android自帶的選擇時間控件有點丑,往往產品和設計都比較嫌棄,希望做成ios一樣的滾輪選擇,下面是我在NumberPicker的基礎上自定義的選擇控件,效
本篇文章的主要內容是說圖片的內存緩存和從網絡異步獲取圖片的過程工程效果圖如下: 代碼中部分不常見的屬性解釋如下(百度也可以找到的)android:numCo
Android輸入法框架(Input Method Framework,IMF)是Android中非常重要的模塊,它分布於三個部分(確切的說,是三個進程), 包含編輯框
android中的json的讀取1.讀取Json文件中的json內容首先在將json文件放在目錄assets下:test.json {programmers:[