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

Android學習之動畫(1)

編輯:關於Android編程

Android中動畫分為三種,逐幀動畫,補間動畫,屬性動畫,這篇先總結逐幀動畫和補間動畫。

逐幀動畫

1, 是什麼

字面上理解,幀之間追逐,幀動畫是順序的播放一系列圖片,從而產生動畫的效果,是將一個完整的動畫拆分成一張張單獨的圖片,然後再將它們連貫起來進行播放,與動畫片的工作原理類似,。

2,怎麼樣

不靈活,大量使用圖片消耗資源,容易產生oom。

3, 怎麼用

首先在res目錄下的drawable文件夾編寫一個xml文件


//










oneshot屬性表示是否循環播放,值為true則只播放一次。

方法調用

//把定義好的動畫資源設置到imageview上,
imgView.setImageResource(R.drawable.icons);
//通過getDrawable()獲取到AnimationDrawable對象
AnimationDrawable animationDrawable = (AnimationDrawable) view.getDrawable();
//啟動動畫
animationDrawable.start();

停止動畫

animationDrawable.stop();

補間動畫

1, 是什麼

補間顧名思義,補充中間,就是只要知道動畫的初始值和結束值,中間的值系統會自動幫我們計算。

補間動畫也稱view動畫,只針對view,有移動動畫,縮放動畫,透明動畫,旋轉動畫四種。

2,怎麼樣

補間動畫基本可以滿足大多數的動畫效果,可是它只針對於view,而且只是改變view實現的效果,因此

具有局限性。

3,怎麼用

Java代碼方式使用

(1)移動動畫

移動動畫是通過TranslateAnimation類來實現的,有三個構造方法。常用的有兩個

構造方法一:

public TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta) {}

參數解釋
fromXDelta,toXDelta在源碼中的

*@param fromXDelta Change in X coordinate to apply at the start of the
animation
@param toXDelta Change in X coordinate to apply at the end of the
animation*

翻譯:fromXDelta 動畫起始時X軸坐標與原先位置的距離。toXDelta 動畫結束時應用在X軸坐標與原位置距離【翻譯有誤,大概意思是這樣】

fromYDelta,toYDelta與fromXDelta,toXDelta解釋相似。只是方向不同。單位均為像素。

使用如下:

TranslateAnimation translateAnimation = new TranslateAnimation(0f, 100f, 0f, 100f);

表示View移動100像素,fromXDelta與toXDeta的差如果大於0,則表示向右移動;差小與0,則表示向左移動。大右小左。Y同理,大下小上。

構造方法二:

public TranslateAnimation(int fromXType, float fromXValue, int toXType, float toXValue,
            int fromYType, float fromYValue, int toYType, float toYValue) {
    }

參數解釋

fromXType,toXType X方向移動類型,有三種類型:
Animation.ABSOLUTE:代表絕對像素
Animation.RELATIVE_TO_SELF:代表相對自身平移
Animation.RELATIVE_TO_PARENT:代表相對父View平移

fromXValue,toXValue X方向上移動的值,
當type為Animation.ABSOLUTE時,表示具體的像素值

當type為Animation.RELATIVE_TO_SELF或Animation.RELATIVE_TO_PARENT:這兩個值為比例值,取值范圍【0.0f,1.0f】

Y方向同理

使用如下:

TranslateAnimation translateAnimation = new TranslateAnimation(Animation.RELATIVE_TO_SELF,
                        0f, Animation.RELATIVE_TO_SELF,
                        0.5f, Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 0.5f);

具體使用

                 /**
                 * 方式二:java代碼方式
                 */
                TranslateAnimation translateAnimation = new            TranslateAnimation(
                        Animation.RELATIVE_TO_SELF,
                        0f, Animation.RELATIVE_TO_SELF,
                        0.5f, Animation.RELATIVE_TO_SELF, 0f,
                        Animation.RELATIVE_TO_SELF, 0.5f);
                translateAnimation.setDuration(3000);
                translateAnimation.setRepeatCount(Animation.INFINITE);
                translateAnimation.setRepeatMode(Animation.REVERSE);
                imageView.startAnimation(translateAnimation);

setDuration:整型值,設置動畫執行時間

setRepeatCount:整型值,設置重復次數,可以是具體次數也可以是Animation.INFINITE,表示無限循環

setRepeatMode:設置重復模式,需要和setRepeatCount一起使用,有兩種模式Animation.REVERSE:倒敘回放,Animation.RESTART:重新播放

(2)透明動畫
透明動畫是通過AlphaAnimation類實現的,有兩個構造方法,常用的有一個

 public AlphaAnimation(float fromAlpha, float toAlpha) {

    }

參數解釋

fromAlpha:起始透明度,float值,取值范圍【0.0~1.0】1.0f:表示完全不透明,0.0f:表示完全透明
toAlpha:結束值透明度,float值,取值范圍【0.0~1.0】1.0f:表示完全不透明,0.0f:表示完全透明

具體使用:、

AlphaAnimation alphaAnimation = new AlphaAnimation(1.0f, 0.2f);
                alphaAnimation.setDuration(3000);
                alphaAnimation.setRepeatCount(Animation.INFINITE);
                alphaAnimation.setRepeatMode(Animation.REVERSE);
                imageView.startAnimation(alphaAnimation);

相關設置與上相同。

(3)旋轉動畫

旋轉動畫是通過RotateAnimation類來實現的,有四個構造方法,常用的有三個

1,構造方法一:

public RotateAnimation(float fromDegrees, float toDegrees) {

    }

2,構造方法二:

  public RotateAnimation(float fromDegrees, float toDegrees, float pivotX, float pivotY) {

    }

3,構造方法三:

  public RotateAnimation(float fromDegrees, float toDegrees, int pivotXType, float pivotXValue,
            int pivotYType, float pivotYValue) {

    }

參數解釋

前面兩個參數都一樣為fromDegrees,toDegrees,分別表示起始時的角度,結束時的角度,pivotX,pivotY源碼解釋為
** @param
* pivotX The X coordinate of the point about which the object is
* being rotated, specified as an absolute number where 0 is the left
* edge.
* @param pivotY The Y coordinate of the point about which the object is
* being rotated, specified as an absolute number where 0 is the top
* edge.
/

翻譯

pivotX:被旋轉的對象的X軸坐標,指定為一個絕對的數值,其中0表示頂部邊緣。pivotY同理。(翻譯不太准確,大概意思是這樣)

pivotXType, float pivotXValue源碼解釋為:

** @param pivotXType Specifies how pivotXValue should be interpreted. One of
* Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF, or
* Animation.RELATIVE_TO_PARENT.
* @param pivotXValue The X coordinate of the point about which the object
* is being rotated, specified as an absolute number where 0 is the
* left edge. This value can either be an absolute number if
* pivotXType is ABSOLUTE, or a percentage (where 1.0 is 100%)
* otherwise.*

翻譯

pivotXType 指定pivotXValue 應該如何被定義, 值為Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF, 或Animation.RELATIVE_TO_PARENT之一。

pivotXValue 被旋轉的對象的X軸坐標,指定為一個絕對的數值,其中0表示頂部邊緣,如果pivotXType 是ABSOLUTE,值可以是一個絕對的數值,否則,是一個百分數或比例值(其中1.0是100%)【翻譯有誤,大概意思是這樣】

Y方向同理

具體使用,以第三種構造方法為例

RotateAnimation rotateAnimation = new RotateAnimation(0f, 360f,
                        Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
                rotateAnimation.setDuration(3000);
                rotateAnimation.setRepeatMode(Animation.REVERSE);
                rotateAnimation.setRepeatCount(Animation.INFINITE);
                imageView.startAnimation(rotateAnimation);

(4)縮放動畫
縮放動畫是通過ScaleAnimation類實現的,有四個構造方法,常用的有三個

構造方法一:

 public ScaleAnimation(float fromX, float toX, float fromY, float toY) {

    }

構造方法二

 public ScaleAnimation(float fromX, float toX, float fromY, float toY,
            float pivotX, float pivotY) {

    }

構造方法三:

 public ScaleAnimation(float fromX, float toX, float fromY, float toY,
            int pivotXType, float pivotXValue, int pivotYType, float pivotYValue) {

    }

參數解釋

前面四個參數相同,fromX,toX,fromY,toY,X軸方向源碼解釋為
* @param fromX Horizontal scaling factor to apply at the start of the
* animation
* @param toX Horizontal scaling factor to apply at the end of the animation
* @param fromY Vertical scaling factor to apply at the start of the
* animation
* @param toY Vertical scaling factor to apply at the end of the animation
翻譯

fromX 表示在動畫開始時應用的水平縮放因子,toX表示在動畫結束時應用的水平縮放因子。

fromY 表示動畫在開始時應用的垂直縮放因子,toY表示動畫在結束時應用的縮放因子。

pivotXType,pivotXValue,pivotYType,pivotYValue**與旋轉動畫解釋相同**。

具體使用,以構造方法二為例:

ScaleAnimation scaleAnimation = new ScaleAnimation(1.0f, 1.5f, 1.0f, 1.5f, 0.5f, 0.5f);
                scaleAnimation.setDuration(3000);
                scaleAnimation.setRepeatMode(Animation.REVERSE);
                scaleAnimation.setRepeatCount(Animation.INFINITE);
                imageView.startAnimation(scaleAnimation);

(5)復合動畫
復合動畫不是一種動畫的類型,而是一種動畫集合,組合了多種動畫,以達到酷炫的效果。復合動畫是通過AnimationSe類來實現的,有兩個構造方法,常用的有一個。

public AnimationSet(boolean shareInterpolator) {

    }

參數解釋

shareInterpolator在源碼中的解釋為
* @param shareInterpolator Pass true if all of the animations in this set
* should use the interpolator associated with this AnimationSet.
* Pass false if each animation should use its own interpolator.
翻譯:如果為true,表示這個集合中所有的動畫都應該使用這個集合動畫關聯的插值器。如果為false,表示每個動畫應該使用他們自己的插值器。【翻譯有誤,大概意思是這樣,雖然不影響語義,但這裡的pass不知道是什麼意思,看到的請告訴我一聲,謝謝。】

具體使用

 //創建復合動畫對象,參數:是否共享插值器
                AnimationSet animationSet = new AnimationSet(true);
                //設置動畫執行的時間
                animationSet.setDuration(3000);
                //設置重復模式
                animationSet.setRepeatMode(Animation.REVERSE);
                //設置勻速變化
                animationSet.setInterpolator(new LinearInterpolator());
                //旋轉動畫
                RotateAnimation rotateAnimation1 = new RotateAnimation(0.0f, 720f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
                //透明動畫
                AlphaAnimation alphaAnimation1=new AlphaAnimation(1.0f,0.3f);
                //縮放動畫
                ScaleAnimation scaleAnimation1=new ScaleAnimation(1.0f,0.5f,1.0f,0.5f);
                //設置動畫執行之前等待的時間
                scaleAnimation1.setStartOffset(3000);
                //把旋轉動畫添加進集合
                animationSet.addAnimation(rotateAnimation1);
                //把透明動畫添加進集合
                animationSet.addAnimation(alphaAnimation1);
                //把縮放動畫添加進集合
                animationSet.addAnimation(scaleAnimation1);
                //開啟view動畫
                imageView.startAnimation(animationSet);

解釋在注釋裡面

xml方式使用

(1)移動動畫

在res文件夾下新建anim文件夾,在文件夾中新建以translate為根節點的xml,然後設置相關屬性,如下




屬性與java代碼實現的一樣。

















在代碼中通過AnimationUtils的loadAnimation方法引用:

Animation animation = AnimationUtils.loadAnimation(this,         R.anim.translateanim);
imageView.startAnimation(animation);

其他動畫同理

(2)透明動畫

在anim中定義一個以alpha為根節點的xml,如下:




在代碼中通過AnimationUtils的loadAnimation方法引用:

 Animation animation2 = AnimationUtils.loadAnimation(this, R.anim.alphaanim);
imageView.startAnimation(animation2);

(3)旋轉動畫
在anim文件夾下新建以rotate為根節點的xml,如下



在代碼中通過AnimationUtils的loadAnimation方法引用:

 Animation animation1 = AnimationUtils.loadAnimation(this, R.anim.rotateanim);
 imageView.startAnimation(animation1);

(4)縮放動畫
在anim文件夾下定義以scale為根節點的xml,如下




在代碼中通過AnimationUtils的loadAnimation方法引用:

 Animation animation3 = AnimationUtils.loadAnimation(this, R.anim.scaleanim);
imageView.startAnimation(animation3);

(5)復合動畫
在anim文件夾下新建以set為根節點的xml如下



    
    
    

    

    
        
        

    
    
    


注意

set是個集合,裡面可以嵌套動畫,也可以嵌套set集合,集合裡面在寫動畫。

在代碼中通過AnimationUtils的loadAnimation方法引用:

 Animation animation = AnimationUtils.loadAnimation(this, R.anim.setanim);
 imageView.startAnimation(animation);

**

補充

**:
android:fillAfter 如果設置為true,控件動畫結束時,將保持動畫最後時的狀態
android:fillBefore 如果設置為true,控件動畫結束時,還原到開始動畫前的狀態

android:interpolator 設定插值器,指定動畫效果。

何為interpolator?源碼中這樣解釋:
/**
* An interpolator defines the rate of change of an animation. This allows
* the basic animation effects (alpha, scale, translate, rotate) to be
* accelerated, decelerated, repeated, etc.
*/
翻譯

插值器定義了動畫改變的速率,它允許基本的動畫效果(透明,縮放,位移,旋轉)加速,減速,重復,等等。

所以interpolator是一個改變動畫執行速率的東西,用來修飾動畫效果。
系統提供的插值器有那麼多,如圖:
這裡寫圖片描述
<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPjxjb2RlPjxjb2RlPjxjb2RlPjxjb2RlPjxjb2RlPjxjb2RlPjxjb2RlPjxjb2RlPjxjb2RlPjxjb2RlPjxjb2RlPjxjb2RlPjxjb2RlPjxjb2RlPrXa0rvW1qO6QWNjZWxlcmF0ZURlY2VsZXJhdGVJbnRlcnBvbGF0b3I8YnIgLz4NCjxpbWcgYWx0PQ=="這裡寫圖片描述" src="/uploadfile/Collfiles/20160930/20160930092317126.png" title="\" />

表示,在動畫開始與結束的地方速率改變比較慢,在中間的時候加速的插值器。

第二種:AccelerateInterpolator

這裡寫圖片描述

表示,在動畫開始的地方速率改變比較慢,然後開始加速
- 第三種:AnticipateInterpolator
這裡寫圖片描述

表示,開始的時候向後然後向前沖

第四種:AnticipateOvershootInterpolator
這裡寫圖片描述

表示,開始的時候向後然後向前沖到達目標值後返回最後的值

第五種:BounceInterpolator

這裡寫圖片描述

表示,在 動畫結束的時候彈起
- 第六種:CycleInterpolator

這裡寫圖片描述

表示,動畫循環播放特定的次數,速率改變沿著正弦曲線

第七種:DecelerateInterpolator

這裡寫圖片描述
表示,在動畫開始的地方快然後減慢
- 第八種:LinearInterpolator

這裡寫圖片描述

以常量速率改變
- 第九種:OvershootInterpolator

這裡寫圖片描述

表示,向前沖超過最大值再回到原來位置

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