1. 程式人生 > >Android5.0新特性:全新的動畫

Android5.0新特性:全新的動畫

在Material Design設計中,為使用者與app互動反饋他們的動作行為和提供了視覺上的連貫性。Material主題為控制元件和Activity的過渡提供了一些預設的動畫,在android L上,允許自定義這些動畫:

  • Touch feedback 觸控反饋
  • Circular Reveal 圓形展示
  • Curved motion 曲線運動
  • View state changes 檢視狀態變化
  • Vector Drawables 向量圖動畫
  • Activity transitions 活動轉場

1. 觸控反饋

觸控反饋是指使用者在觸控控制元件時的一種視覺化互動,在Android L之前,通常是通過press色變來凸顯,但是因為是瞬間變化的效果,不如動畫生動。

在Android L使用了RippleDrawable類,用一個水波紋擴散效果在兩種不同的狀態間過渡。

使用Material Design樣式的應用,button預設帶有該效果。除了預設的效果外,系統還提供了另外兩種效果,我們只把button的背景指定為:

  • ?android:attr/selectableItemBackground` 用於有界Ripple動畫
  • ?android:attr/selectableItemBackgroundBorderless`用於越出檢視邊界的動畫。它會被繪製在最近的且不是全屏的父檢視上

Note:selectableItemBackgroundBorderless 是 API level 21 新加入的屬性

任何view處於可點選狀態,都可以使用RippleDrawable來達到水波紋特效。

我們也可以通過設定RippleDrawable的顏色屬性來調節動畫顏色,系統預設的顏色為主題的一個屬性顏色:android:colorControlHighlight,所以我們可以通過修改該顏色值來統一修改預設的水波紋顏色。android:colorAccent可以修改checkbox的選中顏色,更多顏色設定請參考主題。

系統的三種觸控反饋都是通過xml構建的,內容如下:
預設:

<ripplexmlns:android="http://schemas.android.com/apk/res/android
" android:color="?android:attr/colorControlHighlight">
<item> <inset android:insetLeft="4dp" android:insetTop="6dp" android:insetRight="4dp" android:insetBottom="6dp"> <shape android:shape="rectangle"> <corners android:radius="2dp"/> <solid android:color="?android:attr/colorButtonNormal"/> <padding android:left="8dp" android:top="4dp" android:right="8dp" android:bottom="4dp"/> </shape> </inset> </item> </ripple>

?android:attr/selectableItemBackground

<ripplexmlns:android="http://schemas.android.com/apk/res/android"
        android:color="?android:attr/colorControlHighlight">
    <item android:id="@android:id/mask">
        <color android:color="@android:color/white"/>
    </item>
</ripple>

?android:attr/selectableItemBackgroundBorderless

<ripple xmlns:android="http://schemas.android.com/apk/res/android"
        android:color="?android:attr/colorControlHighlight"/>

程式碼設定

RippleDrawableColorStateList stateList      = getResources().getColorStateList(R.color.tint_state_color);
RippleDrawable  rippleDrawable = new RippleDrawable(stateList,null,null);
view.setBackground(rippleDrawable);

2. 圓形展示

我們通常會顯示或者隱藏一個view,在Android L之前,這是一個生硬瞬間變化動作,現在,有了一個新的api為此效果提供一個圓形的顯示或者隱藏的動畫效果。

RevealAnimator和之前的動畫使用沒什麼區別,同樣可以設定監聽器和加速器來實現各種各樣的特效,該動畫主要用在隱藏或者顯示一個view,改變view的大小等過渡效果。

通過ViewAnimationUtils.createCircularReveal來建立一個動畫,該api接受5個引數

  • view :操作的檢視
  • centerX: 動畫開始的中心點X
  • centerY :動畫開始的中心點Y
  • startRadius: 動畫開始半徑
  • startRadius :動畫結束半徑

沿著中心的縮小的動畫

Animatoranimator = ViewAnimationUtils.createCircularReveal(
        view, //操作的檢視
        view.getWidth() / 2,//動畫開始的中心點X
        view.getHeight() / 2,//動畫開始的中心點Y
        view.getWidth(),//動畫開始半徑
        0 //動畫結束半徑
);
animator.setInterpolator(newLinearInterpolator());
animator.setDuration(1000);
animator.start();

從左上角擴充套件的圓形動畫

Animatoranimator = ViewAnimationUtils.createCircularReveal(
        view,0,0,0,(float) Math.hypot(view.getWidth(), view.getHeight()));
animator.setDuration(1000);
animator.start();

3. 曲線運動

曲線動畫在Android L之前我們可以通過繼承位移動畫過載applyTransformation函式來實現運動軌跡演算法,但是操作起來比較繁瑣:

通過繼承位移動畫,來改寫applyTransformation來修改位移的軌跡

public classArcTranslateAnimationextendsAnimation {
    private float mFromXValue,mToXValue,mFromYValue,mToYValue;
    private float mFromXDelta,mToXDelta,mFromYDelta,mToYDelta;
    private PointF mStart,mControl,mEnd;
    public ArcTranslateAnimation(floatfromXValue, floattoXValue, floatfromYValue, floattoYValue) {
        mFromXValue = fromXValue;
        mToXValue = toXValue;
        mFromYValue = fromYValue;
        mToYValue = toYValue;
    }
    protected void applyTransformation(floatinterpolatedTime,Transformationt) {
        float dx =calcBezier(interpolatedTime,mStart.x,mControl.x,mEnd.x);
        float dy =calcBezier(interpolatedTime,mStart.y,mControl.y,mEnd.y);
        t.getMatrix().setTranslate(dx,dy);
    }
    public void initialize(intwidth, intheight, intparentWidth, intparentHeight) {
        super.initialize(width,height,parentWidth,parentHeight);
        mFromXDelta = resolveSize(ABSOLUTE,mFromXValue,width,parentWidth);
        mToXDelta = resolveSize(ABSOLUTE,mToXValue,width, parentWidth);
        mFromYDelta = resolveSize(ABSOLUTE,mFromYValue,height,parentHeight);
        mToYDelta = resolveSize(ABSOLUTE,mToYValue,height, parentHeight);
        mStart =newPointF(mFromXDelta,mFromYDelta);
        mEnd =newPointF(mToXDelta,mToYDelta);
        mControl =newPointF(mFromXDelta,mToYDelta);
    }
    private long calcBezier(floatinterpolatedTime, floatp0, floatp1, float p2) {
        return Math.round((Math.pow((1- interpolatedTime),2) * p0)
                + (2 * (1-interpolatedTime) * interpolatedTime * p1) +
                (Math.pow(interpolatedTime,2) * p2);
    }
}

現在我們有了更簡單的實現方式。

ObjectAnimator新增了path方式來構建動畫,並且可以同時對x,y兩個屬性做動畫,我們只用指定一個曲線的path,即可作出曲線的動畫,可以用quadTo/cubicTo繪製貝塞爾曲線,也可以使用arcTo繪製普通的弧線

新增了PathInterpolator動畫插入器,新的基於貝塞爾曲線或路徑物件的插入器。這個插入器指定了一個1x1正方形運動曲線,它使用(0,0)為錨點,(1,1)為控制點,作為建構函式的引數。
檢視狀態變化

Android L在原有的圖片選擇器和顏色選擇器上進行了增強,不僅是控制元件能根據不同的狀態顯示不同的背景圖片,還能在兩種狀態切換時指定一個動畫,來增加過渡效果,吸引使用者眼球,以突出重點內容。

StateListAnimator類和圖片選擇器,顏色選擇器類似,可以根據view的狀態改變呈現不同的動畫效果,通過xml我們可以構建對應不同狀態的動畫合集,其使用方式也非常簡單,在對應的狀態指定一個屬性動畫即可:

<selectorxmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true">
        <set>
            <objectAnimator android:propertyName="translationZ"
                            android:duration="200"
                            android:valueTo="20dp"
                            android:valueType="floatType"/>
        </set>
    </item>
    <item android:state_enabled="true"android:state_pressed="false">
        <set>
            <objectAnimator android:propertyName="translationZ"
                            android:duration="200"
                            android:valueTo="0"
                            android:valueType="floatType"/>
        </set>
    </item>
</selector>

在xml中通過android:stateListAnimator來指定狀態動畫,程式碼中可以通過AnimationInflater.loadStateListAnimator()載入動畫,並使用view.setStateListAnimator()將其指定給View。

可以在狀態切換的過程指定多個屬性動畫的合集,繼承了Material主題後,按鈕預設擁有了z屬性動畫。如果想取消這種預設狀態,可以把狀態動畫指定為null。

除了StateListAnimator類指定狀態切換的屬性動畫外,還可以通過AnimatedStateListDrawable來指定狀態切換的幀動畫:

<animated-selectorxmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/pressed"android:drawable="@drawable/btn_check_15"
          android:state_pressed="true"/>
    <item android:id="@+id/normal" android:drawable="@drawable/btn_check_0"/>
    <transition android:fromId="@+id/normal"android:toId="@+id/pressed">
        <animation-list>
            <item android:duration="20"android:drawable="@drawable/btn_check_0"/>
            <item android:duration="20"android:drawable="@drawable/btn_check_1"/>
            <item android:duration="20"android:drawable="@drawable/btn_check_2"/>
        </animation-list>
    </transition>
</animated-selector>

4. 向量圖動畫

前面我們學習了向量圖,AnimatedVectorDrawable類讓你能使一個向量圖動起來。向量圖動畫比幀動畫更平滑的展現圖片的變化過程,並且無論在記憶體佔用,還是包體積佔用上都要優於幀動畫。通常定義一個向量圖動畫需要三步:

在drawable資源目錄下定義一個向量圖

<vectorxmlns:android="http://schemas.android.com/apk/res/android"
        android:height="64dp"
        android:width="64dp"
        android:viewportHeight="600"
        android:viewportWidth="600">
    <group
        android:name="rotationGroup"
        android:pivotX="300.0"
        android:pivotY="300.0"
        android:rotation="45.0">
        <path
            android:name="v"
            android:fillColor="#000000"
            android:pathData="M300,70 l0,-70 70,70 0,0 -70,70z"/>
    </group>
</vector>

在anim下頂一個objectAnimator,並在動畫中修改向量圖的path

<setxmlns:android="http://schemas.android.com/apk/res/android">
    <objectAnimator
        android:duration="3000"
        android:propertyName="pathData"
        android:valueFrom="M300,70 l0,-70 70,70 0,0 -70,70z"
        android:valueTo="M300,70 l0,-70 70,0  0,140 -70,0z"
        android:valueType="pathType"/>
</set>

在drawable下定義一個animated-vector,並把drawable指向向量圖,把target中的動畫指定為之前定義的objectAnimator

<animated-vectorxmlns:android="http://schemas.android.com/apk/res/android"
                 android:drawable="@drawable/vector_drawable">
    <target
        android:name="v"
        android:animation="@anim/vector_anim"/>
</animated-vector>

5. Transition轉場動畫

Transition

Android KitKat 4.4.2 (API 19) 開始的 Transitions 功能讓開發者無需學習動畫就可以輕鬆實現 layout 切換時的動畫效果,為使用者帶來更豐富的體驗。現在 Android Support Library 24.2.0 (新增的 android.support.transition 包)又將這一功能帶到了所有 Android 4.0 ICS(API 14) 及以上系統

在Android L之前,我們可以在startActivity之後呼叫overridePendingTransition來指定Activity的轉場動畫。現在Android L給我們帶來了更絢麗的轉場動畫。

新的轉場動畫分為兩大類,一種是普通的過渡動畫,另一種是共享元素的過渡動畫。

要想使用新的轉場動畫,可以繼承Material Design主題後在style風格中指定:

<stylename="DefaultTheme"parent="android:Theme.Material">
    <!-- 允許使用transitions -->
    <item name="android:windowContentTransitions">true</item>
    <!-- 指定進入、退出、返回、重新進入時的transitions -->
    <item name="android:windowEnterTransition">@transition/explode</item>
    <item name="android:windowExitTransition">@transition/explode</item>
    <item name="android:windowReturnTransition">@transition/explode</item>
    <item name="android:windowReenterTransition">@transition/explode</item>
    <!-- 指定進入、退出、返回、重新進入時的共享transitions -->
    <item name="android:windowSharedElementEnterTransition">@transition/change</item>
    <item name="android:windowSharedElementExitTransition">@transition/change</item>
    <item name="android:windowSharedElementReturnTransition">@transition/change</item>
    <item name="android:windowSharedElementReenterTransition">@transition/change</item>
</style>

也可以在activity的oncreate方法中進行程式碼設定:

// 允許使用transitions
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
// 指定進入、退出、返回、重新進入時的transitions
getWindow().setEnterTransition(new Explode());
getWindow().setExitTransition(new Explode());
getWindow().setReturnTransition(new Explode());
getWindow().setReenterTransition(new Explode());
// 指定進入、退出、返回、重新進入時的共享transitions
getWindow().setSharedElementEnterTransition(new ChangeTransform());
getWindow().setSharedElementExitTransition(new ChangeTransform());
getWindow().setSharedElementReturnTransition(new ChangeTransform());
getWindow().setSharedElementReenterTransition(new ChangeTransform());

5.1 普通轉場動畫

所有繼承自visibility類都可以作為進入、退出的過度動畫。如果我們想自定義進入和退出時的動畫效果,只需要繼承Visibility,過載onAppear()和onDisappear()方法來定義進入喝退出的動畫。系統提供了三種預設方式:

Transition 說明
Explode 爆炸效果,從螢幕中心移入或移出檢視
Slide 滑動效果,從螢幕邊緣移入或移出檢視
Fade 談入談出效果,改變檢視的透明度

想在xml中指定自定義的進入、退出的過度動畫需要先對動畫進行定義:

<transitionclass="my.app.transition.CustomTransition"/>

注意:其中CustomTransition是你自定義的動畫,它必須繼承自Visibility。

想以普通轉場動畫的方式啟動一個Activity,必須在startActivity函式中傳遞一個ActivityOptions的Bundle物件:

ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(activity);
startActivity(intent,options.toBundle());

如果想讓返回也具備轉場效果,那麼在返回的Activity中不要再呼叫finish()函式,而是應該使用finishAfterTransition()來結束一個Activity,該函式會等待動畫執行完畢才結束該Activity

要儘早開始入場切換,可以在被呼叫的Activity上使用Window.setAllowEnterTransitionOverlap() ,它可以使你擁有更戲劇性的入場切換

5.2 共享轉場動畫

當兩個Activity具備某些相遇的元素時,共享轉場動畫將是一個非常好的選擇。使用轉場動畫需要將相同的元素通過android:transitionName或者view.setTransitionName()設定為相同的名稱,這樣系統才能區分出相同的元素。

共享轉場動畫支援以下共享元素:

Transition 說明
ChangeBounds 對目標檢視的大小進行動畫
ChangeClipBounds 對目標檢視的剪裁大小進行動畫
ChangeTransform 對目標檢視進行縮放、旋轉、位移動畫
ChangeImageTransform 對目標圖片進行縮放

通過下面的函式啟動一個共享元素動畫:

ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(activity,view, "name");
startActivity(intent,options.toBundle());

如果有多個共享元素,則可以通過Pair進行包裝處理:

ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(activity,Pair.create(view1,"name1"),Pair.create(view2,"name2"));
startActivity(intent,.toBundle());

返回時如果需要具備轉場動畫,那麼也需要用finish()函式替代finishAfterTransition()來結束一個Activity。

共享轉場動畫通常可以根據指定的元素判斷出合適的轉場動畫效果,不需要我們做額外的處理,也可以通過之前學習的方法進行指定共享元素轉場動畫效果。

5.3 組合轉場動畫

我們可以把多個轉場動畫進行組合,作出更具個性的轉場效果,在資原始檔中通過以下方式:

<transitionSetxmlns:android="http://schemas.android.com/apk/res/android">
    <explode/>
    <transition class="my.app.transition.CustomTransition"/>
    <<changeImageTransform/>
</transitionSet>

程式碼中我們可以通過TransitionSet類組合多個轉場動畫:

TransitionSet transitionSet = new TransitionSet();
transitionSet.addTransition(new Fade());
transitionSet.addTransition(newChangeBounds());

組合可以同時針對普通轉場動畫和共享元素轉場動畫。

轉場動畫也可以像普通動畫一樣設定持續時間,延期執行時間,速率插入器,以及動畫的監聽等。

轉場動畫通常是對整個佈局起作用,如果我們想對某個特定的view實施轉場動畫,可以把該view設定為轉場動畫的target,這樣轉場動畫將只對特定的view起作用。共享元素的動畫的target需要指定為transitionName

相關推薦

Android5.0特性全新動畫

在Material Design設計中,為使用者與app互動反饋他們的動作行為和提供了視覺上的連貫性。Material主題為控制元件和Activity的過渡提供了一些預設的動畫,在android L上,允許自定義這些動畫: Touch feedback

Android5.0特性Toolbar標題欄

package com.example.star.toolbar.activity; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.Too

C# 7.0 特性本地方法

性能 erro 區別 visual html 修飾 之間 style ria C# 7.0:本地方法 VS 2017 的 C# 7.0 中引入了本地方法,本地方法是一種語法糖,允許我們在方法內定義本地方法。更加類似於函數式語言,但是,本質上還是基於面向對象實現的。 1.

MySQL8.0 特性Partial Update of LOB Column

sql摘要: MySQL8.0對json進行了比較完善的支持, 我們知道json具有比較特殊的存儲格式,通常存在多個key value鍵值對,對於類似更新操作通常不會更新整個json列,而是某些鍵值。 對於某些復雜的應用,json列的數據可能會變的非常龐大,這時候一個突出的問題是:innodb並不識別json

2-0 Spring Boot 2.0 特性基礎設施變化

轉載至微信公眾號  SpringForAll社群 ※ Spring Boot 變化 最低 Java 8 釋出一個新的主要版本給了 Spring 團隊有機會重新編譯基於 Java 8 的程式碼庫並使用其新功能。因此,Spring Boot 2.0 需要 Java 8

android 8.0 特性通知渠道

  由於Google的限制,要求在2018年10月之前 targetSdkVersion 必須在26以上,更改過之後發現在androd 8手機上不再推送通知,檢視android 8.0官方文件發現,添加了通知渠道新特性,並要求targetSdkVersion 26以上的and

MySQL8.0特性增加系統檔案追蹤space ID和物理檔案的對映

點選有驚喜 Note1: 本文所有程式碼相關的內容都是基於MySQL8.0.3,而目前版本還處於RC和快速開發的狀態,不排除後面的版本邏輯,函式名等發生變化。 Note2: 主要程式碼在這個commit 中,感興趣的也可以自行閱讀程式碼 Note3: 本文僅是本人的閱

深入解讀MySQL8.0 特性 Crash Safe DDL

行操作 鏈接 釋放內存 inno utf 存儲過程 恢復 不可 刪除索引   前言    在MySQL8.0之前的版本中,由於架構的原因,mysql在server層使用統一的frm文件來存儲表元數據信息,這個信息能夠被不同的存儲引擎識別。而實際上innodb本身也存儲有元數

http系列--HTTP2.0特性二進位制傳輸,多路複用,Haeder壓縮,服務端push,QUIC協議

一、前言 HTTP 2.0 相比於 HTTP 1.X,可以說是大幅度提高了 web 的效能。   在 HTTP 1.X 中,為了效能考慮,我們會引入雪碧圖、將小圖內聯、使用多個域名等等的方式。這一切都是因為瀏覽器限制了同一個域名下的請求數量,當頁面中需要請求很多資源的時候,隊頭阻塞(Head

(六)Unity5.0特性------動畫功能

節點 拖動 eve 定義 -a ret del trees nts ??unity 5.0 中的新動畫功能這裏是你能夠期待的新動畫功能高速概述 !State Machine Behaviours狀態機行為在Unity 5 中,你會能夠將StateMachineBehavi

Android5.0 6.0 7.0 8.0 9.0 特性總結

**5.0** Material Design 支援多種裝置 全新通知中心 支援 64 位 ART 虛擬機器 電池續航改進 全新“最近應用程式” 安全性改進 不同資料獨立儲存 改進搜尋 支援藍芽 4.1、USB Audio

Spring Boot 2.0 特性(一)配置繫結 2.0 全解析

在Spring Boot 2.0中推出了Relaxed Binding 2.0,對原有的屬性繫結功能做了非常多的改進以幫助我們更容易的在Spring應用中載入和讀取配置資訊。下面本文就來說說Spring Boot 2.0中對配置的改進。 配置檔案繫結 簡單型別 在S

C# 7.0 特性(2) 本地方法

本文參考Roslyn專案中的Issue:#259. 簡而言之,【本地方法】就是在方法體內部定義一個方法。 其實咋眼一看,這個新特新並沒有什麼新意,因為目前大量C#的專案中,都可以使用delegate或基於delegate變形的各種方案(lambda, Fun,

C# 7.0 特性(1) 基於Tuple的“多”返回值方法

本文基於Roslyn專案中的Issue:#347 展開討論. 回顧 首先,提出一個問題,C#中,如何使一個方法可返回”多個”返回值? 我們先來回顧一下C#6.0 及更早版本的做法。 在C#中,通常我們有以下4種方式使一個方法返回多條資料。 使用 KeyVal

Android5.0,6.0,7.0,8.0特性整理

背景 Android5.0(Android Lollipop)是谷歌公司2014年10月釋出的全新安卓系統,至今已經兩年多。然而由於國產手機對安卓ROM的深度定製或修改,以及手機廠商、晶片製造商、運營商之間錯綜複雜的關係,我們更新最新安卓版本往往需要1年左右時間的等待。

Android5.0,6.0,7.0特性整理

背景 Android5.0(Android Lollipop)是谷歌公司2014年10月釋出的全新安卓系統,至今已經兩年多。然而由於國產手機對安卓ROM的深度定製或修改,以及手機廠商、晶片製造商、運營商之間錯綜複雜的關係,我們更新最新安卓版本往往需要1年左右時

Spring Boot 2(一)Spring Boot 2.0特性

方案 oauth 2.0 hiberna 浪費 快的 ali 升級 log security Spring Boot 2(一):Spring Boot 2.0新特性 Spring Boot依賴於Spring,而Spring Cloud又依賴於Spring Boot,因此Sp

講課Webflux響應式程式設計(SpringBoot 2.0特性

學習webflux前需要學習三個基礎: 函數語言程式設計和lambda表示式 Stream流程式設計 Reactive stream 響應式流 接下來進入學習 一、函數語言程式設計和lambda表示式 1. 什麼是函數語言程式設計 函數語言程式設計是

MySQL8.0.16特性The Communication Protocol In Group Replication

MGR優雅升級到MySQL8.0.16   傳統的升級手段之一,5.7 MGR叢集與8.0 MGR叢集進行資料傳輸,程式切換新集群后測試是否正常,如果不正常,要麼將新叢集的新增資料同步回舊叢集,要麼就捨棄掉這部分資料,一般看來這種回滾都是繁瑣的,繁瑣的操作一般都會相應的增加風險。     8.

Streams深入理解Redis5.0特性

概述 相較於Redis4.0,Redis5.0增加了很多新的特性,而streams是其中最重要的特性之一。streams是redis 的一種基本資料結構,它是一個新的強大的支援多播的可持久化的訊息佇列,在設計上借鑑了kafaka。streams的資料型別本身非常簡單,有點類似於hash結構,但是它的額外特性異