Android動畫-View Animation
視圖動畫(View Animation),又稱補間動畫(Tween Animation),即給出兩個關鍵幀,通過一些算法將給定屬性值在給定的時間內在兩個關鍵幀間漸變。本文首先講解各種基本動畫的使用,其實介紹View動畫的工作過程。
概述
視圖動畫只能作用于View對象,是對View的變換,默認支持的類型有:
- 透明度變化(AlphaAnimation)
- 縮放(ScaleAnimation)
- 位移(TranslateAnimation)
- 旋轉(RotateAnimation) </ul>
可以使用AnimationSet讓多個動畫集合在一起運行,使用插值器(Interpolator)設置動畫的速度。
上面說到的幾種動畫,以及AnimationSet都是Animation的之類,因此Animation中有的屬性,以及xml的配置屬性,他們都有,因此,單獨說每個動畫的時候只說其特有的方法和屬性。對于使用xml配置時需要放到res下面的animation文件夾下。
AlphaAnimation 透明度動畫
就是改變視圖的透明度,可以實現淡入淡出等動畫。這個動畫比較簡單只需要設置開始透明度和結束透明度即可。
Animation animation = new AlphaAnimation(0.1f, 1.0f); //fromAlpha 0.1f toAlpha 1.0f
或
<alpha android:fromAlpha = "0.1f" android:toAlpha="1.0f" />
ScaleAnimation 縮放
縮放動畫,支持設置開始x縮放(寬度縮放倍數),開始y縮放, 結束x縮放,結束y縮放,以及縮放基點x坐標,縮放基點y坐標。
x縮放和y縮放都是相對于原始的寬度和高度的,1.0表示不縮放。
坐標基點,同時有參數可以設置坐標基點類型,分別是:
- Animation.ABSOLUTE(默認值) 相對于控件的0點的坐標值
- Animation.RELATIVE_TO_SELF相對于自己寬或者高的百分比(1.0表示100%)
- Animation.RELATIVE_TO_PARENT相對于父控件的寬或者高的百分比. </ul>
默認基點是視圖的0點,默認坐標基點類型是ABSOLUTE。
有如下幾種構造函數
ScaleAnimation(Context context, AttributeSet attrs) ScaleAnimation(float fromX, float toX, float fromY, float toY) new ScaleAnimation(1.0f, 1.5f, 1.0f, 1.5f); ScaleAnimation(float fromX, float toX, float fromY, float toY, float pivotX, float pivotY) new ScaleAnimation(1.0f, 1.5f, 1.0f, 1.5f, 10, 10); ScaleAnimation(float fromX, float toX, float fromY, float toY, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue) new ScaleAnimation(1.0f, 1.5f, 1.0f, 1.5f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); //以中心點為基點
XML配置:
<scale android:fromXScale="float" android:toXScale="float" android:fromYScale="float" android:toYScale="float" android:pivotX="float" android:pivotY="float" />
TranslateAnimation 位移
平移支持x軸平移起點和y軸平移起點,以及設置結束點。同時每個點都可以設置type,type和上面縮放動畫的基點類型一樣,默認類型是ABSOLUTE.
有以下幾個構造函數:
TranslateAnimation(Context context, AttributeSet attrs) 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)
XML配置:
<translate android:fromXDelta="float" android:toXDelta="float" android:fromYDelta="float" android:toYDelta="float" />
RoatationAnimation 旋轉
旋轉支持設置旋轉開始角度,和旋轉結束角度,以及旋轉基點,和旋轉基點類型。類型同上面一樣,默認旋轉基點是(0,0),默認類型同上面一樣,也不多說了。
RotateAnimation(Context context, AttributeSet attrs) RotateAnimation(float fromDegrees, float toDegrees) RotateAnimation(float fromDegrees, float toDegrees, float pivotX, float pivotY) RotateAnimation(float fromDegrees, float toDegrees, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
XML配置:
<rotate android:fromDegrees="float" android:toDegrees="float" android:pivotX="float" android:pivotY="float" />
AnimationSet 動畫集合
動畫集合就是可以讓多個動畫一起運行,或者依次運行。
通過addAnimation(Animation a)向集合中添加動畫,使用子動畫的setStartOffset(long offset)設置延時,從而實現子動畫之間的間隔。可以設置是否共享時間插值器。
xml配置:
<set> <!--這里寫子動畫--> <rotation ..../> <alpha ...../> </set>
屬性動畫(Property Animation)
Animation
單獨把Animation拿出來說,是因為前面幾個都是Animation,他們有一些屬性都是從父類繼承的。包括時常,插值器,是否重復,監聽器等。
setFillBefore(boolean)和setFillAfter(boolean)分別是動畫開始前和動畫結束后是否保持動畫狀態,默認前者為ture,后者為false;
xml中可以配置的屬性(這些在前面幾個動畫中省略了,也是可以使用的):
android:detachWallpaper android:duration android:fillAfter android:fillBefore android:fillEnabled android:interpolator android:repeatCount android:repeatMode INFINTE(無限期),RESTART(重新開始,默認值) android:startOffset android:zAdjustment ZORDER_BOTTOM,ZORDER_NORMAL, ZORDER_TOP
啟動動畫:
view.startAnimation(animation); //或者這樣 view.setAnimation(animation); animation.start();
Interpolator 插值器
通過設置插值器可以改變動畫的速度,以及最終效果。
android sdk提供了幾種默認插值器,而且這些插值器在新的protery animation上仍然可以使用,這個后面再說。
- AccelerateDecelerateInterpolator 先加速后減速
- AccelerateInterpolator 加速
- AnticipateInterPolator
- AnticipateOvershootInterpolator
- BounceInterpolator
- CycleInterpolator
- LinearInterpolator
- OvershootInterpolator
- PathInterpolator </ul>
當然,我們也可以自定義Interpolator,一般開始值為0,結束值為1.0,然后根據算法來改變值。
動畫原理解析
動畫就是根據間隔時間,不停的去刷新界面,把時間分片,在那個時間片,通過傳入插值器的值到Animation.applyTransformation(),來計算當前的值(比如旋轉角度值,透明度等).
因此,我們也可以繼承Animation,從寫applyTransformation()來實現我們的其他的動畫。
其他
使用view動畫時,如果需要用到類似基點類型和基點設置的,一定要注意設置對點,不然效果恨不如意。
另外,view動畫,若動畫前view在a點,動畫過程以及動畫后,view變化了位置,則點擊點仍然在原位置,這是個大問題,特別需要注意。
在android apidemo中,有動畫的使用,以及自定義動畫,各種插值器效果,各位可以查看,我已經將其放到github上面了,地址:https://github.com/sangmingming/Android-ApiDemos
原文地址:http://blog.isming.me/2015/02/01/android-view-animation/,轉載請注明出處。