在Android中县昂,有兩類動(dòng)畫(huà)家夺,分別是Tween (補(bǔ)間動(dòng)畫(huà))和Frame (幀動(dòng)畫(huà))猫态。
Tween補(bǔ)間動(dòng)畫(huà)提供了四種動(dòng)畫(huà)形式,分別是AlphaAnimation(漸變動(dòng)畫(huà))兆解,RotateAnimation(旋轉(zhuǎn)動(dòng)畫(huà)),ScaleAnimation(尺寸動(dòng)畫(huà))垒棋、TranslateAnimation(位移動(dòng)畫(huà)),它們可以隨意進(jìn)行組合痪宰,組合成動(dòng)組合動(dòng)畫(huà)AnimationSet。對(duì)于幀動(dòng)畫(huà)比較好理解畔裕,類似動(dòng)畫(huà)片的原理 衣撬,一張張圖片按照某種規(guī)則進(jìn)行排序,然后按照一定速度切換扮饶,由于人眼的視覺(jué)暫留特性就會(huì)在大腦中形成連貫的動(dòng)畫(huà)畫(huà)面了具练,電影院中的電影就是這種形式的動(dòng)畫(huà)。
AlphaAnimation? 繼承自?Animation類甜无,常用構(gòu)造方法是
AlphaAnimation(float fromAlpha , float toAlpha)
需要傳入兩個(gè)參數(shù)扛点,一個(gè)是起始透明度值哥遮,第二個(gè)是結(jié)束透明度值,取值一般在 0 ~ 1?之間陵究。每一種補(bǔ)間動(dòng)畫(huà)都可以通過(guò)兩種方式實(shí)現(xiàn)眠饮,一種?是引入 xml?文件實(shí)現(xiàn) 。
通過(guò)代碼實(shí)現(xiàn)?
AlphaAnimation alphaAnimation = new Animation(0,1);//初始操作铜邮,參數(shù)傳入0和1仪召,即透明度由0變成透明度1
img.startAnimation(alphaANimation);//開(kāi)始動(dòng)畫(huà)
alphaAnimation.setFillAflter(true);//結(jié)束后保持狀態(tài)
alphaAnimation.setDuration(2000);//動(dòng)畫(huà)持續(xù)時(shí)間,單位是毫秒
這里涉及了幾個(gè)方法松蒜,
1扔茅、startAnimation?方法:控件調(diào)用該方法,傳入一個(gè)動(dòng)畫(huà)對(duì)象秸苗,可以為控件設(shè)置動(dòng)畫(huà)效果召娜;
2、setFillAfter?方法:?動(dòng)畫(huà)對(duì)象調(diào)用該方法惊楼,傳入一個(gè)布爾型的參數(shù)玖瘸,可以設(shè)置該動(dòng)畫(huà)對(duì)象的屬性,傳入true表示動(dòng)畫(huà)結(jié)束后保持狀態(tài)胁后,默認(rèn)是不保持狀態(tài)店读。
3、setDuration?方法:動(dòng)畫(huà)對(duì)象調(diào)用此方法攀芯,傳入毫秒數(shù)作為參數(shù)屯断,表示動(dòng)畫(huà)持續(xù)的時(shí)間;
引入xml文件實(shí)現(xiàn)
每一種補(bǔ)間動(dòng)畫(huà)都可以通過(guò)兩種方式實(shí)現(xiàn)侣诺,下面看一下通過(guò)引用 xml?文件進(jìn)行動(dòng)畫(huà)效果的實(shí)現(xiàn)殖演。
在res文件夾目錄下新建一個(gè)anim?的文件夾,然后在里面新建一個(gè)名為 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?表示動(dòng)畫(huà)持續(xù)時(shí)間,fromAlpha?表示開(kāi)始透明度值搔确, toAlpha?表示結(jié)束透明度彼棍,repeatCount?表示?重復(fù)次數(shù),repeatMode?表示重復(fù)的模式膳算,fillAfter表示結(jié)束后是否保持狀態(tài)座硕,interpolator?表示插值器,可以改變動(dòng)畫(huà)的變化速率涕蜂。
然后在Activity里面华匾,代碼如下:
Animation alphaAnimation = AnimationUtils.loadAnimation(MainActivity.this,R.anim.alpha);
image.startAnimation(alphaAnimation);//開(kāi)始動(dòng)畫(huà)
alphaAnimation.setFillAfter(true);//動(dòng)畫(huà)結(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) {
//動(dòng)畫(huà)開(kāi)始時(shí)回調(diào)
}
@Override
public void onAnimationEnd(Animation animation) {
//動(dòng)畫(huà)結(jié)束時(shí)回調(diào)
}
@Override
public void onAnimationRepeat(Animation animation) {
//動(dòng)畫(huà)重復(fù)時(shí)回調(diào)
}
});
上面用到一個(gè)AnimationUtils的loadAnimation?方法獲得一個(gè)Animation對(duì)象,該方法需要傳入兩個(gè)參數(shù)机隙,第一個(gè)是上下文對(duì)象蜘拉,第二個(gè)是動(dòng)畫(huà)文件萨西。此外,調(diào)用了AlphaAnimation?的 setAnimationListener?方法設(shè)置了動(dòng)畫(huà)監(jiān)聽(tīng)旭旭,用匿名內(nèi)部類的方式引入了監(jiān)聽(tīng)谎脯,復(fù)寫(xiě)了三個(gè)方法,分別是動(dòng)畫(huà)開(kāi)始時(shí)您机、結(jié)束時(shí)穿肄、重復(fù)時(shí)進(jìn)行回調(diào)。