android動畫有補間動畫也有屬性動畫,還有布局動畫等。今天就先從簡單的四種基本補間動畫說起。 補間動畫有:平移,縮放,旋轉,透明。使用方式有兩種:xml和java代碼。
android:fillAfter 表示動畫結束后是否停留在最后一幀,即停在結束位置; android:duration表示動畫的持續時間; android:interpolator表示動畫的運行規律(插值器),比如先快后慢或者先慢后快等; android:repeatCount 表示重復次數,默認值是0,代表重復1次;如果值是repeatCount=n代表重復 n+1次;值為-1或者infinite時,表示補間動畫永不停止; android:repeatMode 設置重復的模式,默認是restart,當repeatCount的值大于0或者為-1或infinite時才有效: 1.如果是:restart,表示每次執行完都會從頭開始; 2.如果是:reverse,表示第一次從頭開始,第二次反過來,第三次從頭開始,第四次反過來,即偶數次是反著的; 3.舉例說明,從位置A平移到B: a.如果是restart,那么每次都是A-B,瞬間回到A然后又A-B,不斷重復; b.如果是reverse,那么第一次是A-B,第二次是B-A,第三次是A-B,第四次是B-A,這樣循環下去,結果是就是來回移動了;
一.平移動畫TranslateAnimation 1.XML實現方式(res/anim,沒有此文件夾自己建立):
<?xml version="1.0" encoding="utf-8"?><translate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="1000" android:fromXDelta="0" android:fromYDelta="0" android:repeatCount="infinite" android:repeatMode="reverse" android:toXDelta="50%p"/>使用:Animation tran = AnimationUtils.loadAnimation(this,R.anim.translate);translate.startAnimation(tran);屬性說明: android:fromXDelta,平移的起點x方向坐標(android:toXDelta和Y方向的同理): 1.如果值是數值類型,即20或者25.0之類的,譬如50表示以當前View左上角坐標加50px為初始點; 2.如果值是百分比類型,即20%或者50%之類的,50%表示以當前View的左上角加上當前View寬高的50%做為初始點; 3.如果是父值的類型,即-100%p或者100%p之類的,50%p表示以當前View的左上角加上父控件寬高的50%做為初始點;
2.代碼實現方式:
Animation tran1 = new TranslateAnimation(Animation.RELATIVE_TO_PARENT,0,Animation.RELATIVE_TO_PARENT,1,Animation.RELATIVE_TO_PARENT,0,Animation.RELATIVE_TO_PARENT,0);tran1.setDuration(2000);translate.startAnimation(tran1);8個參數依次:起點x的坐標參照,起點x的坐標值,終點x的坐標參照,終點x的坐標值,起點y的坐標參照,起點y的坐標值,終點y的坐標參照,終點y的坐標值; 坐標參照是用來設置位置的,比如: RELATIVE_TO_PARENT(XML中父值的類型):相當于用XML時的“android:toXDelta=”50%p”中的p,表示以父控件為參照,1代表100%p,0.5代表50%p,Y方向同理; RELATIVE_TO_SELF(XML中百分比類型):相當于XML時的“android:toXDelta=”50%”,以自身為參照,1相當于XML中的100%,0.5相當于XML中的50%,Y方向同理; ABSOLUTE(XML中數值類型):相當于XML中的“android:toXDelta=”50”; 即三種參數其實跟XML中的使用方式是對應的,如果不懂看XML方式來理解就懂了。 如果在代碼中不寫坐標參照即只有4個參數值,默認是ABSOLUTE方式。
二:縮放動畫 1.XML實現方式:
<?xml version="1.0" encoding="utf-8"?><scale xmlns:android="http://schemas.android.com/apk/res/android" android:duration="1000" android:fromXScale="1.0" android:fromYScale="1.0" android:pivotX="50%" android:pivotY="50%" android:repeatCount="infinite" android:repeatMode="reverse" android:toXScale="50%p" android:toYScale="50%p" />使用:Animation scaleAn = AnimationUtils.loadAnimation(this,R.anim.scale);scale.startAnimation(scaleAn);android:fromXScale,縮放開始時的x方向大?。?android:toXScale,縮放開始時的y方向大小; android:pivotX,縮放的中心的x坐標(即以某個點為中心進行縮放); 以上3個屬性y方向的同理。 android:fromXScale和android:toXScale,還有Y方向的屬性值也有三種形式(以android:fromXScale舉例): 1.如果值是數值類型,即1或者2之類的表示縮放動畫開始時的寬是自身寬的1或者2倍; 2.如果值是百分比類型,即20%或者50%之類的,表示縮放動畫開始時的寬是自身寬的20%或者50%; 3.如果是父值類型,即50%p或者100%p之類的,表示縮放動畫開始時的寬是父控件寬的50%或者100%; android:pivotX的屬性值有兩種形式: 1.如果值是百分比類型,即20%或者50%之類的,表示縮放的中心點x坐標在自身左上角坐標+自身寬度的20%或者50%處; 2.如果是父值類型,即50%p或者100%p之類的,表示縮放的中心點x坐標在自身左上角坐標+父控件寬度的50%或者100%處; 補充:如果是數值類型,比如1或者2,無效,無論是多少,都表示縮放的中心點是自身的左上角。 2.代碼實現方式:
Animation scale1 = new ScaleAnimation(1f,0.5f,1f,0.5f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);scale1.setDuration(2000);scale.startAnimation(scale1);8個參數依次:起始寬度,結束寬度,縮放起始高度,結束高度,縮放中心點x方向的坐標參照,縮放中心點的x坐標,縮放中心點y方向的坐標參照,縮放中心點的y坐標; 前4個參數只能是float格式,效果都是自身寬高的倍數,比如例子中表示,起始寬度是自身寬度1倍,結束寬度是自身一半; 后面4個參數中三種寫法: Animation.RELATIVE_TO_PARENT,0.5f,Animation.RELATIVE_TO_PARENT,0.5f,表示中心點是自身左上角坐標+父控件寬高的一半; Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f,表示中心點是自身左上角坐標+自身寬高的一半; Animation.ABSOLUTE,100,Animation.ABSOLUTE,100,表示中心點是自身左上角坐標+100;
三.透明動畫 1.XML實現方式:
<?xml version="1.0" encoding="utf-8"?><alpha xmlns:android="http://schemas.android.com/apk/res/android" android:duration="1000" android:fromAlpha="1" android:repeatCount="-1" android:repeatMode="reverse" android:toAlpha="0.5"></alpha>android:fromAlpha和android:toAlpha分別表示開始和結束時的透明度,值只有一種格式,0-1之間的數,1表示不透明,0表示完全透明,這個比較簡單。 2.代碼中設置:
Animation alpha1 = new AlphaAnimation(1,0);alpha1.setDuration(2000);alpha.startAnimation(alpha1);透明動畫比較簡單,兩個參數,一個是開始的透明度,一個是結束的透明度,值與在XML中寫的格式相同。
四,旋轉動畫 1.XML實現方式:
<?xml version="1.0" encoding="utf-8"?><rotate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="1000" android:fromDegrees="0" android:pivotX="50%" android:pivotY="50%" android:repeatCount="infinite" android:repeatMode="reverse" android:toDegrees="-90"></rotate>android:fromDegrees和android:toDegrees分別表示起始和結束的角度,值只能是一種格式,數值類型,可以說int也可以是float,代表角度。 2.代碼實現方式:
Animation rotateAn = new RotateAnimation(90,-90,Animation.ABSOLUTE,100,Animation.ABSOLUTE,100);rotate.startAnimation(rotateAn);前兩個參數表示開始角度和結束角度,沒啥好說的。 后面4個參數中三種寫法: Animation.RELATIVE_TO_PARENT,0.5f,Animation.RELATIVE_TO_PARENT,0.5f,表示旋轉中心點是自身左上角坐標+父控件寬高的一半; Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f,表示旋轉中心點是自身左上角坐標+自身寬高的一半; Animation.ABSOLUTE,100,Animation.ABSOLUTE,100,表示旋轉中心點是自身左上角坐標+100;
最后,匯總:上面四種動畫都是單獨使用的,我們如果想混合使用,比如變大的同時變透明,那就得組合動畫了,組合動畫也是一樣的可以XML也可以代碼寫: 1.XML實現方式:
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" android:fillAfter="true" android:interpolator="@android:anim/cycle_interpolator" android:shareInterpolator="true"> <translate android:duration="1000" android:fromXDelta="0" android:fromYDelta="0" android:toXDelta="50%p" android:toYDelta="0" /> <alpha android:duration="1000" android:fromAlpha="1" android:repeatCount="1" android:repeatMode="reverse" android:toAlpha="0.5" /> <scale android:fromXScale="1" android:fromYScale="0.5" android:pivotX="50%" android:pivotY="50%" android:repeatCount="1" android:repeatMode="reverse" android:toXScale="0.5" android:toYScale="0.5" /></set>android:shareInterpolator表示set標簽下的多個動畫共用一個插值器,如果不需要,那就單獨設置插值器。 2.代碼中設置:
AnimationSet animationSet = new AnimationSet(true);//共享插值器animationSet.addAnimation(scale);animationSet.addAnimation(alpha);animationSet.addAnimation(rotate);animationSet.addAnimation(translate);view.startAnimation(animationSet);很簡單,用set將各個單獨的動畫加進去,然后start就行了。
四種基本補間動畫基本說完了,還是很簡單的,不過它并不完美,比如如果一個按鈕設置了點擊事件,然后你平移了它,此時你點擊新的位置的它,是不會有反應的,因為它還在原來的位置,只是我們肉眼看著它移走了,實際上它還是沒動的,所以此時就需要屬性動畫了,屬性動畫在后面會再補上。
新聞熱點
疑難解答