1. 程式人生 > >Android群英傳--動畫機制與技巧(二)

Android群英傳--動畫機制與技巧(二)

繼續上一篇的,總結一下最後的SVG向量動畫。

SVG向量動畫:

介紹:

向量動畫是Google在Android5.X中新增加的動畫型別。要了解這種動畫型別,首先我們來了解一下什麼是SVG。

什麼是SVG?
SVG 指可伸縮向量圖形 (Scalable Vector Graphics)
SVG 用來定義用於網路的基於向量的圖形
SVG 使用 XML 格式定義圖形
SVG 影象在放大或改變尺寸的情況下其圖形質量不會有所損失
SVG 是全球資訊網聯盟的標準
SVG 與諸如 DOM 和 XSL 之類的 W3C 標準是一個整體

那麼SVG有什麼優勢呢?

SVG 可被非常多的工具讀取和修改(比如記事本)
SVG 與 JPEG 和 GIF 影象比起來,尺寸更小,且可壓縮性更強。
SVG 是可伸縮的
SVG 影象可在任何的解析度下被高質量地列印
SVG 可在影象質量不下降的情況下被放大
SVG 影象中的文字是可選的,同時也是可搜尋的(很適合製作地圖)
SVG 可以與 Java 技術一起執行
SVG 是開放的標準
SVG 檔案是純粹的 XML

以上就是SVG的一些簡單介紹,可以看出,SVG可以很好的適應不同種螢幕解析度,因此可以很好的進行適配工作,減少了圖示的設計。

那麼SVG動畫就是使用SVG圖形做出的動畫效果。

SVG的基礎知識:

SVG使用<path>標籤來建立影象,我們可以在<path>標籤中使用SVG所支援的命令來進行圖形的繪製。

常用屬性:

  • fill:填充色

  • stroke:文字顏色或者是元素輪廓顏色

  • stroke-width:文字或元素輪廓厚度

  • transform:圖形變換

常用命令:

  • M=moveto(M X,Y):將畫筆移動到指定的座標位置,但是並不繪製

  • L=lineto(L X,Y):繪製直線到指定的座標位置

  • H=horizontal lineto(H X):繪製水平線到指定的X座標位置

  • V= vertical lineto(V Y):繪製垂直線到指定的Y座標位置

  • C= curveto(C X1,Y1,X2,Y2,ENDX,ENDY):三次貝賽爾曲線,第一控制點X,第一控制點Y 第二控制點X,第二控制點Y曲線結束點X,曲線結束點Y

  • S = smooth curveto(S X2,Y2,ENDX,ENDY):光滑曲線,第二控制點X,第二控制點Y 結束點X,結束點Y

  • Q = quadratic Belzier curve(Q X,Y,ENDX,ENDY) :二次貝塞爾曲線,控制點X,控制點Y 曲線結束點X,曲線結束點Y

  • T = smooth quadratic Belzier curveto(T ENDX,ENDY) :對映前面路徑後的終點X,對映前面路徑後的終點Y

  • A = elliptical Arc(A RX,RY,XROTATION,FLAG1,FLAG2,X,Y) :弧線,

    • RX,RY指所在橢圓的半軸大小

    • XROTATION指橢圓的X軸與水平方向順時針方向夾角

    • FLAG1只有兩個值,1表示大角度弧線,0為小角度弧線。

    • FLAG2只有兩個值,確定從起點至終點的方向,1為順時針,0為逆時針

    • X,Y為終點座標

  • Z = closepath() :關閉路徑

例項展示(一個螺旋):

效果圖

對應程式碼:

<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg width="100%" height="100%" version="1.1"
xmlns="http://www.w3.org/2000/svg">

<path d="M153 334
C153 334 151 334 151 334
C151 339 153 344 156 344
C164 344 171 339 171 334
C171 322 164 314 156 314
C142 314 131 322 131 334
C131 350 142 364 156 364
C175 364 191 350 191 334
C191 311 175 294 156 294
C131 294 111 311 111 334
C111 361 131 384 156 384
C186 384 211 361 211 334
C211 300 186 274 156 274"
style="fill:white;stroke:red;stroke-width:2"/>

</svg>

SVG在Android中的使用:

看了上邊的那個螺旋圖對應的程式碼是不是覺得畫一個SVG圖形很複雜?其實不用擔心,因為SVG的寫法固定,所以早已經有了很多優秀的SVG編輯器供我們使用,而不是自己計算每個點的值。

SVG編輯器:

VectorDrawable和AnimatedVectorDrawable:

Android中提供了這兩個API來進行SVG向量動畫的支援,其中VectorDrawable用於繪製xml檔案的靜態向量圖,而AnimatedVectorDrawable則用於將靜態的向量圖做成動畫,

VectorDrawable:
<?xml version="1.0" encoding="utf-8"?>
<vector
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="200dp"
    android:height="200dp"
    android:viewportWidth="100"
    android:viewportHeight="100">
    <!--width和height表示該SVG圖片實際的大小-->
    <!--viewportWidth和viewportHeight表示在該SVG圖片中圖形劃分的比例,在後邊圖形的繪製中的數值都是按比例來進行的-->
    <path
        android:strokeColor="@color/colorPrimary"
        android:strokeWidth="1"
        android:fillColor="@color/colorAccent"
        android:pathData="
                           M 25 50
                           a 25,25,0,1,0,50,0"
    />
    <group android:name="test"><!--可以用group來組合多個path路徑 -->
        <path android:strokeColor="@color/colorPrimaryDark"
            android:strokeWidth="2"
            android:pathData="
                             M 40 10
                             c 25,25,30,30,35,3"
            />
    </group>
</vector>
AnimatedVectorDrawable:

這個在AS2.2中需要放在animator資料夾下

<?xml version="1.0" encoding="utf-8"?>
<animated-vector
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/svg_drawable">

    <target
        android:animation="@anim/view_anim_rotate"
        android:name="test" />
    <!--其中name的名字要和使用的svg圖片中的需要作用的圖片名字一樣-->
    <!--animation是要使用的動畫效果-->
</animated-vector>

做完這兩步之後,就可以將SVG圖片作為背景放在imageView中,並在程式碼中控制動畫的啟動。


    <ImageView
        android:id="@+id/svg_img"
        android:onClick="svgAnima"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:src="@drawable/svg_drawable"/>

在程式碼中直接開啟動畫:

ImageView imageView;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_svg_anim);
        imageView = (ImageView) findViewById(R.id.svg_img);

    }

    public void svgAnima(View view){
        ((Animatable) imageView.getDrawable()).start();
    }

現在梳理一下使用SVG向量動畫的整體流程:

  1. 首先在xml檔案中畫出靜態的SVG圖形

  2. 然後在AnimatedVector將靜態的SVG圖形和要使用的動畫效果連線起來

  3. 在佈局檔案中使用SVG圖形作為圖片

  4. 在Java程式碼中需要使用動畫的地方獲取到SVG圖片,並開啟動畫

這樣一個SVG向量動畫就做出來了。

相關推薦

Android群英--動畫機制技巧

繼續上一篇的,總結一下最後的SVG向量動畫。 SVG向量動畫: 介紹: 向量動畫是Google在Android5.X中新增加的動畫型別。要了解這種動畫型別,首先我們來了解一下什麼是SVG。 什麼是SVG? SVG 指可伸縮

Android apk動態載入機制的研究 資源載入和activity生命週期管理

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

ArcGIS for Android 100.3的學習應用 如何移除指定的點和線?

在地圖上新增點和線的時候,我們有時候會遇到要移除或者切換指定的點和線的操作。那麼如何移除指定的點和線呢? ArcGIS的api裡點和線都是由GraphicsOverlay類來進行建立新增的。通過Graphic物件將點或者線的圖形物件(SimpleMarkerSymbol,SimpleLine

類載入機制反射

import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.lang.reflect.Method; import java.util.HashMa

Redis Sentinel 機制用法

轉載:https://segmentfault.com/a/1190000002685515 概述 Redis-Sentinel是Redis官方推薦的高可用性(HA)解決方案,當用Redis做Master-slave的高可用方案時,假如master宕機了,Redis

Redis Sentinel機制用法

clear monitor 拒絕 coff failure abstract trac 用法 XML from:https://my.oschina.net/dyyweb/blog/513680 摘要: Redis Sentinel機制與用法(一) Sentin

spring cloud實戰思考 微服務之間通過fiegn上多個文件1

jar 多文件 上傳文件 ret nmap spa 不同 port 問題 需求場景: 微服務之間調用接口一次性上傳多個文件。 上傳文件的同時附帶其他參數。 多個文件能有效的區分開,以便進行不同處理。   Spring cloud的微服務之間接口調用使用Feign。原裝的

Android自助餐】Handler訊息機制完全解析MessageQueue的佇列管理

Android自助餐Handler訊息機制完全解析(二)MessageQueue的佇列管理 Android自助餐Handler訊息機制完全解析二MessageQueue的佇列管理 新增到訊息佇列enqueueMessage 從佇

ArcGIS for Android 100.3的學習應用 實現地圖新增自定義指北針

圖為高德地圖實現指北針的效果,那麼ArcGIS如何實現呢? 實現方式: 新增地圖的旋轉監聽: map.addMapRotationChangedListener(new MapRotationChangedListener() { @Override

ArcGIS for Android 100.3的學習應用 如何繪製點和線?

平時工作中,我們接觸到的地圖類開發平臺有很多,最常用的有高德,百度,騰訊地圖。而且它們都有自己的開發者平臺和文件供我們使用。基本能滿足我們的業務需求。 由於公司裡的專案會涉及一些地圖資料統計和展示方面的需求,同時也會發布一些地圖服務,所以選擇了使用在地圖方面比較牛逼的ArcGIS。 把平時遇

ArcGIS for Android 的學習應用 如何移除指定的點和線?

在地圖上新增點和線的時候,我們有時候會遇到要移除或者切換指定的點和線的操作。那麼如何移除指定的點和線呢? ArcGIS的api裡點和線都是由GraphicsOverlay類來進行建立新增的。通過Graphic物件將點或者線的圖形物件(SimpleMarkerSy

Android java層音訊相關的分析理解音量控制相關

上一篇我們簡單地說了一下Android java層的基本框架。接下來我們就來聊一下在android中音量控制的相關內容。 1.音量定義 在Android中,音量的控制與流型別是密不可分的,每種流型別都獨立地擁有自己的音量設定,各種流型別的音量是互不干擾的,例如音樂音量、通話

Android開發中佈局元件—— padding margin 的區別

在 Android開發中我們會設定某個檢視相對於別的檢視的距離,這時我們就要用到 margin 和 padding ,但是有時候很容易把這兩個屬性弄混淆,那我們就看看他們的區別。 外邊距(margin): 屬於佈局引數,決定兩個元件之間的距離。作用於多個元件之間。 內邊距(

JVM類載入機制詳解類載入器雙親委派模型

1、通過一個類的全限定名(包名與類名)來獲取定義此類的二進位制位元組流(Class檔案)。而獲取的方式,可以通過jar包、war包、網路中獲取、JSP檔案生成等方式。 2、將這個位元組流所代表

Oracle 查詢技巧優化 多表查詢

前言 上一篇blog介紹了Oracle中的單表查詢和排序的相關技巧(http://blog.csdn.net/wlwlwlwl015/article/details/52083588),本篇blog繼續介紹查詢中用的最多的——多表查詢的技巧與優化方式,下面依舊

Android 開發藝術探索》讀書筆記——IPC 機制

Android 多程序開發我在平時開發中還沒有遇到,但不代表不重要,仍需要了解一下基本概念,Android 的序列化機制和 Binder 是。 1 Android IPC 簡介 IPC 是 Inter Process Communication 的縮寫,意為程序間通訊或跨程序通訊,是指兩

《Visual C++異常處理機制原理應用—— C/C++結構化異常處理之try-finally終止處理的使用原理

在上一篇文章中,我們其實只分析了終止型異常處理程式中正常的執行流程,這種情況的出現其實需要作如下假設: __try塊中的程式碼執行過程中不會引發異常 這部分程式碼不會試圖提前離開__try塊的作用範圍(如包含goto、break、continue、retur

Android音訊實時傳輸播放:服務端

我偷懶就用java寫了個簡單的伺服器,大家明白原理就好。 服務端共開放兩個埠,一個udp上行埠用來接收amr音訊流,另一個tcp下行埠用來發送amr音訊流。 我這裡寫的服務端實現了組播的功能,即一個人在錄音,可以同時讓很多人同時聽到。 簡而言之,服務端做的唯一一件

C# 之 FTP伺服器中檔案上下載

        通過上一篇部落格《C# 之 FTP伺服器中檔案上傳與下載(一)》,我們已經建立好了一個FTP伺服器,並且該伺服器需要使用者名稱和密碼的驗證。今天我們來實現檔案的上傳。 首先,我們前臺需要一個FileUpload控制元件和一個Button控制元件 <

android /linux休眠喚醒

1. 當所有wake_lock被釋放,自動進入休眠; 2. echo mem > /sys/power/state;(也需要等待wake_lock全部釋放才能進入suspend); 2.2. 休眠主要步驟 1. 凍結使用者態程序、核心執行緒; 2. 呼叫註冊的裝置的suspend回撥,其順序就是按照註