Android動畫——Animation

在Android中,有兩類動畫,分別是Tween (補間動畫)和Frame (幀動畫)。

Tween補間動畫提供了四種動畫形式,分別是AlphaAnimation(漸變動畫),RotateAnimation(旋轉(zhuǎn)動畫),ScaleAnimation(尺寸動畫)、TranslateAnimation(位移動畫),它們可以隨意進行組合,組合成動組合動畫AnimationSet。對于幀動畫比較好理解,類似動畫片的原理 ,一張張圖片按照某種規(guī)則進行排序,然后按照一定速度切換,由于人眼的視覺暫留特性就會在大腦中形成連貫的動畫畫面了,電影院中的電影就是這種形式的動畫。

AlphaAnimation? 繼承自?Animation類,常用構(gòu)造方法是

AlphaAnimation(float fromAlpha , float toAlpha)

需要傳入兩個參數(shù),一個是起始透明度值,第二個是結(jié)束透明度值,取值一般在 0 ~ 1?之間。每一種補間動畫都可以通過兩種方式實現(xiàn),一種?是引入 xml?文件實現(xiàn) 。

通過代碼實現(xiàn)?

AlphaAnimation alphaAnimation = new Animation(0,1);//初始操作,參數(shù)傳入0和1,即透明度由0變成透明度1

img.startAnimation(alphaANimation);//開始動畫

alphaAnimation.setFillAflter(true);//結(jié)束后保持狀態(tài)

alphaAnimation.setDuration(2000);//動畫持續(xù)時間,單位是毫秒

這里涉及了幾個方法,

1、startAnimation?方法:控件調(diào)用該方法,傳入一個動畫對象,可以為控件設(shè)置動畫效果;

2、setFillAfter?方法:?動畫對象調(diào)用該方法,傳入一個布爾型的參數(shù),可以設(shè)置該動畫對象的屬性,傳入true表示動畫結(jié)束后保持狀態(tài),默認(rèn)是不保持狀態(tài)。

3、setDuration?方法:動畫對象調(diào)用此方法,傳入毫秒數(shù)作為參數(shù),表示動畫持續(xù)的時間;

引入xml文件實現(xiàn)

每一種補間動畫都可以通過兩種方式實現(xiàn),下面看一下通過引用 xml?文件進行動畫效果的實現(xiàn)。

在res文件夾目錄下新建一個anim?的文件夾,然后在里面新建一個名為 alpha.xml?的 xml?文件,代碼如下:

<?xml version = "1.0" encoding = "utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android">

? ? ? ? <alpha

? ? ? ? ? ? ? ? ?android:duration = "1000"

? ? ? ? ? ? ? ? ?android:fromAlpha = "1"

? ? ? ? ? ? ? ? ?android:interpolator = "@android:anim/accelerate_interpolator"

? ? ? ? ? ? ? ? ?android:repeatCount="3"

? ? ? ? ? ? ? ? ?android:fillAfter="true"

? ? ? ? ? ? ? ? ? android:repeatMode="restart"

? ? ? ? ? ? ? ? ? android:toAlpha="0"/>

</set>

set?在外圍作為標(biāo)簽,透明度標(biāo)簽為alpha ,常用屬性 duration?表示動畫持續(xù)時間,fromAlpha?表示開始透明度值, toAlpha?表示結(jié)束透明度,repeatCount?表示?重復(fù)次數(shù),repeatMode?表示重復(fù)的模式,fillAfter表示結(jié)束后是否保持狀態(tài),interpolator?表示插值器,可以改變動畫的變化速率。

然后在Activity里面,代碼如下:

Animation alphaAnimation = AnimationUtils.loadAnimation(MainActivity.this,R.anim.alpha);

image.startAnimation(alphaAnimation);//開始動畫

alphaAnimation.setFillAfter(true);//動畫結(jié)束后保持狀態(tài)

alphaAnimation.setAnimationListener(new Animation.AnimationListener(){

Animation alphaAnim = AnimationUtils.loadAnimation(MainActivity.this,R.anim.alpha);

scan_ercode.startAnimation(alphaAnim);

alphaAnim.setFillAfter(true);

alphaAnim.setAnimationListener(newAnimation.AnimationListener() {

@Override

public void onAnimationStart(Animation animation) {

//動畫開始時回調(diào)

}

@Override

public void onAnimationEnd(Animation animation) {

//動畫結(jié)束時回調(diào)

}

@Override

public void onAnimationRepeat(Animation animation) {

//動畫重復(fù)時回調(diào)

}

});

上面用到一個AnimationUtils的loadAnimation?方法獲得一個Animation對象,該方法需要傳入兩個參數(shù),第一個是上下文對象,第二個是動畫文件。此外,調(diào)用了AlphaAnimation?的 setAnimationListener?方法設(shè)置了動畫監(jiān)聽,用匿名內(nèi)部類的方式引入了監(jiān)聽,復(fù)寫了三個方法,分別是動畫開始時、結(jié)束時、重復(fù)時進行回調(diào)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容