成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何使用Android的VectorDrawable類繪制矢量圖

譯文
移動開發
盡管Android系統并不能夠直接支持SVG(即可縮放矢量圖形),但Lollipop版本卻引入了一個名為VectorDrawable的新類,其允許設計人員及開發人員以純代碼方式生成類似的繪制效果。

繪制矢量圖形非難事——如何使用Android的VectorDrawable類

內容概述

盡管Android系統并不能夠直接支持SVG(即可縮放矢量圖形),但Lollipop版本卻引入了一個名為VectorDrawable的新類,其允許設計人員及開發人員以純代碼方式生成類似的繪制效果。

在今天的文章中,我們將共同學習如何利用XML文件創建一個VectorDrawable,并將其以動畫方式顯示在自己的項目當中。這項功能只能在運行有Android 5.0或者更高版本的設備上實現,而且目前還不具備任何支持庫實現。本篇教程中的相關源文件可以通過GitHub網站獲取。

1. 創建Vector Drawable

從相似角度來看,VectorDrawable與標準SVG圖形都是利用path值繪制完成的。不過如何利用SVG path繪制圖形并不在本篇文章的探討范圍之內,大家可以點擊此處從W3C網站處獲取必要的說明資料。在本文當中,我們只需要了解到path標簽的作用是進行圖形繪制即可。讓我們首先從SVG文件入手,看看以下圖形是如何被繪制出來的:

這一圖形共由五個主要部分所組成:

一個圓角四邊形作為CPU主體,該四邊形由兩條拱狀弧線構成。

四組各自包含五根線條的圖形,用于充當CPU的外延線路。

以下代碼所示為如何以SVG方式繪制以上圖形:

  1. <?xml version="1.0" encoding="utf-8"?> 
  2.   
  3. <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"
  4. <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" 
  5.      width="512px" height="512px" viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve"
  6. <path id="cpu" d=" 
  7.     M341.087,157.478c7.417,0,13.435,6.018,13.435,13.435v170.174 c0,7.417-6.018,13.435-13.435,13.435H170.913 c-7.417,0-13.435-6.018-13.435-13.435V170.913 c0-7.417,6.018-13.435,13.435-13.435H341.087z 
  8.     M390.348,157.478 c0-19.785-16.041-35.826-35.826-35.826H157.479c-19.785,0-35.826,16.041-35.826,35.826v197.043 c0,19.785,16.041,35.826,35.826,35.826h197.043c19.785 0,35.826-16.041,35.826-35.826V157.478z 
  9.   
  10.     M193.304,408.261V462h-17.913 v-53.739H193.304z 
  11.     M264.957,408.261V462h-17.914v-53.739H264.957z 
  12.     M300.783,408.261V462h-17.914v-53.739H300.783z 
  13.     M229.13,408.261 V462h-17.913v-53.739H229.13z 
  14.     M336.609,408.261V462h-17.914v-53.739H336.609z 
  15.   
  16.     M193.304,50v53.739h-17.913V50H193.304z 
  17.     M264.957,50 v53.739h-17.914V50H264.957z 
  18.     M300.783,50v53.739h-17.914V50H300.783z 
  19.     M229.13,50v53.739h-17.913V50H229.13z 
  20.     M336.609,50v53.739 h-17.914V50H336.609z 
  21.   
  22.     M408.261,318.695H462v17.914h-53.739V318.695z 
  23.     M408.261,247.043H462v17.914h-53.739V247.043z 
  24.     M408.261,211.217 H462v17.913h-53.739V211.217z 
  25.     M408.261,282.869H462v17.914h-53.739V282.869z 
  26.     M408.261,175.391H462v17.913h-53.739V175.391z 
  27.   
  28.     M50,318.695h53.739v17.914H50V318.695z 
  29.     M50,247.043h53.739v17.914H50V247.043z 
  30.     M50,211.217h53.739v17.913H50V211.217z 
  31.     M50,282.869 h53.739v17.914H50V282.869z 
  32.     M50,175.391h53.739v17.913H50V175.391z" /> 
  33. </svg> 

雖然看起來有點繁雜,但大家其實用不著糾結于以上代碼的具體含義,而且這完全不會影響到我們接下來要進行的VectorDrawable繪制工作。不過需要強調的是,我將前面提到的五大圖形組成部分在代碼中作為獨立的區塊來處理,這是為了增強代碼內容的可讀性。

首先,我們需要利用兩條拱形弧線來繪制出圓角四邊形,而在接下來的內容中我們會探討如何分別表現出上、下、左、右四個方位的外延線條。為了將上述SVG代碼轉化為VectorDrawable,大家首先需要在XML當中定義vector對象。以下代碼提取自本篇文章示例代碼當中的vector_drawable_cpu.xml文件。

  1. <vector xmlns:android="http://schemas.android.com/apk/res/android" 
  2.     android:height="64dp" 
  3.     android:width="64dp" 
  4.     android:viewportHeight="600" 
  5.     android:viewportWidth="600" > 
  6.       
  7. </vector> 
在此之后,大家可以向其中添加path數據。下列代碼同樣被拆分成了五個不同的path標簽而非將其作為整體處理,這當然也是為了保證內容的可讀性。
  1.  <vector xmlns:android="http://schemas.android.com/apk/res/android" 
  2.     android:height="64dp" 
  3.     android:width="64dp" 
  4.     android:viewportHeight="600" 
  5.     android:viewportWidth="600" > 
  6.   
  7.         <path 
  8.             android:name="cpu" 
  9.             android:fillColor="#000000" 
  10.             android:pathData=" 
  11.                 M341.087,157.478 c7.417,0,13.435,6.018,13.435,13.435 v170.174c0,7.417-6.018,13.435-13.435,13.435 H170.913 c-7.417,0-13.435-6.018-13.435-13.435V170.913c0-7.417,6.018-13.435,13.435-13.435H341.087z 
  12.                 M390.348,157.478 c0-19.785-16.041-35.826-35.826-35.826H157.479c-19.785,0-35.826,16.041-35.826,35.826v197.043 c0,19.785,16.041,35.826,35.826,35.826h197.043c19.785,0,35.826-16.041,35.826-35.826V157.478z" 
  13.         /> 
  14.   
  15.         <path 
  16.             android:name="wires_bottom" 
  17.             android:fillColor="#000000" 
  18.             android:pathData=" 
  19.                 M193.304,408.261V462h-17.913 v-53.739H193.304z 
  20.                 M264.957,408.261V462h-17.914v-53.739H264.957z 
  21.                 M300.783,408.261V462h-17.914v-53.739H300.783z 
  22.                 M229.13,408.261 V462h-17.913v-53.739H229.13z 
  23.                 M336.609,408.261V462h-17.914v-53.739H336.609z" 
  24.         /> 
  25.   
  26.         <path 
  27.             android:name="wires_top" 
  28.             android:fillColor="#000000" 
  29.             android:pathData=" 
  30.                 M193.304,50v53.739h-17.913V50H193.304z 
  31.                 M264.957,50 v53.739h-17.914V50H264.957z 
  32.                 M300.783,50v53.739h-17.914V50H300.783z 
  33.                 M229.13,50v53.739h-17.913V50H229.13z 
  34.                 M336.609,50v53.739 h-17.914V50H336.609z" 
  35.         /> 
  36.   
  37.         <path 
  38.             android:name="wires_right" 
  39.             android:fillColor="#000000" 
  40.             android:pathData=" 
  41.                 M408.261,318.695H462v17.914h-53.739V318.695z 
  42.                 M408.261,247.043H462v17.914h-53.739V247.043z 
  43.                 M408.261,211.217 H462v17.913h-53.739V211.217z 
  44.                 M408.261,282.869H462v17.914h-53.739V282.869z 
  45.                 M408.261,175.391H462v17.913h-53.739V175.391z" 
  46.         /> 
  47.           
  48.         <path 
  49.             android:name="wires_left" 
  50.             android:fillColor="#000000" 
  51.             android:pathData=" 
  52.                 M50,318.695h53.739v17.914H50V318.695z 
  53.                 M50,247.043h53.739v17.914H50V247.043z 
  54.                 M50,211.217h53.739v17.913H50V211.217z 
  55.                 M50,282.869 h53.739v17.914H50V282.869z 
  56.                 M50,175.391h53.739v17.913H50V175.391z" 
  57.         /> 
  58.   
  59. </vector> 

正如大家所見,每個path片段都只需要利用pathData屬性進行繪制。現在我們可以將VectorDrawable XML文件作為一個可繪制對象納入到標準ImageView當中,而且其能夠根據應用程序的實際需要任意進行尺寸縮放——完全不需要再修改任何Java代碼。

2. 為Vector Drawables添加動畫效果

現在我們已經了解了如何以純代碼方式創建圖形,接下來要做的是找點樂子——為其添加動畫效果。在以下動畫中,大家會發現作為延伸線路的各組線條會不斷指向并遠離CPU本體進行移動。

為了達到這一目標,大家需要將包含動畫效果的每個片段包含在一個<group>標簽當中。經過修改的vector_drawable_cpu.xml版本將如下所示:

  1. <vector xmlns:android="http://schemas.android.com/apk/res/android" 
  2.     android:height="64dp" 
  3.     android:width="64dp" 
  4.     android:viewportHeight="600" 
  5.     android:viewportWidth="600" > 
  6.   
  7.     <group 
  8.         android:name="cpu_box"
  9.         <path 
  10.             android:name="cpu" 
  11.             android:fillColor="#000000" 
  12.             android:pathData=" 
  13.             M341.087,157.478 c7.417,0,13.435,6.018,13.435,13.435 v170.174c0,7.417-6.018,13.435-13.435,13.435 H170.913 c-7.417,0-13.435-6.018-13.435-13.435V170.913c0-7.417,6.018-13.435,13.435-13.435H341.087z 
  14.             M390.348,157.478 c0-19.785-16.041-35.826-35.826-35.826H157.479c-19.785,0-35.826,16.041-35.826,35.826v197.043 c0,19.785,16.041,35.826,35.826,35.826h197.043c19.785,0,35.826-16.041,35.826-35.826V157.478z "/> 
  15.     </group> 
  16.     <group 
  17.         android:name="bottom"
  18.         <path 
  19.             android:name="wires_bottom" 
  20.             android:fillColor="#000000" 
  21.             android:pathData=" 
  22.         M193.304,408.261V462h-17.913 v-53.739H193.304z 
  23.         M264.957,408.261V462h-17.914v-53.739H264.957z 
  24.         M300.783,408.261V462h-17.914v-53.739H300.783z 
  25.         M229.13,408.261 V462h-17.913v-53.739H229.13z 
  26.         M336.609,408.261V462h-17.914v-53.739H336.609z" /> 
  27.     </group> 
  28.     <group android:name="top"
  29.         <path 
  30.             android:name="wires_top" 
  31.             android:fillColor="#000000" 
  32.             android:pathData=" 
  33.         M193.304,50v53.739h-17.913V50H193.304z 
  34.         M264.957,50 v53.739h-17.914V50H264.957z 
  35.         M300.783,50v53.739h-17.914V50H300.783z 
  36.         M229.13,50v53.739h-17.913V50H229.13z 
  37.         M336.609,50v53.739 h-17.914V50H336.609z " /> 
  38.     </group> 
  39.     <group android:name="right"
  40.         <path 
  41.             android:name="wires_right" 
  42.             android:fillColor="#000000" 
  43.             android:pathData=" 
  44.         M408.261,318.695H462v17.914h-53.739V318.695z 
  45.         M408.261,247.043H462v17.914h-53.739V247.043z 
  46.         M408.261,211.217 H462v17.913h-53.739V211.217z 
  47.         M408.261,282.869H462v17.914h-53.739V282.869z 
  48.         M408.261,175.391H462v17.913h-53.739V175.391z" /> 
  49.     </group> 
  50.     <group android:name="left"
  51.         <path 
  52.             android:name="wires_left" 
  53.             android:fillColor="#000000" 
  54.             android:pathData=" 
  55.         M50,318.695h53.739v17.914H50V318.695z 
  56.         M50,247.043h53.739v17.914H50V247.043z 
  57.         M50,211.217h53.739v17.913H50V211.217z 
  58.         M50,282.869 h53.739v17.914H50V282.869z 
  59.         M50,175.391h53.739v17.913H50V175.391z" /> 
  60.     </group> 
  61.   
  62. </vector> 

接下來,我們需要為每個動畫類型創建animator文件。在本次示例中,每組線路各使用一個animator,這就意味著共需要四個animator。以下代碼所示為上方線路的動畫效果,大家還需要為下、左、右線路設定類似的效果。每個animator XML文件都被包含在了本項目的示例代碼當中。

  1.  <?xml version="1.0" encoding="utf-8"?> 
  2. <set xmlns:android="http://schemas.android.com/apk/res/android"
  3.     <objectAnimator 
  4.         android:propertyName="translateY" 
  5.         android:valueType="floatType" 
  6.         android:valueFrom="0" 
  7.         android:valueTo="-10" 
  8.         android:repeatMode="reverse" 
  9.         android:repeatCount="infinite" 
  10.         android:duration="250" /> 
  11. </set> 

如大家所見,propertyName被設定為translateY,這意味著該動畫將沿Y軸方向移動。而valueFrom與valueTo則控制著位移的起點與終點。通過將repeatMode設置為reverse而repeatCount設置為infinite,整個動畫會一直循環下去,其效果則在VectorDrawable處體現出來。該動畫的duration被設定為250,其時長單位為毫秒。

為了將該動畫應用到自己的可繪制文件當中,大家需要創建一個新的animated-vector XML文件,從而將這些animator分配給各VectorDrawable組。以下代碼的作用是創建該animated_cpu.xml文件。

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <animated-vector xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     android:drawable="@drawable/vector_drawable_cpu"
  4.   
  5.     <target 
  6.         android:animation="@animator/pulse_top" 
  7.         android:name="top" /> 
  8.   
  9.     <target 
  10.         android:animation="@animator/pulse_right" 
  11.         android:name="right" /> 
  12.   
  13.     <target 
  14.         android:animation="@animator/pulse_left" 
  15.         android:name="left" /> 
  16.   
  17.     <target 
  18.         android:animation="@animator/pulse_bottom" 
  19.         android:name="bottom" /> 
  20. </animated-vector> 

當所有必要的XML文件都已經準備完成后,大家就可以將animated_cpu.xml加入到ImageView當中進行顯示了。

  1. <ImageView 
  2.     android:id="@+id/cpu" 
  3.     android:layout_width="64dp" 
  4.     android:layout_height="64dp" 
  5.     android:src="@drawable/animated_cpu" /> 

要開始播放動畫效果,大家需要從ImageView當中獲取Animatable實例并調用start。

  1.  ImageView mCpuImageView = (ImageView) findViewById( R.id.cpu ); 
  2. Drawable drawable = mCpuImageView.getDrawable(); 
  3. if (drawable instanceof Animatable) { 
  4.     ((Animatable) drawable).start(); 

在start被調用之后,CPU圖形當中的線路圖形就會開始移動——整個過程只需要使用少量Java代碼即可實現。

3. Vector Drawables的變化方式

對于VectorDrawable來說,最常見的一種使用方式就是將一個圖形轉化至另一個圖形,例如操作欄中的圖標由漢堡變成箭頭。要做到這一點,源與目標path二者都必須具備同樣的格式以保證元素數量上的一致。在本次示例中,我們將如前文圖片所示嘗試將左箭頭轉化為右箭頭。

  1. <string name="left_arrow">M300,70 l 0,70 -70,-70 0,0 70,-70z</string> 
  2.  
  3. <string name="right_arrow">M300,70 l 0,-70 70,70 0,0 -70,70z</string> 

接下來,大家需要利用path為left_arrow建立一個初始drawable。在示例代碼中,我們將其命名為vector_drawable_left_arrow.xml。

  1. <vector xmlns:android="http://schemas.android.com/apk/res/android" 
  2.    android:height="64dp" 
  3.    android:width="64dp" 
  4.    android:viewportHeight="600" 
  5.    android:viewportWidth="600" > 
  6.  
  7.    <path 
  8.        android:name="left_arrow" 
  9.        android:fillColor="#000000" 
  10.        android:pathData="@string/left_arrow"/> 
  11. /vector> 

CPU動畫與這里提到的圖形變化示例之間,最主要的區別就體現在animator_left_right_arrow.xml文件當中。

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <set xmlns:android="http://schemas.android.com/apk/res/android"
  3.   
  4.     <objectAnimator 
  5.         android:duration="1000" 
  6.         android:propertyName="pathData" 
  7.         android:valueFrom="@string/left_arrow" 
  8.         android:valueTo="@string/right_arrow" 
  9.         android:valueType="pathType" 
  10.         android:repeatMode="reverse" 
  11.         android:repeatCount="-1"/> 
  12.   
  13. </set> 

大家可能已經注意到了,valueFrom與valueTo兩項屬性會引用左箭頭與右箭頭的path數據,valueType被設定為pathType而propertyName則被設定為pathData。當以上設定完成之后,該animator將明確如何將一組path數據轉化為另一組。當該animator結束之后,我們還需要利用新的animated-vector對象將VectorDrawable分配至objectAnimator。

  1.  <?xml version="1.0" encoding="utf-8"?> 
  2. <animated-vector xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     android:drawable="@drawable/vector_drawable_left_arrow"
  4.   
  5.     <target 
  6.         android:name="left_arrow" 
  7.         android:animation="@animator/animator_left_right_arrows" /> 
  8. </animated-vector> 

***,大家還需要將該動畫drawable分配至ImageView,而后在自己的Java代碼中開始運行。

  1.  <ImageView  
  2.     android:id="@+id/left_right_arrow"  
  3.     android:layout_width="64dp"  
  4.     android:layout_height="64dp"  
  5.     android:layout_below="@+id/cpu"  
  6.     android:src="@drawable/animated_arrow" />  
  7.  mArrowImageView = (ImageView) findViewById( R.id.left_right_arrow );  
  8. drawable = mArrowImageView.getDrawable();  
  9. if (drawable instanceof Animatable) {  
  10.     ((Animatable) drawable).start();  

總結
正如大家所見,VectorDrawable類非常易于使用而且允許開發者以自定義方式實現大量簡單的動畫效果。盡管VectorDrawable類目前只適用于運行有Android 5.0以及更高版本的設備,但隨著更多設備開始支持Lollipop及其后續Android版本,其必將發揮更為重要的作用。

責任編輯:chenqingxiang 來源: 51CTO
相關推薦

2015-09-09 09:12:28

ios矢量圖顏色

2021-03-22 10:05:03

算法可視化大數據

2024-03-04 00:06:00

位圖GIF矢量圖

2010-06-08 10:35:38

UML圖

2020-12-20 08:22:05

PythonCOVID-19全球擴散圖

2010-06-09 08:59:30

UML活動圖

2010-06-09 18:56:44

UML用例圖

2024-10-08 10:30:00

AI生成技術

2010-06-29 11:16:02

UML畫類圖

2013-09-09 15:29:50

設計師圖標集

2023-11-08 11:00:56

Graphite開源

2015-07-13 18:13:47

Xcode矢量圖像代碼片段

2010-07-12 11:36:32

UML活動圖

2013-07-23 14:07:13

矢量圖標設計師圖標集

2013-04-26 11:17:48

2012-03-18 19:52:47

Web設計

2013-04-26 10:26:08

2024-04-08 10:30:58

模型AI

2021-06-05 10:31:53

動態排序圖可視化

2024-08-20 16:44:15

人工智能大腦地圖
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕丁香5月 | 国产成人免费视频网站高清观看视频 | 毛片视频免费 | 成人国产精品色哟哟 | 蜜桃视频在线观看免费视频网站www | 手机av在线| 国产探花在线精品一区二区 | 亚洲成人播放器 | www.99热这里只有精品 | 天堂成人国产精品一区 | 在线视频一区二区三区 | 日韩在线免费视频 | 欧美激情啪啪 | 综合九九| 色综合色综合色综合 | 99久久精品免费视频 | 亚洲欧美成人影院 | 国产一区二区三区在线看 | 91网在线观看 | 91色视频在线观看 | 久久精品一区二区 | 国产美女高潮 | 久久久久久久久久久久久久av | 欧美在线一区二区三区四区 | 黑人巨大精品欧美一区二区免费 | 免费黄色日本 | 婷婷去俺也去 | 欧美极品在线观看 | 国产午夜一级 | 国产免费看 | 久久不卡| 国产一区二区在线免费视频 | 男人的天堂在线视频 | 99久久久久 | 欧美在线a | 99久久久国产精品 | 欧美日韩在线观看一区 | 国产精品99久久久久久www | av片免费| 国产精品免费一区二区 | 成人毛片视频免费 |