動畫的使用會使我們應用的交互性更友好,Android提供了三種動畫,分別是:View動畫、幀動畫以及屬性動畫。①View動畫是通過對某個對象不斷地做圖像變換(支持四種變換:平移、縮放、旋轉、透明度)從而產生動畫效果。②幀動畫通過順序播放一系列圖像從而產生動畫效果,相當於放電影一幀一幀的播放。③屬性動畫是API 11引入的新特性,功能更加強大,在低版本中無法使用,當然可以使用兼容庫來使用它。
一、View動畫
View動畫支持平移動畫、縮放動畫、旋轉動畫和透明度動畫四種,這四種動畫對應着Animation 的四個子類:TranslateAnimation、ScaleAnimation、RotateAnimation和AlphaAnimation,它們對應的xml標籤是<translate>、<scale>、<rotate>和<alpha>,主要使用參數如下:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:shareInterpolator="true">
<alpha
android:fromAlpha="float"
android:toAlpha="float" />
<scale
android:fromXScale="float"
android:fromYScale="float"
android:pivotX="float"
android:pivotY="float"
android:toXScale="float"
android:toYScale="float" />
<translate
android:fromXDelta="float"
android:fromYDelta="float"
android:toXDelta="float"
android:toYDelta="float" />
<rotate
android:fromDegrees="float"
android:pivotX="float"
android:pivotY="float"
android:toDegrees="float" />
</set>
View動畫可以是單個動畫也可以是由一系列動畫組成,<set>表示動畫集合。
android:fromAlpha="float" 表示開始透明度
android:toAlpha="float"
android:fromXScale="float" X軸縮放起始值
android:fromYScale="float" Y軸方向起始值
android:pivotX="float" 縮放中心點x座標
android:pivotY="float" 縮放中心點Y座標
android:toXScale="float" X軸結束值
android:toYScale="float" Y軸結束值
android:fromXDelta="float" X起始值
android:fromYDelta="float" Y起始值
android:toXDelta="float" X結束值
android:toYDelta="float" Y結束值
android:fromDegrees="float" 旋轉開始的角度
android:pivotX="float" 旋轉中心X座標
android:pivotY="float" 旋轉中心Y座標
android:toDegrees="float" 旋轉結束的角度
android:interpolator="@android:anim/accelerate_decelerate_interpolator“ 設置動畫的差值器
android:shareInterpolator="true" 表示該動畫集合是否共享一個差值器
除了以上這些主要屬性外,還有duration:表示動畫持續時間,fillAfter:表示動畫結束以後是否停留在動畫結束位置等等。
注意這幾個的取值問題:
fromXScale/fromYScale:起始的X(Y)方向上相對自身的縮放比例,浮點值,比如1.0代表無變化,0.5表示爲自身的0.5倍,2.0表示自身的兩倍。
pivotX/pivotY:縮放起點X(Y)軸座標,取值可以是具體數值,百分數,百分數p這三種形式。例如:100表示相對當前view的左上角加上100px作爲起始點,50%表示在當前控件的左上角加上自己寬度的50%作爲起始點,50&p表示在當前view的左上角加上父控件的寬度的50%作爲起始點。
fromXDelta/fromYDelta:取值類型與pivotX/pivotY相同。
如何使用View動畫:
1、使用XML文件:
①#scale_anim
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2000"
android:fromXScale="0.3"
android:fromYScale="0.3"
android:repeatCount="infinite"
android:repeatMode="restart"
android:pivotY="50%"
android:pivotX="50%"
android:interpolator="@android:anim/linear_interpolator"
android:toXScale="1"
android:toYScale="1.6" />
②#translate_anim
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2000"
android:fromXDelta="-100%"
android:fromYDelta="-100%"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:toXDelta="0"
android:toYDelta="0"/>
③#rotate_anim
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/decelerate_interpolator"
android:repeatCount="infinite"
android:fromDegrees="0"
android:duration="2000"
android:repeatMode="reverse"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="360" />
④#alpha_anim
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2000"
android:fromAlpha="0"
android:interpolator="@android:anim/linear_interpolator"
android:toAlpha="0.7" />
在java代碼中使用類AnimationUtils的靜態方法loadAnimation加載動畫,調用view的startAnimation方法播放動畫,當然這些動畫可以使用<set>標籤進行組合來達到其他效果。
Animation animation = AnimationUtils.loadAnimation(getContext(),R.anim.alpha_anim);
button.startAnimation(animation);
2、通過代碼來應用:
例如:
AlphaAnimation alphaAnimation = new AlphaAnimation(0.3f,1);
alphaAnimation.setDuration(1000);
button.startAnimation(alphaAnimation);
注意:View動畫是對View的影像做動畫,並不是真正的改變view的狀態,因此有的時候會出現動畫完成後View無法隱藏的現象,就是說setVisibility(View.GONE)方法不起總用,此時只需要調用view.clearAnimation()方法清除View動畫就可以解決這個問題了。
二、幀動畫
幀動畫表示順序播放一組預先定義好的圖片,類似電影播放,系統提供了AnimationDrawable來使用幀動畫。幀動畫的使用比較簡單,首先通過XML文件來定義一個AnimationDrawable,例如:
drawable/frame_anim.xml
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="true">
<item android:drawable="@mipmap/a" android:duration="300"/>
<item android:drawable="@mipmap/b" android:duration="300"/>
<item android:drawable="@mipmap/c" android:duration="300"/>
</animation-list>
<pre name="code" class="html">android:oneshot 爲true表示動畫只播放一次,爲false表示一直播放
animation_view.clearAnimation();
animation_view.setBackgroundResource(R.drawable.frame_anim);
AnimationDrawable drawable = (AnimationDrawable)animation_view.getBackground();
drawable.start();
幀動畫在使用時要注意使用的圖片不要太大否則可能會引起OOM異常。