Material Design(三)動畫實現下

寫在前面的幾句話

<p>
上面一篇對Touch Feedback (觸摸反饋),Reveal Effect (揭露效果),Curved Motion (曲線運動),View State Changes (視圖狀態改變)動畫效果在5.0及5.0以下的實現效果進行了分析,這篇主要對于Animate View Drawables (可繪矢量動畫),Activity Transitions ( Activity 切換效果 )進行分析

一.Animate View Drawables (可繪矢量動畫)

可繪制矢量圖在拉伸時不會失真。AnimatedVectorDrawable類可以在可繪制矢量圖上面作用動畫。

通常需要在三個xml文件中定義可動的矢量圖:

一個矢量圖使用<vector>元素,放在res/drawable/下。

一個可動的矢量圖使用<animated-vector>元素,放在res/drawable/下。

一個或更多個動畫對象使用<objectAnimator>元素,放在res/anim/下。

可動矢量圖可以使用<group>和<path>元素。<group>元素定義一系列路徑或者子組,<path>元素定義可繪圖的路徑。

當你定義了一個想要作用動畫的矢量可繪制圖,使用android:name屬性給每個group和path指定一個唯一的名字,這樣你可以從動畫的定義中找到他們。

vector_smile.xml

<vector
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:height="200dp"
    android:width="200dp"
    android:viewportHeight="100"
    android:viewportWidth="100" >
    <path
        android:fillColor="#ff0"
        android:pathData=" M 50,50
    m -48,0
    a 48,48 0 1,0 96,0
    a 48,48 0 1,0 -96,0"/>
    <path
        android:fillColor="@android:color/black"
        android:pathData="M 35,40
    m -7,0
    a 7,7 0 1,0 14,0
    a 7,7 0 1,0 -14,0"/>
    <path
        android:fillColor="@android:color/black"
        android:pathData="M 65,40
    m -7,0
    a 7,7 0 1,0 14,0
    a 7,7 0 1,0 -14,0"/>
    <path
        android:name="mouth"
        android:strokeColor="@android:color/black"
        android:strokeWidth="4"
        android:strokeLineCap="round"
        android:pathData=" M 30,75
    Q 50,55 70,75"/>
</vector>

animatedvector_smile.xml

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

    <target
        android:animation="@anim/anim_smile"
        android:name="mouth"/>

</animated-vector>

anim_smile.xml

<objectAnimator
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="3000"
    android:propertyName="pathData"
    android:valueFrom="M 30,75
    Q 50,55 70,75"
    android:valueTo=" M 30,65
    Q 50,85 70,65"
    android:valueType="pathType"
    android:interpolator="@android:anim/accelerate_interpolator"/>

大家應該對pathData中的數字很感興趣把,

這里的其實是 SVG 標準指令,規則如下:

  • 代碼中的 M 表示 MoveTo; l 表示 LineTo;z` 表示收尾閉合

  • 矢量圖path從一個圖形到另一個,from 和 to 的路徑必須一致:相同數量的命令和相同數量的每個命令的參數

全部的指令使用一個字母表示,如 M,l

  • 指令中的逗號、空格符可以被省略,如 M 100 100 L 200 20 → M100 100L200 200

  • 連續使用的相同指令可以被省略,如M 100 200 L 200 100 L -100 -200 → M 100 200 L 200 100 -100 -200

  • 大寫指令代碼絕對坐標,小寫指令代碼相對坐標

  • Unicode U+0046 FULL STOP (“.”) 是唯一被允許的小數點。如數字 13,000.56 是不合法的

更多有關pathData語法的信息,請參閱SVG Path 的文檔參考。學好了PathData的語法,什么都能繪制的出來~!

圖1 5.0可繪矢量動畫效果

那么怎么在5.0版本以下實現相同的效果呢

其實SVG還是對Path的繪制,所以在5.0以下相同效果其實可以通過Canvas繪制出來

mPaint.setStyle(Paint.Style.FILL);
mPaint.setColor(Color.YELLOW);
canvas.drawCircle(centerX, centerY, radius, mPaint);

mPaint.setColor(Color.BLACK);
canvas.drawCircle(centerX - radius / 3, centerY - radius / 3, eyesradius, mPaint);
canvas.drawCircle(centerX + radius / 3, centerY - radius / 3, eyesradius, mPaint);

mPaint.setStrokeWidth(20);
mPaint.setStyle(Paint.Style.STROKE);
mPath.reset();
mPath.moveTo(centerX - radius / 2, centerY + radius / 2);
mPath.quadTo(centerX, controlY, centerX + radius / 2, centerY + radius / 2);
canvas.drawPath(mPath, mPaint);

if (isAnim){
    if (controlY < centerY + radius){
        controlY = controlY + 2;
        invalidate();
    }
}
圖2 5.0以下可繪矢量動畫效果

雖然和上面的效果不是一模一樣,但是完成的功能是一致的

二.Activity Transitions ( Activity 切換效果 )

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,556評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,463評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,778評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,218評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,436評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,969評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,795評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,993評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,229評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,687評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,990評論 2 374

推薦閱讀更多精彩內容