在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)。