1. 程式人生 > >【Android 動畫】View Animation詳解(一)

【Android 動畫】View Animation詳解(一)

安卓平臺目前提供了兩大類動畫,在Android 3.0之前,一大類是View Animation,包括Tween animation(補間動畫),Frame animation(幀動畫),在android3.0中又引入了一個新的動畫系統:property animation,即屬性動畫。本篇文章主要介紹View Animation的基本使用方法與技巧,屬性動畫將在下一篇博文中介紹。

Tween動畫可以執行一系列簡單變換(位置,大小,旋轉,縮放和透明度)。所以,如果你有一個TextView物件,您可以移動,旋轉,淡入淡出,或縮小文字。如果它有一個背景影象,背景影象會隨著文字轉化,最後我們會實現一個這樣的效果,如下圖:

這裡寫圖片描述

一、Frame Animation詳解

1.幀動畫展示的其實就是多個圖片按順序播放所產生的動畫效果,我們一般情況下會在res/drawable/ filename.xml目錄建立動畫檔案,動畫檔案的格式如下:

<?xml version="1.0" encoding="utf-8"?>
<animation-list                       
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot=["true" | "false"] >
<item android:drawable="@[package:]drawable/drawable_resource_name" android:duration="integer" /> </animation-list>

animation-list作為根佈局包含了多個item,android:oneshot屬性代表如果你只想執行一次動畫,那麼返回true,否則的話迴圈執行,返回false。

每一個Item代表單個的動畫幀。必須是該動畫元素的子元素。android:drawable屬性代表該幀的圖片,android:duration則代表了持續的時間。

2.例項Demo

1.在res/anim/rocket.xml新建動畫檔案

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false">
    <item android:drawable="@drawable/rocket_thrust1" android:duration="200" />
    <item android:drawable="@drawable/rocket_thrust2" android:duration="200" />
    <item android:drawable="@drawable/rocket_thrust3" android:duration="200" />
</animation-list>

2.這個應用程式為使用該動畫檔案的元件設定動畫(作為一個背景),然後播放動畫:

ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image);
rocketImage.setBackgroundResource(R.drawable.rocket_thrust);

rocketAnimation = (AnimationDrawable) rocketImage.getBackground();
rocketAnimation.start();

3.執行效果

這裡寫圖片描述

一、Tween Animation詳解

Tween補間動畫主要包含平移,旋轉,縮放,漸變四種動畫效果,每種動畫都可以採用兩種方式來實現,一種就是程式碼直接實現,另一種就是建立xml動畫檔案的方式來實現,這四種動畫除了可以單一實現某一具體動畫之外,還可以配合使用,可以通過set標籤把各個動畫整合在一起,產生更多特效,下面通過一個XML動畫檔案來詳細解釋每種動畫中各個屬性所代表的含義以及注意事項。

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@[package:]anim/interpolator_resource"
    android:shareInterpolator=["true" | "false"] >
    <alpha
        android:fromAlpha="float"
        android:toAlpha="float" />
    <scale
        android:fromXScale="float"
        android:toXScale="float"
        android:fromYScale="float"
        android:toYScale="float"
        android:pivotX="float"
        android:pivotY="float" />
    <translate
        android:fromXDelta="float"
        android:toXDelta="float"
        android:fromYDelta="float"
        android:toYDelta="float" />
    <rotate
        android:fromDegrees="float"
        android:toDegrees="float"
        android:pivotX="float"
        android:pivotY="float" />
    <set>
        ...
    </set>
</set>
  • set標籤可以容納其他的動畫元素,把各個動畫放在一個組裡執行,程式碼中是通過AnimationSet來組織。

    • android:interpolator屬性為插補器,它定義一個動畫的變化率。這使得基本的動畫效果(alpha, scale, translate, rotate)得以加速,減速,重複等。
    • android:shareInterpolator屬性,如果在一個set標籤中包含多個動畫效果,如果想讓這些動畫效果共享一個Interpolator,則設定為true,如果不想共享一個interpolator,則設定android:shareInterpolator=”false”,並且需要在每一個單獨動畫效果處新增interpolator。
  • Alpha代表AlphaAnimation,表示一個淡入淡出動畫效果(其實就是透明度)。

    • android:fromAlpha表示透明度變化的開始值,其中0是透明,1是不透明的。
    • android:toAlpha表示透明度變化的結束值,其中0是透明,1是不透明的。
  • Scale代表ScaleAnimation,表示一個縮放動畫的效果,你可以通過指定的pivotX和pivoty使影象從它的中心點開始向外(或向內)縮放。例如,如果值是以0,0(左上角)為縮放點,所有的縮放(放大)效果將向下和向右。

    • android:fromXScale 動畫起始時 X座標上的伸縮尺寸

    • android:toXScale 動畫結束時 X座標上的伸縮尺寸

    • android:fromYScale 動畫起始時Y座標上的伸縮尺寸

    • android:toYScale 動畫結束時Y座標上的伸縮尺寸

    • int pivotXType 動畫在X軸相對於物件位置型別

    • float pivotXValue 動畫相對於物件的X座標的開始位置

    • int pivotYType 動畫在Y軸相對於物件位置型別

    • float pivotYValue 動畫相對於物件的Y座標的開始位置

  • Translate代表TranslateAnimation,表示一個平移的動畫效果。

    • float fromXDelta 動畫開始的點離當前View X座標上的差值

    • float toXDelta 動畫結束的點離當前View X座標上的差值

    • float fromYDelta 動畫開始的點離當前View Y座標上的差值

    • float toYDelta 動畫開始的點離當前View Y座標上的差值

  • Rotate代表RotateAnimation,表示一個旋轉的動畫效果。

    • float fromDegrees:旋轉的開始角度。

    • float toDegrees:旋轉的結束角度。

    • int pivotXType:X軸的伸縮模式,可以取值為ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT。

    • float pivotXValue:X座標的伸縮值。

    • int pivotYType:Y軸的伸縮模式,可以取值為ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT。

    • float pivotYValue:Y座標的伸縮值。

1.Alpha淡入淡出效果

1-1.程式碼實現

//透明度從透明到不透明(1----0)
AlphaAnimation alphaAnimation = new AlphaAnimation(1f, 0f);
//設定動畫執行時間
alphaAnimation.setDuration(1000);
//設定動畫結束後是否停留在動畫結束狀態
alphaAnimation.setFillAfter(false);
imageView.startAnimation(alphaAnimation);

1-2.實現效果

這裡寫圖片描述

2.通過xml動畫檔案來實現

  • 在res/anim目錄下新建alpha.xml檔案
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
    <alpha
        <!--設定動畫時間1秒,元件從透明到不透明
        動畫結束後恢復初始狀態-->
        android:duration="1000"
        android:fillAfter="false"
        android:fromAlpha="1.0"
        android:toAlpha="0.0" />
</set>
  • 使用該xml動畫檔案
Animation animation=AnimationUtils.loadAnimation(MainActivity.this, R.anim.alpha);
//開啟動畫
view.startAnimation(animation);

2.Scale縮放效果

2-1.程式碼實現

/**
* 設定縮放尺寸以當前控制元件的中心(0.5f)為基準縮放點   (ScaleAnimation.RELATIVE_TO_SELF),
* 縮放尺寸從1f到0f。
* x的縮放寬度為1f*自己的寬度--0f
* y的縮放高度為1f*自己的高度--0f
*/
ScaleAnimation scaleAnimation = new ScaleAnimation(1f, 0f, 1f, 0f, ScaleAnimation.RELATIVE_TO_SELF, 0.5f, ScaleAnimation.RELATIVE_TO_SELF, 0.5f);
//設定縮放時間為1秒
scaleAnimation.setDuration(1000);
//動畫完成恢復初始狀態
scaleAnimation.setFillAfter(false);
imageView.startAnimation(scaleAnimation);

2-2.實現效果

這裡寫圖片描述

2.通過xml動畫檔案來實現

  • 在res/anim目錄下新建scale.xml檔案
<?xml version="1.0" encoding="UTF-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
    <scale
        android:duration="1000"
        android:fromXScale="1.0"
        android:fromYScale="1.0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toXScale="0"
        android:toYScale="0"
        android:fillAfter="false"
        />
</set>
  • 使用該xml動畫檔案
Animation animation=AnimationUtils.loadAnimation(MainActivity.this, R.anim.scale);
//開啟動畫
view.startAnimation(animation);

3.Translate平移效果

3-1.程式碼實現

//設定從(0,0)到(0,-1.5f)以自身為基準平移
//x:0f * 移動元件的寬度 到 0f * 移動元件的寬度
//y:0f * 移動元件的高度 到 -1.5f * 移動元件的高度
TranslateAnimation animation = new TranslateAnimation(TranslateAnimation.RELATIVE_TO_SELF, 0f, TranslateAnimation.RELATIVE_TO_SELF, 0f, TranslateAnimation.RELATIVE_TO_SELF, 0f, TranslateAnimation.RELATIVE_TO_SELF, -1.5f);
        animation.setDuration(2000);// 設定動畫執行時間
        animation.setFillAfter(true);// 設定動畫執行結束後停留在結束位置
        imageView.startAnimation(animation);

3-2.實現效果

這裡寫圖片描述

2.通過xml動畫檔案來實現

  • 在res/anim目錄下新建translate.xml檔案
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
    <translate
        android:duration="2000"
        android:fromXDelta="0"
        android:fromYDelta="0"
        android:toXDelta="0"
        android:toYDelta="-150%"
        android:fillAfter="true"
        />
</set>
  • 使用該xml動畫檔案
Animation animation=AnimationUtils.loadAnimation(MainActivity.this, R.anim.translate);
//開啟動畫
view.startAnimation(animation);

4.Rotate旋轉效果

4-1.程式碼實現

//設定以自身中心為旋轉點,旋轉360度
RotateAnimation animation = new RotateAnimation(0, 360, RotateAnimation.RELATIVE_TO_SELF, 0.5f, RotateAnimation.RELATIVE_TO_SELF, 0.5f);
        animation.setFillAfter(true);
        animation.setDuration(1000);
        imageView.startAnimation(animation);

4-2.實現效果

這裡寫圖片描述

2.通過xml動畫檔案來實現

  • 在res/anim目錄下新建rotate.xml檔案
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
    <rotate
        android:duration="1000"
        android:fromDegrees="0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toDegrees="360"
        android:fillAfter="false"
        />
</set>
  • 使用該xml動畫檔案
Animation animation=AnimationUtils.loadAnimation(MainActivity.this, R.anim.rotate);
//開啟動畫
view.startAnimation(animation);

三、通過AnimationSet組合多個動畫

1.在anim目錄下新建set_anim.xml檔案

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
    <translate
        android:duration="1000"
        android:fromXDelta="0"
        android:fromYDelta="0"
        android:toXDelta="0"
        android:toYDelta="100%"
        android:fillAfter="true" />

    <rotate
        android:duration="1000"
        android:fromDegrees="0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toDegrees="360"
        android:repeatCount="3"
        android:fillAfter="true"
        android:startOffset="1000"
        />

    <scale
        android:duration="1000"
        android:fromXScale="1.0"
        android:fromYScale="1.0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toXScale="0"
        android:toYScale="0"
        android:startOffset="1000"
        android:fillAfter="true"
        />
</set>

2.使用

Animation animation=AnimationUtils.loadAnimation(MainActivity.this, R.anim.set_anim);
image.startAnimation(animation);

3.效果圖

這裡寫圖片描述

此處動畫的實現先是平移到底部,然後縮放的同時進行旋轉,android:startOffset屬性是代表在多少時間之後執行的意思,此處設定為1000毫秒,意思是1000毫秒後執行該動畫(即平移完成後執行)。

四、Activity淡入淡出動畫效果

主要是實現兩個activity切換效果,即點選第一個頁面平移淡入淡出第二個頁面,點選第二個頁面,平移淡入淡出,按照第一個進入的路線返回第一個頁面。

1.在res/anim目錄下新建activity_in_from_right.xml,頁面跳轉進入動畫檔案(即將跳轉的頁面進入動畫)

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
    <translate
        android:duration="1000"
        android:fromXDelta="100%p"
        android:toXDelta="0%p" />

    <alpha 
        android:fromAlpha="0"
        android:toAlpha="1"
        android:duration="1000"
        />
</set>

2.在res/anim目錄下新建activity_out_to_left.xml,頁面跳轉退出動畫檔案(當前頁面退出動畫)

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
    <translate
        android:duration="1000"
        android:fromXDelta="0%p"
        android:toXDelta="-100%p" />

      <alpha 
        android:fromAlpha="1"
        android:toAlpha="0"
        android:duration="1000"
        />
</set>

3.在res/anim目錄下新建activity_back_from_right.xml,返回時進入動畫檔案(即將跳轉的頁面進入動畫)

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
    <translate
        android:duration="1000"
        android:fromXDelta="-100%p"
        android:toXDelta="0%p" />
      <alpha 
        android:fromAlpha="0"
        android:toAlpha="1"
        android:duration="1000"
        />
</set>

4.在res/anim目錄下新建activity_back_to_left.xml,返回時退出動畫檔案(當前頁面退出動畫)

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
    <translate
        android:duration="1000"
        android:fromXDelta="0%p"
        android:toXDelta="100%p" />
      <alpha 
        android:fromAlpha="1"
        android:toAlpha="0"
        android:duration="1000"
        />
</set>

5.Activity切換動畫程式碼

  • 第一個activity—–第二個activity
Intent intent = new Intent();
                intent.setAction("android.intent.action.CHILDACTIVITY");
startActivity(intent);
//執行動畫           overridePendingTransition(R.anim.activity_in_from_right, R.anim.activity_out_to_left);
  • 第二個activity—–第一個activity(返回效果)
Intent intent = new Intent(ChildActivity.this,MainActivity.class);
startActivity(intent);
//執行動畫      overridePendingTransition(R.anim.activity_back_from_right, R.anim.activity_back_to_left);

6.效果如如下

這裡寫圖片描述

View Animation的基本使用方式大同小異,掌握了以上使用方法基本上就能夠實現基本的動畫效果,更復雜的效果請關注下一篇關於Android屬性動畫的博文。

相關推薦

Android 動畫View Animation

安卓平臺目前提供了兩大類動畫,在Android 3.0之前,一大類是View Animation,包括Tween animation(補間動畫),Frame animation(幀動畫),在android3.0中又引入了一個新的動畫系統:property ani

原創TextCNN原理

​   最近一直在研究textCNN演算法,準備寫一個系列,每週更新一篇,大致包括以下內容: TextCNN基本原理和優劣勢 TextCNN程式碼詳解(附Github連結) TextCNN模型實踐迭代經驗總結 TextCNN模型部署Tf-Serving實踐總結   今天主要講TextCNN的基本原理和優劣

Android 5.X 新特性——主題、Palette、陰影、著色和裁剪

Android 5.X 系列開始使用新的設計風格Material Design來統一整個Android系統的介面設計風格。 Material Design 主題 Material Design 現在有三種預設的主題可以設定,程式碼如下: @andr

Android程式設計之DialogFragment原始碼

DialogFragment是Fragment家族成員之一,如果你把它簡單的理解成Dialog,那就錯了。它的確可以做作dialog顯示,還可以顯示出自己定義的Dialog或者AlertDialog,但它同時也是一個Fragment。 按照官方的話來理解就是,你既可以把它當

Android測試之LogCat命令列

預備知識   首先還是先了解一下上節沒有提到的知識,我覺得還是比較重要的,就是log分類的幾種級別(prority):   v (verbose)  d (debug)   i  (information)   w (warning)   e (error)   這

Android測試Uiautomator——API

簡單的例子   以一個簡單的例子開始吧。我們完成一個 " 開啟QQ,進入QQ空間,然後退出 " 的case。   程式碼如下: package QQ;   import java.io.IOException;   impor

PHP基礎入門世界上最好用的編程語言

轉換成 c語言 127.0.0.1 mac const 讀取 成對 後臺 isset 簡介 ---------  PHP(超文本預處器)是一種通用開源腳本語言。語法吸收了C語言、Java和Perl的特點,利於學習,使用廣泛,主要適用於Web開發領域。PHP 獨

HAProxy:HAProxy介紹

監測 對比 內容交換 發送 持久連接 shadow 虛擬 font ros 一.高性能負載均衡軟件HAProxy介紹: 隨著互聯網業務的迅猛發展,大型電商平臺和門戶網站對系統的可用性和可靠性要求越來越高,高可用集群、負載均衡集群成為一種熱門的系統架構解決方

SpringBoot學習之路05.Springboot配置檔案

轉載宣告:商業轉載請聯絡作者獲得授權,非商業轉載請註明出處.原文來自 © 呆萌鍾【SpringBoot學習之路】05.Springboot配置檔案詳解(一)  配置檔案 Spring Boot使用一個全域性的配置檔案 applic

計算機網路:SMTP協議如何在控制檯發郵件

SMTP的連線和傳送過程 (a)建立TCP連線 (b)客戶端傳送HELO命令以標識發件人自己的身份,然後客戶端傳送MAIL命令; 伺服器端正希望以OK作為響應,表明準備接收 (c)客戶端傳送RCPT命令,以標識該電子郵件的計劃接收人,可以有多

Asp.Net MVC+EF+三層架構初見

前言: 這個專案是小編我進入公司開始全面重頭開始著手的第一個專案,在寶寶的IT生涯裡這是一個里程碑,有著與眾不同的意義。那麼在之後小編會從頭至尾的寫一組關於Asp.Net MVC+EF+三層架構框架

Animation 動畫——alpha、scale、translate、rotate、set的xml屬性及用法

Android的animation由四種類型組成:alpha、scale、translate、rotate,對應android官方文件地址:《Animation Resources》 1、XML配置檔案中 alpha 漸變透明度動畫效果 scale 漸變尺

Android 5.X 新特性——Material Design 動畫效果

Ripple效果 在Android 5.X 中,Material Design 大量使用了Ripple效果,即點選後的波紋效果。可以通過如下程式碼設定波紋的背景。 //有界波紋 android:background="?android:attr/sele

Android EventBus3.x 使用

led AC target 分解 感覺 div activit .org android事 ?(^∇^*) 五一假期在家無事,新項目中用的是RxJava2+EventBus感覺還不錯,趁這閑暇總結下EventBus 一、概要簡述   EventBus

Android Paging library

官方文件翻譯 文章目錄 1.概覽 1.1 庫架構 1.2 支援不同的資料架構 1.2.1 網路獲取或者資料庫 1.2.2 網路和資料庫同時獲取 1.2.3 處理網路錯誤 1.2.4 更新

Android Lifecycle

官方文件翻譯 使用生命週期感知元件處理生命週期 Lifecycle Event State LifecycleOwner 實現一個自定義的LifecycleOwner 生命週期感

Flutter 動畫

本文主要介紹了動畫的原理相關概念,對其他平臺的動畫做了一個簡要的梳理,並簡要的介紹了Flutter動畫的一些知識。 1. 動畫介紹 動畫對於App來說,非常的重要。很多App,正是因為有了動畫,所以才會覺得炫酷。移動端的動畫庫有非常的多,例如iOS上的Pop、web端的animate.css、Androi

Android 4.4 Graphic系統2 VSYNC的生成

VSYNC 的概念 VSYNC(Vertical Synchronization)是一個相當古老的概念,對於遊戲玩家,它有一個更加大名鼎鼎的中文名字—-垂直同步。 “垂直同步(vsync)”指的是顯示卡的輸出幀數和螢幕的垂直重新整理率相同,這完全是一個CRT顯

[Android]ToolBar使用——專案配置

private Toolbar mToolbar; private WebFragment mWebFragment; private long mBeforeTime; @Override protected void onCreate(Bundle savedInst

Android使用GPUImage實現濾鏡效果精煉

一、前期基礎知識詳解 “濾鏡通常用於相機鏡頭作為調色、新增效果之用。如UV鏡、偏振鏡、星光鏡、各種色彩濾光片。濾鏡也是繪圖軟體中用於製造特殊效果的工具統稱,以Photoshop為例,它擁有風格化、畫筆描邊、模糊、扭曲、銳化、視訊、素描、紋理、畫素化、渲染、藝術效果、其他