補(bǔ)間動(dòng)畫
可以使用補(bǔ)間動(dòng)畫系統(tǒng)執(zhí)行補(bǔ)間動(dòng)畫。補(bǔ)間動(dòng)畫計(jì)算動(dòng)畫相關(guān)的信息包括開(kāi)始點(diǎn)、結(jié)束點(diǎn)、大小城菊、旋轉(zhuǎn)角度以及其他與動(dòng)畫相關(guān)的共同點(diǎn)。
一個(gè)補(bǔ)間動(dòng)畫能執(zhí)行一系列簡(jiǎn)單的變換(位置碉克、大小凌唬、旋轉(zhuǎn)角度和透明度)關(guān)于一個(gè)視圖對(duì)象的屬性。所以漏麦,如果有一個(gè)TextView客税,你可以讓文本移動(dòng)、旋轉(zhuǎn)撕贞、放大更耻、縮小。如果有背景圖片麻掸,背景圖片將和文本一起被變換酥夭。
補(bǔ)間動(dòng)畫可以通過(guò)XML文件或Android代碼赐纱,推薦使用XML文件脊奋。因?yàn)榭勺x性更好,重用性更好疙描,比硬編碼更好替換诚隙。
每一個(gè)變換獲得一個(gè)具體變換的參數(shù)集合(開(kāi)始大小,結(jié)束大小起胰,開(kāi)始角度久又,結(jié)束角度等等)和一些常見(jiàn)的參數(shù)(開(kāi)始時(shí)間巫延,時(shí)長(zhǎng))。為了使幾個(gè)變換同時(shí)開(kāi)始地消,使它們的開(kāi)始時(shí)間相同炉峰;為了順序執(zhí)行,讓開(kāi)始時(shí)間加上變換執(zhí)行的時(shí)間脉执。
補(bǔ)間動(dòng)畫的XML文件放在res/anim目錄下疼阔。該文件有位移根元素<alpha>,<scale>,<translate>,<rotate>,插值器元素或<set>半夷。為了使變換順序執(zhí)行婆廊,必須設(shè)置startOffset屬性。如下:
屏幕坐標(biāo):左上角為(0,0)巫橄,向右淘邻、向下增加。
一些值湘换,比如pointX,能規(guī)定相對(duì)自身或者相對(duì)父控件的關(guān)系宾舅。根據(jù)需要選擇合適的格式(50為相對(duì)父控件的50%,50%為相對(duì)自身的50%)枚尼。
代碼調(diào)用res/anim目錄下的hyperspace_jump.xml動(dòng)畫:
ImageView spaceshipImage=(ImageView)findViewById(R.id.spaceshipImage);
Animation hyperspaceJumpAnimation=AnimationUtils.loadAnimation(this,R.anim.hyperspace_jump);
spaceshipImage.startAnimation(hyperspaceJumpAnimation);
startAnimation()可以使用如下方式替代:
給動(dòng)畫設(shè)置一個(gè)開(kāi)始時(shí)間Animation.setStartTime(),然后給視圖設(shè)置動(dòng)畫View.setAnimation()贴浙。
透明度動(dòng)畫:
XML:res/anim/anim_alpha.xml
<alpha
??????? android:duration="300"
??????? android:fromAlpha="0.0"
??????? android:toAlpha="1.0"/>
Animation animation=AnimationUtils.loadAnimation(this,R.anim.anim_alpha);
imageView.startAnimation(animation);
注:
fromAlpha:動(dòng)畫開(kāi)始時(shí)的透明度;0.0透明署恍,1.0不透明崎溃。
toAlpha:動(dòng)畫結(jié)束時(shí)透明度;0.0透明盯质,1.0不透明袁串。
Android Code:
AlphaAnimation localAlphaAnimation =new AlphaAnimation(0.0,1.0);
localAlphaAnimation.setDuration(300);
imageView.startAnimation(localAlphaAnimation);
縮放動(dòng)畫:
XML:res/anim/anim_scale.xml
<scale
??????? android:duration="300"
??????? android:fromXScale="0.0"
??????? android:fromYScale="0"
??????? android:pivotX="50%"
??????? android:pivotY="50%"
??????? android:toXScale="1.0"
??????? android:toYScale="1.0"/>
Animation animation=AnimationUtils.loadAnimation(this,R.anim.anim_scale);
imageView.startAnimation(animation);
注:
fromXScale:開(kāi)始時(shí)橫向(X軸)的大小呼巷;1.0指沒(méi)有改變囱修。fromYScale同理。
toXScale:動(dòng)畫結(jié)束時(shí)縱向(Y軸)的大型鹾贰破镰;1.0指沒(méi)有改變。toYScale同理压储。
pivotX:對(duì)象縮放時(shí)鲜漩,X軸坐標(biāo)保持不變的位置。pivotY同理集惋。
Android Code:
ScaleAnimation localScaleAnimation =new ScaleAnimation(0.0,1.0,0.0,1,0.5F,0.5F);
localScaleAnimation.setDuration(300);
imageView.startAnimation(localScaleAnimation);
旋轉(zhuǎn)動(dòng)畫:
XML:res/anim/anim_rotate.xml
<rotate
??????? android:duration="300"
??????? android:fromDegrees="0.0"
??????? android:toDegrees="90.0"
??????? android:pivotX="50%"
??????? android:pivotY="50%"/>
Animation animation=AnimationUtils.loadAnimation(this,R.anim.anim_rotate);
imageView.startAnimation(animation);
Android Code:
RotateAnimation rotateAnimation=new RotateAnimation(0.0, 90.0, 50%, 50%);
rotateAnimation.setDuration(300);
imageView.startAnimation(rotateAnimation);
注:
構(gòu)造函數(shù):RotateAnimation(float fromDegrees, float toDegrees, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
pivotXType:用于描述pivotXValue的類型孕似。
Animation.ABSOLUTE, 一個(gè)具體的數(shù)值;
Animation.RELATIVE_TO_SELF,相對(duì)自身的百分比刮刑;
Animation.RELATIVE_TO_PARENT喉祭,相對(duì)父控件的百分比养渴。
pivotXValue:一個(gè)具體的值后百分比,含義由pivotXType決定泛烙。
位移動(dòng)畫:
XML:res/anim/anim_translate.xml
<translate
??????? android:fromXDelta="0%"
??????? android:toXDelta="100%"
??????? android:duration="300"/>
Animation animation=AnimationUtils.loadAnimation(this,R.anim.anim_translate);
imageView.startAnimation(animation);
注:
fromXDelta:浮點(diǎn)數(shù)與百分比理卑,開(kāi)始時(shí)X軸的偏移量。表達(dá)方式:使用像素相對(duì)于正常位置蔽氨,如:"5"傻工;使用百分比相對(duì)于元素自身的寬度,如"5%",或者相對(duì)于父控件的寬度孵滞,如"5%p"中捆。formYDelta同理。
toXDelta:結(jié)束時(shí)X軸的偏移量坊饶。toYDelta 同理泄伪。
Android Code:
TranslateAnimation translateAnimation=new TranslateAnimation(Animation.RELATIVE_TO_SELF,0.0f, Animation.RELATIVE_TO_SELF,1.0f,Animation.RELATIVE_TO_SELF,0.0f, Animation.RELATIVE_TO_SELF,0.0f);
translateAnimation.setDuration(300);
imageView.startAnimation(translateAnimation);
動(dòng)畫循環(huán):
注:
duration:動(dòng)畫持續(xù)的時(shí)間,毫秒匿级;
fillAfter:動(dòng)畫結(jié)束時(shí)蟋滴,是否停在最后一幀;
fillBefore:動(dòng)畫結(jié)束時(shí)痘绎,是否停留在第一幀津函;
repeatCount:動(dòng)畫循環(huán)的次數(shù),默認(rèn)為 0 次不循環(huán)孤页,-1 (Animation.INFINITE)為無(wú)限循環(huán)尔苦;
repeatMode:循環(huán)的模式,Animation.REVERSE是從一次動(dòng)畫結(jié)束開(kāi)始行施,Animation.RESTART是從動(dòng)畫的開(kāi)始處循環(huán)允坚;
interpolator:插值器。
插值器( Interpolators)
下面的表指定每個(gè)插值器使用的資源:
在XML文件中蛾号,通過(guò)android:interpolator屬性使用稠项。如:
<set android:interpolator="@android:anim/accelerate_interpolator">
...
</set>
Android Code:
RotateAnimation rotateAnimation=newRotateAnimation(0.0, 90.0, 50%, 50%);
rotateAnimation.setDuration(300);
rotateAnimation.setInterpolator(new AccelerateInterpolator());//越轉(zhuǎn)越快
imageView.startAnimation(rotateAnimation);
插值器效果:
AccelerateDecelerateInterpolator():開(kāi)始和結(jié)束慢,中間加速鲜结。
AccelerateInterpolator():剛開(kāi)始慢展运,一直加速。
AnticipateInterpolator():開(kāi)始落后精刷,然后急速向前拗胜。
AnticipateOvershootInterpolator():開(kāi)始落后,然后急速向前贬养,超過(guò)目標(biāo)值挤土,再回到目標(biāo)值琴庵。
BounceInterpolator():最后反彈误算。
CycleInterpolator(float cycles):循環(huán)指定的次數(shù)仰美,速率隨正弦曲線變化。
DecelerateInterpolator()儿礼、DecelerateInterpolator(float factor):一開(kāi)始快咖杂,然后減速;factor:速度差的程度蚊夫。
LinearInterpolator():速率不變诉字。
OvershootInterpolator()、OvershootInterpolator(float tension):急速向前知纷,超過(guò)目標(biāo)值壤圃,然后返回;tension:超過(guò)的量琅轧。
問(wèn)題:
進(jìn)過(guò)補(bǔ)間動(dòng)畫變換的對(duì)象只是外表(大小伍绳、位置、透明度等)發(fā)生了改變乍桂,對(duì)象的本來(lái)屬性并未改變冲杀,事件響應(yīng)的位置也為改變。