當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > 屬性動畫
Android提供了幾種動畫類型:View Animation(補間動畫) 、Drawable Animation (幀動畫)、Property Animation (屬性動畫)。View Animation相當(dāng)簡單,不過只能支持簡單的縮放、平移、旋轉(zhuǎn)、透明度基本的動畫,且有一定的局限性。比如:你希望View有一個顏色的切換動畫;你 希望可以使用3D旋轉(zhuǎn)動畫;你希望當(dāng)動畫停止時,View的位置就是當(dāng)前的位置;這些View Animation都無法做到。這就是Property Animation產(chǎn)生的 原因。
新引入的屬性動畫機制已經(jīng)不再是針對于View來設(shè)計的了,也不限定于只能實現(xiàn)移動、縮放、旋轉(zhuǎn)和淡入淡出這幾種動畫操作,同時也不再只是一 種視覺上的動畫效果了。它實際上是一種不斷地對值進(jìn)行操作的機制,并將值賦值到指定對象的指定屬性上,可以是任意對象的任意屬性。
一、相關(guān)API
ObjectAnimator 動畫的執(zhí)行類
ValueAnimator 動畫的執(zhí)行類
AnimatorSet 用于控制一組動畫的執(zhí)行
setDuration() 設(shè)置動畫時間
start() 開始動畫
cancel() 停止動畫在當(dāng)前位置
end() 動畫直接到終狀態(tài)
setRepeatMode 設(shè)置動畫重復(fù)方式
setRepeatCount設(shè)置動畫重復(fù)次數(shù)
二、ObjectAnimator使用
ObjectAnimator是屬性動畫框架中重要的實現(xiàn)類,創(chuàng)建一個ObjectAnimator只需要通過它的靜態(tài)方法直接返回一個ObjectAnimator對象。靜態(tài)方 法如下:
ofFloat(Object target, String propertyName, float... values);
ofInt(Object target, String propertyName, int... values);
ofObject(Object target, String propertyName, TypeEvaluator evaluator, Object... values);
這里先關(guān)注ofFloat、ofint,方法中有三個參數(shù):
Target:指定執(zhí)行動畫的view
propertyName:指定動畫的屬性
values:可變數(shù)組參數(shù),指定屬性對應(yīng)的屬性值
如下所示,給imageview設(shè)置漸變的動畫。
ObjectAnimator animator = ObjectAnimator.ofFloat(imageview, "alpha", 1.0f, 0.0f);
// 設(shè)置時間
animator. setDuration(1000);
// 開始動畫
animator.start();
下面列舉出一些可以直接使用的屬性:
translationX、translationY:這兩個屬性作為一種增量來控制著View對象從它布局容器的左上角坐標(biāo)開始的位置。
rotation、rotationX、rotationY:這三個屬性控制著View對象圍繞它的支點進(jìn)行2D和3D的旋轉(zhuǎn)。
scaleX和scaleY:這兩個屬性控制著View對象圍繞它的支點進(jìn)行2D縮放。
alpha:它表示View對象的alpha透明度。
二、ValueAnimator使用
ValueAnimator是整個屬性動畫中核心的一個類,前面介紹的ObjectAnimator也是繼承自ValueAnimator。
ValueAnimator本身不提供任何動畫效果,它更像一個數(shù)值發(fā)生器,用來產(chǎn)生具有一定規(guī)律的數(shù)字,從而讓調(diào)用者來控制動畫的實現(xiàn)過程。通常情 況下,在ValueAnimator的AnimatorUpdateListener中監(jiān)聽數(shù)值的變化,從而完成動畫的切換。
如下所示,利用ValueAnimator給imageview設(shè)置漸變的動畫。
ValueAnimator animator = ValueAnimator.ofFloat(1.0f, 0.0f);
animator.setDuration(1000);
animator.start();
// 反復(fù)循環(huán),REATART從頭開始循環(huán)
animator.setRepeatMode(ValueAnimator.REVERSE);
animator.setRepeatCount(ValueAnimator.INFINITE);// 無限循環(huán)
animator.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
imageView.setAlpha((Float)animation.getAnimatedValue());
}
});
三、AnimatorSet使用
AnimatorSet這個類來幫我們實現(xiàn)組合屬性動畫的效果。AnimatorSet這個類提供了一個play()方法,如果我們向這個方法中傳入一個Animator對象 (ObjectAnimator或者ValueAnimator)將會返回一個AnimatorSet.Builder的實例,AnimatorSet.Builder中包含了以下四個方法:
after(Animator anim) : 將現(xiàn)有動畫插入到傳入的動畫之后執(zhí)行。
after(long delay):將現(xiàn)有的動畫延遲指定的毫秒后執(zhí)行。
before(Animator anim):將現(xiàn)有的動畫插入到傳入的動畫之前執(zhí)行。
with(Animator anim):將現(xiàn)有的動畫和傳入的動畫同時執(zhí)行。
// 移動動畫
ObjectAnimator transAnimator = ObjectAnimator.ofFloat(mTextView, "translationX", -500f, 300f);
// 旋轉(zhuǎn)動畫
ObjectAnimator rotationAnimator = ObjectAnimator.ofFloat(mTextView, "rotation", 0f, 360f);
// 淡入淡出
ObjectAnimator alphaAnimator = ObjectAnimator.ofFloat(mTextView, "alpha", 1f, 0f, 1f);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.play(rotationAnimator).with(alphaAnimator).after(transAnimator);
animatorSet.setDuration(5000);
animatorSet.start();
四、Animator監(jiān)聽器
對于動畫,一般都是一些輔助效果,比喻說一個view動畫結(jié)束后里一個view開始動畫,這就需要對動畫過程進(jìn)行監(jiān)聽。通過實現(xiàn)AnimatorListener 接口即可對動畫的Start、End、Repeat、Cancel四個狀態(tài)監(jiān)聽。
animator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
Log.e("tag", "onAnimationStart");
}
@Override
public void onAnimationEnd(Animator animation) {
Log.e("tag", "onAnimationEnd");
}
@Override
public void onAnimationCancel(Animator animation) {
Log.e("tag", "onAnimationCancel");
}
@Override
public void onAnimationRepeat(Animator animation) {
Log.e("tag", "onAnimationRepeat");
}
})