動畫:
分類:分為視圖動畫和屬性動畫,其中視圖動畫又分為補間動畫和逐幀動畫。補間動畫又分為平移動畫唾糯、縮放動畫、旋轉動畫涡上、透明度動畫趾断。
創(chuàng)建:利用xml文件來定義View動畫的話,需要在工程的res目錄下創(chuàng)建anim文件夾吩愧,把定義的動畫都放到里面
視圖動畫
補間動畫(xml實現(xiàn)芋酌、java實現(xiàn)未記錄):
公共屬性(這些屬性是從Animation中繼承下來的,在alpha雁佳、rotate脐帝、scale、translate標簽中都可以直接使用糖权。):
android:duration="3000" // 動畫持續(xù)時間(ms)堵腹,必須設置,動畫才有效果
android:startOffset ="1000" // 動畫延遲開始時間(ms)
android:fillBefore = “true” // 動畫播放完后星澳,視圖是否會停留在動畫開始的狀態(tài)疚顷,默認為true
android:fillAfter = “false” // 動畫播放完后,視圖是否會停留在動畫結束的狀態(tài),優(yōu)先于fillBefore值腿堤,默認為false
android:fillEnabled= “true” // 是否應用fillBefore值阀坏,對fillAfter值無影響,默認為true
android:repeatMode= “restart” // 選擇重復播放動畫模式笆檀,restart代表正序重放忌堂,reverse代表倒序回放,默認為restart|
android:repeatCount = “0” // 重放次數(shù)(所以動畫的播放次數(shù)=重放次數(shù)+1)酗洒,為infinite時無限重復
android:interpolator = @[package:]anim/interpolator_resource // 插值器士修,相當于變速器,改變不同階段的執(zhí)行速度
平移動畫獨有屬性:
fromXDelta="0" //x初始位置 / toXDeleta="500" //x結束位置
fromYDeleta="0" / toYDeleta="500"
平移動畫實例( R.anim.view_tran):
<?xml version="1.0" encoding="utf-8"?>
android:duration="3000"
android:startOffset ="1000"
android:fillBefore = "true"
android:fillAfter = "false"
android:fillEnabled= "true"
android:repeatMode= "restart"
android:repeatCount = "0"
android:fromXDelta="0"
android:toXDelta="-50"
android:fromYDelta="0"
android:toYDelta="-100%"
/>
縮放動畫獨有屬性
fromXScale="0.0" X從0開始 / toXScale=“2” x放大到二倍
fromYScale / toYScale
縮放動畫實例(R.anim.view_scal):
<?xml version="1.0" encoding="utf-8"?>
android:duration="3000"
android:startOffset ="1000"
android:fillBefore = "true"
android:fillAfter = "false"
android:fillEnabled= "true"
android:repeatMode= "restart"
android:repeatCount = "0"
android:fromXScale="0.5"
android:toXScale="2"
android:fromYScale="0.5"
android:toYScale="2"
android:pivotX="50%"
android:pivotY="50%"
/>
透明度獨有屬性:
fromAlpha="1.0" //動畫開始是透明度
toAlpha="0.2" // 動畫結束時透明度
透明度動畫實例(R.anim.view_alph):
<?xml version="1.0" encoding="utf-8"?>
android:duration="3000"
android:startOffset ="1000"
android:fillBefore = "true"
android:fillAfter = "false"
android:fillEnabled= "true"
android:repeatMode= "restart"
android:repeatCount = "0"
android:fromAlpha="1.0"
android:toAlpha="0.2"
/>
旋轉獨有屬性:
fromDegress="0" 旋轉開始角度 //toDegress=“250” 旋轉結束角度
pivotX旋轉軸點X坐標 pivotY 旋轉軸點Y坐標
旋轉動畫實例(R.anim.view_rota):
<?xml version="1.0" encoding="utf-8"?>
android:duration="3000"
android:startOffset ="1000"
android:fillBefore = "true"
android:fillAfter = "false"
android:fillEnabled= "true"
android:repeatMode= "restart"
android:repeatCount = "0"
android:fromDegrees="0"
android:toDegrees="360"
android:pivotX="50%"
android:pivotY="50%"
/>
rotate樱衷、scale動畫的android:pivotX和android:pivotY屬性棋嘲、translate動畫的android:toXDelta和android:toYDelta屬性的取值都可以是都可以數(shù)值、百分數(shù)箫老、百分數(shù)p封字,比如:50、50%耍鬓、50%p,他們?nèi)≈档拇淼囊饬x各不相同:
50表示以View左上角為原點沿坐標軸正方向(x軸向右流妻,y軸向下)偏移50px的位置牲蜀;
50%表示以View左上角為原點沿坐標軸正方向(x軸向右,y軸向下)偏移View寬度或高度的50%處的位置绅这;
50%p表示以View左上角為原點沿坐標軸正方向(x軸向右涣达,y軸向下)偏移父控件寬度或高度的50%處的位置(p表示相對于ParentView的位置)。
java代碼中啟動(以上四種補間動畫的啟動方式):
Animation translateAnimation = AnimationUtils.loadAnimation(this, R.anim.view_tran);
btTran.startAnimation(translateAnimation);
逐幀動畫:
步驟: 1.將每一幀的圖片放入drawable文件夾
2.設置xml文件证薇,在java代碼中啟動
xml:
<animation-list
xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="true"http://動畫是否執(zhí)行一次
>
<item android:drawable="@drawable/img0" android:duration="100"/>
<item android:drawable="@drawable/img1" android:duration="100"/>
</animation-list>
java代碼中啟動:
ImageView imgKnightAttack;
imgKnightAttack.setImageResource(R.drawable.knight_attack);
// 1. 設置動畫
animationDrawable = (AnimationDrawable)imgKnightAttack.getDrawable();
// 2. 獲取動畫對象
animationDrawable .start()和animationDrawable .stop()
同時視圖動畫可以設置動畫執(zhí)行監(jiān)聽器:
animation.setAnimationListener(new Animation.AnimationListener() {
@Override public void onAnimationStart(Animation animation) {
// 動畫開始
}
@Override public void onAnimationEnd(Animation animation) {
// 動畫結束
}
@Override public void onAnimationRepeat(Animation animation) {
//動畫重復
}
});
屬性動畫:
定義:控制屬性來實現(xiàn)動畫度苔,和另外兩個動畫一樣,既可以用xml來控制浑度,也可以用java代碼控制寇窑。啟動也是java來控制
xml實現(xiàn)例子(view_attribute_animation):
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2000" //動畫持續(xù)時間
android:propertyName="alpha" //動畫類型
android:repeatCount="1" //重復次數(shù)
android:repeatMode="restart" //重復模式 ,restart重新開始 箩张,reverse倒序回放
android:valueFrom="0"
android:valueTo="1"
android:valueType="floatType" //值類型
/>
通過android:propertyName來控制 是那種動畫 和視圖動畫相同甩骏,分為四種,細分為以下幾種 scaleY/scaleX;translationX/translationY;alpha;rotation;其他屬性是在xml文件中有提示的先慷。
組合動畫 :
下面例子是 360度旋轉著向x軸正方向位移200像素饮笛,然后再旋轉著位移回原點,
然后執(zhí)行第二段向反方向執(zhí)行一次论熙。
<?xml version="1.0" encoding="utf-8"?>
android:ordering="sequentially">
<set>
<objectAnimator
android:duration="4000"
android:propertyName="rotation"
android:repeatMode="reverse"
android:valueFrom="0"
android:valueTo="360" />
<set android:ordering="sequentially">
<objectAnimator
android:duration="2000"
android:propertyName="translationX"
android:repeatMode="reverse"
android:valueFrom="0"
android:valueTo="200" />
<objectAnimator
android:duration="2000"
android:propertyName="translationX"
android:repeatMode="reverse"
android:valueFrom="200"
android:valueTo="0" />
</set>
</set>
<set>
<objectAnimator
android:duration="4000"
android:propertyName="rotation"
android:repeatMode="reverse"
android:valueFrom="0"
android:valueTo="360" />
<set android:ordering="sequentially">
<objectAnimator
android:duration="2000"
android:propertyName="translationX"
android:repeatMode="reverse"
android:valueFrom="0"
android:valueTo="-200" />
<objectAnimator
android:duration="2000"
android:propertyName="translationX"
android:repeatMode="reverse"
android:valueFrom="-200"
android:valueTo="0" />
</set>
</set>
</set>
默認為 together :set中的動畫同時執(zhí)行
sequentially :set中的動畫順序執(zhí)行
java代碼中啟動:
Animator animator = AnimatorInflater.loadAnimator(this, R.anim.view_attribute_animation);
animator.setTarget(imgAttribute);
animator.start();
java代碼形式:
第一個參數(shù)是要綁定的組件 實例化的名字例如 ImageView imageView;第二個參數(shù)是要實現(xiàn)的動畫名細分scaleY/scaleX;translationX/translationY;alpha;rotation;第三第四個福青,代表執(zhí)行的動畫效果,同時,可以加更多參數(shù)无午,代表該動畫執(zhí)行多次
ObjectAnimatoranimator=ObjectAnimator.ofFloat(imageView,"alpha",1f,0f);
animator.setDuration(1000);//時間1s
animator.start();
同時例如在旋轉的時候媒役,第三,第四個寫的 如果前面的比后面的大指厌,那么久代表逆時針(360f,0f 這表示逆時針旋轉)刊愚,移動同理,前面比后面大踩验,代表負方向移動鸥诽。
補間動畫和屬性動畫的區(qū)別:
如果需求只是對View進行移動,縮放箕憾,旋轉和淡入淡出的操作牡借,補間動畫就足夠了,但是如果超出就沒法了袭异,而且補間動畫最大的缺陷就是只改變了View的顯示效果钠龙,而沒有改變真正的顯示效果,沒有真正改變View的屬性(例如在動畫執(zhí)行結束后御铃,對組件執(zhí)行點擊事件碴里,無反應)。