視圖動畫
?執(zhí)行XML中的動畫
Animation animationScale = AnimationUtils.loadAnimation(this, R.anim.scale_one);
view.startAnimation(animationScale)
?動畫Animation屬性
- android:duration:一次動畫持續(xù)時間(單位毫秒)
- android:fillAfter:true:保持動畫結(jié)束時的狀態(tài)
- android:fillBefore:true:動畫結(jié)束時還原到初始化狀態(tài)
- android:fillEnabled:同fillBefore
- android:repeatCount:指定動畫重復(fù)次數(shù),當(dāng)取值為infinite時疾掰,表示無限循環(huán)御板。
- android:repeatMode:用于設(shè)定重復(fù)的類型落追,有reverse和restart兩個值。reverse表示倒序回放单雾,restart表示重放,必須與repeatCount一起使用才能看到效果她紫。
- android:interpolator:插值器顶猜,其實就是指定的動畫效果。
1邑蒋、取消動畫
void cancel()
2姓蜂、將控件重置到動畫開始前狀態(tài)
void reset()
3、設(shè)置動畫監(jiān)聽
setAnimationListener(Animation.AnimationListener listener);
回調(diào)函數(shù)如下:
- onAnimationEnd():當(dāng)動畫結(jié)束時調(diào)用医吊;
- onAnimationRepeat():當(dāng)動畫重復(fù)時調(diào)用钱慢;
- onAnimationStart():當(dāng)動畫開始時調(diào)用;
一卿堂、scale(漸變尺寸伸縮動畫效果)
- android:fromXScale:動畫起始時束莫,控件在X軸方向上相對自身的縮放比例,浮點值草描。(1.0表示自身無變化览绿,0.5代表縮小1倍,2.0代表放大1倍)
- android:toXScale:動畫結(jié)束時穗慕,控件在X軸方向上相對自身的縮放比例饿敲,浮點值。
- android:fromYScale:動畫起始時逛绵,控件在Y軸方向上相對自身的縮放比例怀各,浮點值。
- android:toYScale:動畫結(jié)束時术浪,控件在Y軸方向上相對自身的縮放比例瓢对,浮點值。
- android:pivotX:縮放起始點X軸坐標(biāo)胰苏,可以是數(shù)值硕蛹、百分?jǐn)?shù)、百分?jǐn)?shù)p三種方式碟联,如50妓美、50%、50%p鲤孵。如果是數(shù)值壶栋,則表示在當(dāng)前視圖的左上角,即原點處加上50px普监,作為縮放起始點X軸坐標(biāo)贵试;如果是50%,則表示在當(dāng)前控件的左上角加上自己寬度的50%作為縮放起始點X軸坐標(biāo)凯正;如果是50%p毙玻,則表示在當(dāng)前控件的左上角加上父控件寬度的50%作為縮放起點X軸坐標(biāo)。
- android:pivotY:縮放起始點Y軸坐標(biāo)廊散,取值及含義與android:pivotX相同桑滩。
示例代碼:
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="3000"
android:fromXScale="0.1"
android:fromYScale="0.1"
android:toXScale="1.5"
android:toYScale="1.5"
android:pivotX="50"
android:pivotY="50">
</scale>
代碼的方式:
只要是第三個構(gòu)造函數(shù):其中pivotXType和pivotYType有以下三個取值:①、Animation.ABSOLUTE(對應(yīng)的是數(shù)值)允睹,②运准、Animation.RELATIVE_TO_SELF(對應(yīng)的是百分?jǐn)?shù))幌氮,③、Animation.RELATIVE_TO_PARENT(對應(yīng)的是百分?jǐn)?shù)p)胁澳。
ScaleAnimation(float fromX,float toX,float fromY,float toY);
ScaleAnimation(float fromX,float toX,float fromY,float toY,float pivoteX,float pivoteY);
ScaleAnimation(float fromX,float toX,float fromY,float toY,int pivotXType,float pivotXValue,int pivotYType,float pivotYValue);
代碼示例
ScaleAnimation scaleAnim = new ScaleAnimation(0.0f,1.4f,0.0f,1.4f,Animation.RELATION_TO_SELF,0.5f,Animation.RELATION_TO_SELF,0.5f);
scaleAnim.setDuration(1000);
view.startAnimation(scaleAnim);
當(dāng)pivotX和pivotY的數(shù)值(不是百分值)較大時该互,動畫效果是邊平移邊縮放的效果。當(dāng)fromXScale和fromYScale的值不是從零開始的話韭畸,pivotX和pivotY的作用就被遮蓋了宇智,可能是起始點變化比起始縮放的效果早一些執(zhí)行導(dǎo)致的(我也很奇怪)。還有當(dāng)pivotX和pivotY有值且為正值時胰丁,view會從右王左開始縮放(至于為什么我想和Matrix的具體計算有關(guān)吧随橘,待詳細(xì)了解)。
二隘马、alpha(實現(xiàn)漸變透明度動畫效果)
- android:fromAlpha:開始時的透明度太防,取值范圍0.0~1.0,0.0表示全透明酸员,1.0表示完全不透明蜒车。
- android:toAlpha:動畫結(jié)束時的透明度,取值范圍0.0~1.0幔嗦,0.0表示全透明酿愧,1.0表示完全不透明。
示例代碼:
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="3000"
android:fromAlpha="0"
android:toAlpha="1">
</alpha>
AlphaAnimation(float fromAlpha,float toAlpha);
AlphaAnimation alphaAnim = new AlphaAnimation(1.0f,0.1f);
三邀泉、rotate(實現(xiàn)畫面轉(zhuǎn)移旋轉(zhuǎn)動畫效果)
- android:fromDegrees:動畫開始旋轉(zhuǎn)時的角度位置嬉挡,正值代表順時針方向的度數(shù),負(fù)值代表逆時針方向的度數(shù)汇恤。
- android:toDegrees:動畫結(jié)束時旋轉(zhuǎn)到的角度位置庞钢,正值代表順時針方向的度數(shù),負(fù)值代表逆時針方向的度數(shù)因谎。
-android:pivotX:旋轉(zhuǎn)中心點X軸坐標(biāo)基括,默認(rèn)旋轉(zhuǎn)中心點是控件坐標(biāo)原點〔撇恚可以是數(shù)值风皿、百分?jǐn)?shù)、百分?jǐn)?shù)p三種樣式匠璧,比如50桐款、50%、50%p夷恍,具體含義同之前所講魔眨。- android:pivotY:旋轉(zhuǎn)中心點Y軸坐標(biāo),具體同上。
示例代碼:
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="3000"
android:fillAfter="true"
android:fromDegrees="0"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="360"></rotate>
構(gòu)造函數(shù)
RotateAnimation(float fromDegree,float toDegree);
RotateAnimation(float fromDegree,float toDegree,float pivotX,float
pivoY);
RotateAnimation(float fromDegree,float toDegree,int pivotXType,float pivotXValue,int pivotYType,float
pivoYValue);
代碼示例:
RotateAnimation rotateAnim=new RotateAnimation(0,-650,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
四冰沙、translate(實現(xiàn)畫面變化位置移動動畫效果)
- android:fromXDelta:起始點X軸坐標(biāo)侨艾,可以是數(shù)值、百分?jǐn)?shù)拓挥、百分?jǐn)?shù)p三種樣式,作用同之前所講袋励。
- android:fromYDelta:起始點Y軸坐標(biāo)侥啤,可以是數(shù)值、百分?jǐn)?shù)茬故、百分?jǐn)?shù)p三種樣式盖灸,作用同之前所講。
- android:toXDelta:終點X軸坐標(biāo)磺芭。
- android:toYDelta:終點Y軸坐標(biāo)赁炎。
示例代碼:
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="3000"
android:fillAfter="false"
android:fromXDelta="0"
android:fromYDelta="0"
android:toXDelta="80"
android:toYDelta="80"></translate>
構(gòu)造函數(shù)
TranslateAnimation(float fromXDelta,float toXDelta,float fromYDelta,float toYDelta);
TranslateAnimation(int fromXType,float fromXValue,int toXType,float toXValue,int fromYType,float fromYValue,int toYType,float toYValue);
代碼示例
TranslateAnimation translateAnim = new TranslateAnimation(Animation.ABSOLUTE,0,Animation.ABSOLUTE,-80,Animation.ABSOLUTE,0,Animation.ABSOLUTE,-80);
五、set標(biāo)簽(定義動畫集)
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="3000"
android:fillAfter="true">
<alpha
android:fromAlpha="0.0"
android:toAlpha="1.0" />
<scale
android:fromXScale="0.0"
android:fromYScale="0.0"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="1"
android:toYScale="1" />
<rotate
android:fromDegrees="0"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="720" />
</set>
構(gòu)造函數(shù):其中shareInterpolator 參數(shù)的取值有true和false钾腺。當(dāng)為true時徙垫,用于在AnimationSet類中定義一個插值器(Interpolator),其下面的所有動畫共用該插值器放棒;當(dāng)為false時姻报,則其下的動畫定義各自的插值器。
AnimationSet(Context context , AttributeSet attrs);
AnimationSet(boolean shareInterpolator);
示例代碼:
Animation alphaAnim = new AlphaAnimation(1.0f,1.0f);
Animation scalAnim=new ScaleAnimation(0.0f,1.4f,0.0f,1.4f,Animation.RELATION_TO_SELF,0.5f,Animation.RELATION_TO_SELF,0.5f);
Animation rotateAnim=new RotateAnimation(0,720,Animation.RELATION_TO_SELF,0.5f,Animation.RELATION_TO_SELF,0.5f);
AnimationSet setAnim = new AnimationSet(true);
setAnim.addAnimation(alphaAnim);
setAnim.addAnimation(scalAnim);
setAnim.addAnimation(rotateAnim);
setAnim.setDuration(3000);
setAnim.setFillAfter(true);
view.startAnimation(setAnim);
注意:在set標(biāo)簽中設(shè)置repeateCount屬性是無效的间螟,必須對每個動畫單獨設(shè)置才有作用吴旋。
逐幀動畫
逐幀動畫就是一幀挨著一幀的播放圖片,就像放電影一樣厢破,既可以通過XML代碼實現(xiàn)也可以通過Java代碼實現(xiàn)荣瑟。
一、XML實現(xiàn)
1摩泪、定義xml動畫文件
將xml定義在/res下的anim或drawable目錄中笆焰,代碼如下:
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item
android:drawable="@mipmap/spinner_0"
android:duration="60" />
<item
android:drawable="@mipmap/spinner_1"
android:duration="60" />
<item
android:drawable="@mipmap/spinner_2"
android:duration="60" />
<item
android:drawable="@mipmap/spinner_3"
android:duration="60" />
<item
android:drawable="@mipmap/spinner_4"
android:duration="60" />
<item
android:drawable="@mipmap/spinner_5"
android:duration="60" />
<item
android:drawable="@mipmap/spinner_6"
android:duration="60" />
<item
android:drawable="@mipmap/spinner_7"
android:duration="60" />
<item
android:drawable="@mipmap/spinner_8"
android:duration="60" />
<item
android:drawable="@mipmap/spinner_9"
android:duration="60" />
<item
android:drawable="@mipmap/spinner_10"
android:duration="60" />
<item
android:drawable="@mipmap/spinner_11"
android:duration="60" />
</animation-list>
- 元素是必須的,并且必須作為根元素加勤,可以包含一個或多個元素仙辟;
- android:oneshot如果為true,那么動畫只執(zhí)行一次鳄梅;如果定義為false叠国,則一直循環(huán)。
- android:drawable:指定此幀動畫對應(yīng)的圖片資源戴尸。
- android:duration:代表此幀動畫持續(xù)的時間粟焊,是一個整數(shù),單位毫秒。
2项棠、設(shè)置ImageView
給ImageView設(shè)置動畫資源悲雳,可以通過android:src 實現(xiàn),也可以通過android:background實現(xiàn)香追。
3合瓢、AnimationDrawable開始動畫
最后在代碼中開始動畫。代碼展示:
//通過android:src方式設(shè)置后的獲取方式
AnimationDrawable anim =(AnimationDrawable) image.getDrawable();
//通過android:background方式設(shè)置后的獲取方式
AnimationDrawable anim =(AnimationDrawable) image.getBackground();
anim.start();
3透典、AnimationDrawable類
- void start():開始播放逐幀動畫晴楔。
- void stop():停止播放逐幀動畫。
- int getDuration(int index):得到指定index的幀的持續(xù)時間峭咒。
- Drawable getFrame(int index):得到指定index的幀所對應(yīng)的Drawable對象税弃。
- int getNumberOfFrames():得到當(dāng)前所有幀數(shù)量。
- boolean isRunning():判斷當(dāng)前AnimationDrawable是否正在播放凑队。
- void setOneShot(boolean oneShot):設(shè)置AnimationDrawable是否執(zhí)行一次则果,true代表執(zhí)行一次,false代表循環(huán)執(zhí)行漩氨。
- boolean isOneShot():判斷當(dāng)前AnimationDrawable是否執(zhí)行一次西壮。
- void addFrame(Drawable frame,int duration):為AnimationDrawable添加1幀,并設(shè)置持續(xù)時間才菠。
二茸时、代碼實現(xiàn)
代碼實現(xiàn):
final AnimationDrawable anim = new AnimationDrawable();
for(int i=1;i<14;i++){
int id=getResources().getIdentifier("spinner_"+i,"mipmap",getPackageName());
Drawable drawable = getResources().getDrawable(id);
anim.addFrame(drawable,60);
}
anim.setOneShot(false);
image.setBackgroundDrawable(anim);
anim.start();
這段代碼的難點是通過文件名拿到文件:
int getIdentifier(String name , String defType , String defPackage);
- String name: 所要查找資源ID的資源名稱。
- String defType:資源所在的文件類型赋访。
- String defPackage: 應(yīng)用包名可都。