Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android動畫學習筆記(一)

Android動畫學習筆記(一)

編輯:關於Android編程

前言: 關於Android中的動畫吧,從我一開始接觸Android的時候,就陸陸續續的接觸過,不得不說,動畫在Android應用中應用的還是很多的,熟悉掌握了動畫,也可以裝裝B,做出各種吊炸的效果,好吧,有的時候你覺得自己會的東西但是真正做起來的時候有感覺很吃力,這就說明你根本就沒有真正的了解它,寫這系列的博客也是為了復習一下Android動畫,鞏固一下自己所學的知識,還是一樣,大牛勿噴O(∩_∩)O~

我們會從先從很基礎的內容開始,然後慢慢到一些復雜的動畫,一起加油吧,騷年!!

Android中的動畫分為:補間動畫(平移、旋轉、縮放、透明度)、幀動畫、屬性動畫。

名稱 含義 補間動畫 補間動畫與逐幀動畫在本質上是不同的,逐幀動畫通過連續播放圖片來模擬動畫的效果,而補間動畫則是通過在兩個關鍵幀之間補充漸變的動畫效果來實現的。補間動畫的優點是可以節省空間。 幀動畫 通過播放一系列的圖片從而產生動畫效果,可以簡單的理解為圖片的切換動畫,很顯然,如果圖片多或者很大的話,就會導致OOM。 屬性動畫 屬性動畫是API11以後才有的一個動畫,(當然,我們後面也會用一個第三方的庫來兼容低版本)通過不斷的修改view的屬性,從而達到動畫的效果。

我們這節先來關注一下補間動畫:
補間動畫分為:透明度、平移、旋轉、縮放。

名稱 xml中標簽 對應的java類 表現形式 透明度 alpha AlphaAnimatino 改變view的透明度 平移 translate TranslateAnimation 平移view 旋轉 rotate RotateAnimation 旋轉view 縮放 scale ScaleAnimation 縮放view

補充一下:
在adt和as中,我們補間動畫的存放位置是res/anim中:
這裡寫圖片描述

從Animation類繼承的屬性

Animation類是所有動畫(scale、alpha、translate、rotate)的基類。
Animation中公用的屬性有:

android:duration 動畫持續時間,以毫秒為單位 android:fillAfter 如果設置為true,控件動畫結束時,將保持動畫最後時的狀態 android:fillBefore 如果設置為true,控件動畫結束時,還原到開始動畫前的狀態 android:fillEnabled 與android:fillBefore 效果相同,都是在動畫結束時,將控件還原到初始化狀態 android:repeatCount 重復次數 android:repeatMode 重復類型,有reverse和restart兩個值,reverse表示倒序回放,restart表示重新放一遍,必須與repeatCount一起使用才能看到效果。因為這裡的意義是重復的類型,即回放時的動作。 android:interpolator 設定插值器,其實就是指定的動作效果,比如物理中的需要做什麼運動(勻速直線運動、曲線運動),後面會單獨講的。 startOffset 延時多少時間後開始執行動畫。

一、透明度Scale
如果你的工程中沒有anim文件夾的話,自己創建一個哦,或者用as自動生成(在res目錄中右鍵–>Android resource File):
這裡寫圖片描述

ScaleAnimation中有兩個重要的屬性:

android:fromAlpha 動畫開始的透明度,從0.0 –1.0 ,0.0表示全透明,1.0表示完全不透明 android:toAlpha 動畫結束時的透明度,也是從0.0 –1.0 ,0.0表示全透明,1.0表示完全不透明

1、我們利用xml創建一個Scale動畫:



2、加載xml動畫:

AlphaAnimation alpha= (AlphaAnimation) AnimationUtils.loadAnimation(this,R.anim.anim_alpha1);

3、播放ScaleAnimation動畫:

tv_anim.startAnimation(alpha);

4、代碼很簡單,實現的效果是(透明度從0到1不斷的循環)我們看一下效果:

這裡寫圖片描述

效果是看到了,接著我們用代碼實現一下:
1、AlphaAnimation 的構造方法:

AlphaAnimation(Context context, AttributeSet attrs) 從本地XML加載動畫,基本不用 AlphaAnimation(float fromAlpha, float toAlpha)
/**
     * 透明度動畫測試
     * 
     * 
     */
    public void alpha(View view) {
        AlphaAnimation alpha = new AlphaAnimation(0, 1);
        alpha.setDuration(800);
        alpha.setRepeatCount(Animation.INFINITE);
        alpha.setRepeatMode(Animation.REVERSE);
        alpha.setInterpolator(new AccelerateDecelerateInterpolator());
        tv_anim.startAnimation(alpha);
    }

二、縮放Scale
從Animation類繼承的屬性

Animation類是所有動畫(scale、alpha、translate、rotate)的基類。
Animation中公用的屬性有:

android:duration 動畫持續時間,以毫秒為單位 android:fillAfter 如果設置為true,控件動畫結束時,將保持動畫最後時的狀態 android:fillBefore 如果設置為true,控件動畫結束時,還原到開始動畫前的狀態 android:fillEnabled 與android:fillBefore 效果相同,都是在動畫結束時,將控件還原到初始化狀態 android:repeatCount 重復次數 android:repeatMode 重復類型,有reverse和restart兩個值,reverse表示倒序回放,restart表示重新放一遍,必須與repeatCount一起使用才能看到效果。因為這裡的意義是重復的類型,即回放時的動作。 android:interpolator 設定插值器,其實就是指定的動作效果,比如物理中的需要做什麼運動(勻速直線運動、曲線運動),後面會單獨講的。 startOffset 延時多少時間後開始執行動畫。

實現效果:讓view在水平方向從自身(0-1.5)轉變,最後停留在自身1.5倍
這裡寫圖片描述
1、創建一個anim_scale.xml文件:


這裡有幾個重要的屬性:

android:fromXScale 起始的X方向上相對自身的縮放比例,浮點值,比如1.0代表自身無變化,0.5代表起始時縮小一倍,2.0代表放大一倍; android:toXScale 結尾的X方向上相對自身的縮放比例,浮點值; android:fromYScale 起始的Y方向上相對自身的縮放比例,浮點值, android:toYScale 結尾的Y方向上相對自身的縮放比例,浮點值; android:pivotX 縮放起點X軸坐標,可以是數值、百分數、百分數p 三種樣式,比如 50、50%、50%p,當為數值時,表示在當前View的左上角,即原點處加上50px,做為起始縮放點;如果是50%,表示在當前控件的左上角加上自己寬度的50%做為起始點;如果是50%p,那麼就是表示在當前的左上角加上父控件寬度的50%做為起始點x軸坐標。(具體意義,後面會舉例演示)

android:pivotY 縮放起點Y軸坐標,取值及意義跟android:pivotX一樣。

如果 android:pivotX=”50%” android:pivotY=”50%”不設置的話,默認從基點為控件的左上角。

下面用java代碼來實現下ScaleAnimation:

放到代碼中,ScaleAnimation有下面幾個構造函數:
- ScaleAnimation(Context context, AttributeSet attrs) 從XML文件加載動畫,基本用不到
- ScaleAnimation(float fromX, float toX, float fromY, float toY)
- ScaleAnimation(float fromX, float toX, float fromY, float toY, float pivotX, float pivotY)
- ScaleAnimation(float fromX, float toX, float fromY, float toY, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)

其中pivotXType為水平方向的基點類型,可以為:Animation.RELATIVE_TO_SELF相當於xml文件中的android:pivotX=“0%”、Animation.ABSOLUTE相當於android:pivotX=“0”、Animation.RELATIVE_TO_PARENT相當於android:pivotX=“0%p”.
這幾個屬性解釋起來有點不太好理解,Animation.RELATIVE_TO_SELF也就是相當於自己為基准,自己的50%就是控件的中間點位置,Animation.ABSOLUTE絕對位置的意思,比如設置成50,也就是控件左上角位置加上50,Animation.RELATIVE_TO_PARENT是相對於父控件的意思,如果為50%p,也就是從控件的左上角加上父控件50%的位置。

對應的java代碼:

 /**
     * 縮放動畫
     * 
     * 
     */
    public void scale(View view) {
        ScaleAnimation scale = new ScaleAnimation(0, 1.5f, 1, 1, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
        scale.setDuration(1000);
        scale.setFillAfter(true);
        tv_anim.startAnimation(scale);
    }

三、旋轉RotateAnimation
Rotate標簽所具有的XML屬性有:

android:fromDegrees 開始旋轉的角度位置,正值代表順時針方向度數,負值代碼逆時針方向度數 android:toDegrees 結束時旋轉到的角度位置,正值代表順時針方向度數,負值代碼逆時針方向度數 android:pivotX 縮放起點X軸坐標,可以是數值、百分數、百分數p 三種樣式,比如 50、50%、50%p,具體意義已在scale標簽中講述,這裡就不再重講 android:pivotY 縮放起點Y軸坐標,可以是數值、百分數、百分數p 三種樣式,比如 50、50%、50%p

對應的構造函數有:

RotateAnimation(Context context, AttributeSet attrs)  從本地XML文檔加載動畫,同樣,基本不用 RotateAnimation(float fromDegrees, float toDegrees) RotateAnimation(float fromDegrees, float toDegrees, float pivotX, float pivotY) RotateAnimation(float fromDegrees, float toDegrees, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)

RotateAnimation跟ScaleAnimation差不多,關鍵問題同樣是pivotXType和pivotYType的選擇,同樣有三個取值:Animation.ABSOLUTE、Animation.RELATIVE_TO_SELF和Animation.RELATIVE_TO_PARENT;

先看看要實現的效果(使view隨時針不停旋轉):
這裡寫圖片描述

對應的xml文件:



對應的java代碼:

/**
     * 旋轉動畫
     * 
     * 
     */
    public void rotate(View view) {
        RotateAnimation rotate = new RotateAnimation(40f, 760f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
        rotate.setDuration(2000);
        rotate.setRepeatCount(Animation.INFINITE);
        rotate.setRepeatMode(Animation.RESTART);
        rotate.setInterpolator(new LinearInterpolator());
        tv_anim.startAnimation(rotate);
    }

尼瑪!好晚了,寫一篇博客還真不是那麼好寫的哦,明天還要上班,今天就先到這裡吧,還有兩個沒講,沒關系,看到這裡接下來的translate跟set也就soeasy了,歡迎小伙伴們跟我一起學習,一起進步!我先給出demo的github鏈接了:https://github.com/913453448/AnDemo

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved