1、view Animation(視圖動畫也稱做補間動畫)java
只能設置view的動畫,效果有:透明度、旋轉、平移、伸縮android
java類名 | xml關鍵字 | 描述信息 |
---|---|---|
AlphaAnimation | <alpha> 放置在res/anim/目錄下 |
漸變透明度動畫效果 |
RotateAnimation | <rotate> 放置在res/anim/目錄下 |
畫面轉移旋轉動畫效果 |
ScaleAnimation | <scale> 放置在res/anim/目錄下 |
漸變尺寸伸縮動畫效果 |
TranslateAnimation | <translate> 放置在res/anim/目錄下 |
畫面轉換位置移動動畫效果 |
AnimationSet | <set> 放置在res/anim/目錄下 |
一個持有其它動畫元素alpha、scale、translate、rotate或者其它set元素的容器 |
Animation類是上表中全部類的基類,屬性和方法有:ide
xml屬性 | java方法 | 解釋 |
---|---|---|
android:detachWallpaper | setDetachWallpaper(boolean) | 是否在壁紙上運行 |
android:duration | setDuration(long) | 動畫持續時間,毫秒爲單位 |
android:fillAfter | setFillAfter(boolean) | 控件動畫結束時是否保持動畫最後的狀態 |
android:fillBefore | setFillBefore(boolean) | 控件動畫結束時是否還原到開始動畫前的狀態 |
android:fillEnabled | setFillEnabled(boolean) | 與android:fillBefore效果相同 |
android:interpolator | setInterpolator(Interpolator) | 設定插值器(指定的動畫效果,譬如回彈等) |
android:repeatCount | setRepeatCount(int) | 重複次數 |
android:repeatMode | setRepeatMode(int) | 重複類型有兩個值,reverse表示倒序回放,restart表示從頭播放 |
android:startOffset | setStartOffset(long) | 調用start函數以後等待開始運行的時間,單位爲毫秒 |
android:zAdjustment | setZAdjustment(int) | 表示被設置動畫的內容運行時在Z軸上的位置(top/bottom/normal),默認爲normal |
Alpha屬性和方法函數
xml屬性 | java方法 | 解釋 |
---|---|---|
android:fromAlpha | AlphaAnimation(float fromAlpha, …) | 動畫開始的透明度(0.0到1.0,0.0是全透明,1.0是不透明) |
android:toAlpha | AlphaAnimation(…, float toAlpha) | 動畫結束的透明度,同上 |
xml屬性 | java方法 | 解釋 |
---|---|---|
android:fromDegrees | RotateAnimation(float fromDegrees, …) | 旋轉開始角度,正表明順時針度數,負表明逆時針度數 |
android:toDegrees | RotateAnimation(…, float toDegrees, …) | 旋轉結束角度,正表明順時針度數,負表明逆時針度數 |
android:pivotX | RotateAnimation(…, float pivotX, …) | 縮放起點X座標(數值、百分數、百分數p,譬如50表示以當前View左上角座標加50px爲初始點、50%表示以當前View的左上角加上當前View寬高的50%作爲初始點、50%p表示以當前View的左上角加上父控件寬高的50%作爲初始點) |
android:pivotY | RotateAnimation(…, float pivotY) | 縮放起點Y座標,同上規律 |
xml屬性 | java方法 | 解釋 |
---|---|---|
android:fromXScale | ScaleAnimation(float fromX, …) | 初始X軸縮放比例,1.0表示無變化 |
android:toXScale | ScaleAnimation(…, float toX, …) | 結束X軸縮放比例 |
android:fromYScale | ScaleAnimation(…, float fromY, …) | 初始Y軸縮放比例 |
android:toYScale | ScaleAnimation(…, float toY, …) | 結束Y軸縮放比例 |
android:pivotX | ScaleAnimation(…, float pivotX, …) | 縮放起點X軸座標(數值、百分數、百分數p,譬如50表示以當前View左上角座標加50px爲初始點、50%表示以當前View的左上角加上當前View寬高的50%作爲初始點、50%p表示以當前View的左上角加上父控件寬高的50%作爲初始點) |
android:pivotY | ScaleAnimation(…, float pivotY) | 縮放起點Y軸座標,同上規律 |
xml屬性 | java方法 | 解釋 |
---|---|---|
android:fromXDelta | TranslateAnimation(float fromXDelta, …) | 起始點X軸座標(數值、百分數、百分數p,譬如50表示以當前View左上角座標加50px爲初始點、50%表示以當前View的左上角加上當前View寬高的50%作爲初始點、50%p表示以當前View的左上角加上父控件寬高的50%作爲初始點) |
android:fromYDelta | TranslateAnimation(…, float fromYDelta, …) | 起始點Y軸從標,同上規律 |
android:toXDelta | TranslateAnimation(…, float toXDelta, …) | 結束點X軸座標,同上規律 |
android:toYDelta | TranslateAnimation(…, float toYDelta) | 結束點Y軸座標,同上規律 |
補間動畫的使用:佈局
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@[package:]anim/interpolator_resource" android:shareInterpolator=["true" | "false"] > <alpha android:fromAlpha="float" android:toAlpha="float" /> <scale android:fromXScale="float" android:toXScale="float" android:fromYScale="float" android:toYScale="float" android:pivotX="float" android:pivotY="float" /> <translate android:fromXDelta="float" android:toXDelta="float" android:fromYDelta="float" android:toYDelta="float" /> <rotate android:fromDegrees="float" android:toDegrees="float" android:pivotX="float" android:pivotY="float" /> <set> ... </set> </set>
ImageView spaceshipImage = (ImageView) findViewById(R.id.spaceshipImage); Animation hyperspaceJumpAnimation = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump); spaceshipImage.startAnimation(hyperspaceJumpAnimation);
Animation其餘方法動畫
Animation類的方法 | 解釋 |
---|---|
reset() | 重置Animation的初始化 |
cancel() | 取消Animation動畫 |
start() | 開始Animation動畫 |
setAnimationListener(AnimationListener listener) | 給當前Animation設置動畫監聽 |
hasStarted() | 判斷當前Animation是否開始 |
hasEnded() | 判斷當前Animation是否結束 |
View動畫經常使用方法ui
View類的經常使用動畫操做方法 | 解釋 |
---|---|
startAnimation(Animation animation) | 對當前View開始設置的Animation動畫 |
clearAnimation() | 取消當View在執行的Animation動畫 |
插值器this
系統提供的加值器lua
java類 | xml id值 | 描述 |
---|---|---|
AccelerateDecelerateInterpolator | @android:anim/accelerate_decelerate_interpolator | 動畫始末速率較慢,中間加速 |
AccelerateInterpolator | @android:anim/accelerate_interpolator | 動畫開始速率較慢,以後慢慢加速 |
AnticipateInterpolator | @android:anim/anticipate_interpolator | 開始的時候從後向前甩 |
AnticipateOvershootInterpolator | @android:anim/anticipate_overshoot_interpolator | 相似上面AnticipateInterpolator |
BounceInterpolator | @android:anim/bounce_interpolator | 動畫結束時彈起 |
CycleInterpolator | @android:anim/cycle_interpolator | 循環播放速率改變爲正弦曲線 |
DecelerateInterpolator | @android:anim/decelerate_interpolator | 動畫開始快而後慢 |
LinearInterpolator | @android:anim/linear_interpolator | 動畫勻速改變 |
OvershootInterpolator | @android:anim/overshoot_interpolator | 向前彈出必定值以後回到原來位置 |
PathInterpolator | 新增,定義路徑座標後按照路徑座標來跑。 |
使用:<set android:interpolator="@android:anim/accelerate_interpolator"> ... </set>spa
特別特別注意:補間動畫執行以後並未改變View的真實佈局屬性值。切記這一點,譬如咱們在Activity中有一個Button在屏幕上方,咱們設置了平移動畫移動到屏幕下方而後保持動畫最後執行狀態呆在屏幕下方,這時若是點擊屏幕下方動畫執行以後的Button是沒有任何反應的,而點擊原來屏幕上方沒有Button的地方卻響應的是點擊Button的事件。
2、Drawable Animation(幀動畫)
Drawable動畫其實就是Frame動畫(幀動畫),它容許你實現像播放幻燈片同樣的效果,這種動畫的實質實際上是Drawable,因此這種動畫的XML定義方式文件通常放在res/drawable/目錄下。
用法:
<!-- 注意:rocket.xml文件位於res/drawable/目錄下 -->
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot=["true" | "false"] >
<item
android:drawable="@[package:]drawable/drawable_resource_name"
android:duration="integer" />
</animation-list>
ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image);
rocketImage.setBackgroundResource(R.drawable.rocket_thrust);
rocketAnimation = (AnimationDrawable) rocketImage.getBackground();
rocketAnimation.start();
3、Property Animation(屬性動畫)
對android3.0以上版本的android系統纔有效,這種動畫能夠設置給任何Object,能夠自定義任何類型和屬性動畫。
補間動畫的不足:
1:Tween Animation(補間動畫)只是針對於View,超脫了View就沒法操做了,這句話的意思是:假如咱們須要對一個Button,ImageView,LinearLayout或者是其餘的繼承自View的各類組件進行動畫的操做時,Tween Animation是能夠幫咱們完成咱們須要完成的功能的,可是若是咱們須要用到對一個非View的對象進行動畫操做的話,那麼補間動畫就沒辦法實現了。舉個例子:好比咱們有一個自定義的View,在這個View中有一個Point對象用於管理座標,而後在onDraw()方法中的座標就是根據該Pointde座標值進行繪製的。也就是說,若是咱們能夠對Point對象進行動畫操做,那麼整個自定義的View,那麼整個自繼承View的當前類就都有了動畫,可是咱們的目的是不想讓View有動畫,只是對動畫中的Point座標產生動畫,這樣補間動畫就不能知足了。
2:Tween Animation動畫有四種動畫操做(移動,縮放,旋轉,淡入淡出),可是咱們如今有個需求就是將當前View的背景色進行改變呢?抱歉Tween Animation是不能幫助咱們實現的。
3:Tween Animation動畫只是改變View的顯示效果而已,可是不會真正的去改變View的屬性,舉個例子:咱們如今屏幕的頂部有一個小球,而後經過補間動畫讓他移動到右下角,而後咱們給這個小球添加了點擊事件,但願位置移動到右下角的時候點擊小球能的放大小球。可是點擊事件是絕對不會觸發的,緣由是補間動畫只是將該小球繪製到了屏幕的右下角,實際這個小球仍是停在屏幕的頂部,因此你在右下角點擊是沒有任何反應的。
屬性動畫類:
ObjectAnimator 、ViewAnimator、AnimationSet、TypeEvalutors、TimeInterplator
屬性動畫屬性:
Duration:動畫的持續時間
TimeInterPolation:屬性值的計算方式,如先快後慢
TypeEvaluator:根據屬性的開始,結束值與TimeInterpolation計算出的因子計算出當前時間的屬性值
Repeat Count and behavoir:重複次數與方式,如播放3次,5次,無限循環,可讓此動畫一直重複,或 者是播放完時再反向播放。
Animation sets:動畫集合,便可以同時對一個對象應用幾個動畫,這些動畫能夠同時播放也能夠對不一樣的動畫設置不一樣開始偏移。
Frame refresh delay:多少時間刷新一次,即每隔多長時間計算一次屬性值,默認爲10s,最終刷新時間還受系統進程的調度與硬件的影響。
ObjectAnimator 的使用:
ObjectAnimator animator = ObjectAnimator.ofFloat(imageView, "translationX", 0f, 500f);
animator.setDuration(1000);
animator.start();
注意:
1. object必需要提供setXxx方法,若是動畫的時候沒有傳遞初始值,那麼還要提供getXxx方法,由於系統要去拿xxx屬性的初始值(若是這條不知足,程序直接Crash)
2. object的setXxx對屬性xxx所作的改變必須可以經過某種方法反映出來,好比會帶來ui的改變啥的(若是這條不知足,動畫無效果但不會Crash)
針對上述問題,Google告訴咱們有3中解決方法:
1. 給你的對象加上get和set方法,若是你有權限的話
2. 用一個類來包裝原始對象,間接爲其提供get和set方法
3. 採用ValueAnimator,監聽動畫過程,本身實現屬性的改變
ValueAnimator的使用:
ValueAnimator自己不做用於任何對象,也就是說直接使用它沒有任何動畫效果。它能夠對一個值作動畫,而後咱們能夠監聽其動畫過程,在動畫過程當中修改咱們的對象的屬性值,這樣也就至關於咱們的對象作了動畫。代碼以下:
ValueAnimator valueAnimator = ValueAnimator.ofInt(1, 100);
valueAnimator.addUpdateListener(new AnimatorUpdateListener() {
//持有一個IntEvaluator對象,方便下面估值的時候使用
private IntEvaluator mEvaluator = new IntEvaluator();
@Override
public void onAnimationUpdate(ValueAnimator animator) {
//得到當前動畫的進度值,整型,1-100之間
int currentValue = (Integer)animator.getAnimatedValue();
Log.d(TAG, current value: + currentValue);
//計算當前進度佔整個動畫過程的比例,浮點型,0-1之間
float fraction = currentValue / 100f;
//這裏我偷懶了,不過有現成的幹嘛不用呢
//直接調用整型估值器經過比例計算出寬度,而後再設給Button
target.getLayoutParams().width = mEvaluator.evaluate(fraction, start, end);
target.requestLayout();
}
});
valueAnimator.setDuration(5000).start();
PropertyValuesHolder 的使用:
PropertyValuesHolder pl1 = PropertyValuesHolder.ofFloat( "rotation", 0f, 360f); PropertyValuesHolder pl2 = PropertyValuesHolder.ofFloat( "translationX", 0f, 200f); PropertyValuesHolder pl3 = PropertyValuesHolder.ofFloat( "translationY", 0f, 200f); ObjectAnimator.ofPropertyValuesHolder(imageView, pl1, pl2, pl3).setDuration(1000).start();
四 onDraw動畫