Android中的動畫效果一直是阻礙新手進(jìn)步的絆腳石瓢对,每次看到酷炫的動畫靠胜,總?cè)滩蛔∠胍约鹤雒瘸模瑓s不知從何開始饮醇,慢慢的就放棄了。今天我將從Android View動畫框架到Android3.0后的屬性動畫進(jìn)行學(xué)習(xí)總結(jié),并實現(xiàn)一些簡單的動畫效果。
一怎炊、Anroid View動畫框架
Animation框架定義了透明度、旋轉(zhuǎn)祠墅、縮放和位移幾種常見的動畫,而且控制的是整個View
實現(xiàn)原理就是每次繪制視圖時View所在的ViewGroup中的drawChild函數(shù)獲取改View的Animation的Transformation值歌径,然后調(diào)用canvas.concat(transformToApply.getMatrix()),通過矩陣運算完成動畫幀毁嗦。如果動畫沒有完成,就繼續(xù)調(diào)用incalidate()函數(shù)回铛,啟動下次繪制來驅(qū)動動畫金矛,從而來完成整個動畫的繪制
優(yōu)勢:效率高且使用方便
不足:不具備交互性(當(dāng)某個元素發(fā)生視圖動畫后,其響應(yīng)時間的位置還依然在動畫前的地方)
動畫方式:
1.透明度動畫(為視圖增加透明度的變換動畫)
AlphaAnimation alphaAnimation = new AlphaAnimation(0,1);
alphaAnimation.setDuration(1000);
view.startAnimation(alphaAnimation);
2.旋轉(zhuǎn)動畫(為視圖增加旋轉(zhuǎn)的變換動畫)
RotateAnimation rotateAnimation = new RotateAnimation(0,360,100,100);
rotateAnimation.setDuration(1000);
view.startAnimation(rotateAnimation);
//其參數(shù)分別為起始角度和旋轉(zhuǎn)中心點的坐標(biāo)勺届,可以通過設(shè)置參數(shù)來控制旋轉(zhuǎn)動畫的參考系
//這里設(shè)置旋轉(zhuǎn)參考系為自身的中心點
RotateAnimation rotateAnimation = new RotateAnimation(0,360,
RotateAnimation.RELATIVE_TO_SELF,0.5F,
RotateAnimation.RELATIVE_TO_SELF,0.5F);
3.位移動畫(為視圖移動式增加位移動畫)
TranslateAnimation translateAnimation = new TranslateAnimation(0,200,0,300);
translateAnimation.setDuration(1000);
view.startAnimation(translateAnimation);
4.縮放動畫(為視圖的縮放增加動畫)
ScaleAnimation scaleAnimation = new ScaleAnimation(0,2,0,2);
scaleAnimation.setDuration(1000);
view.startAnimation(scaleAnimation);
//縮放動畫與旋轉(zhuǎn)動畫一樣,可以設(shè)置縮放的中心點
ScaleAnimation scaleAnimation = new ScaleAnimation(0,1,0,1,
Animation.RELATIVE_TO_SELF,0.5F,
Animation.RELATIVE_TO_SELF,0.5F);
5.動畫集合(通過AnimationSet娶耍,可以將動畫以組合的形式展現(xiàn)出來)
AnimationSetd set = new Animation(true);
set.setDuration(1000);
AlphaAnimation alphaAnimation = new AlphaAnimation(0,1);
alphaAnimation.setDuration(1000);
set.add(alphaAnimation)
TranslateAnimation translateAnimation = new TranslateAnimation(0,200,0,300);
translateAnimation.setDuration(1000);
set.add(translateAnimation)
view.startAnimation(set);
對于動畫事件免姿,Android也提供了對應(yīng)的監(jiān)聽回調(diào),可以添加相應(yīng)的監(jiān)聽方法榕酒。
alphaAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
通過這個監(jiān)聽回調(diào)胚膊,可以獲取到動畫的開始故俐、結(jié)束和重復(fù)時間,并針對相應(yīng)的事件做出不同的處理紊婉。
二药版、屬性動畫分析
Animator框架中使用最多的就是AnimatorSet和ObjectAnimator配合,使用ObjectAnimator進(jìn)行更精細(xì)化的控制喻犁,只控制一個對象的一個屬性值槽片,而使用多個ObjectAnimator組合到AnimatorSetin 形成一個動畫。
1.ObjectAnimator
ObjectAnimator是屬性動畫框架中最重要的實行類肢础,創(chuàng)建一個ObjectAnimator只需要通過他的靜態(tài)工廠類直接返回一個ObjectAnimator對象还栓。
ObjectAnimator animator = ObjectAnimator.ofFloat(
textView,
"translationY",
500F);
參數(shù)包括一個對象和對象的屬性名字,這個屬性必須有g(shù)et和set函數(shù)传轰,內(nèi)部會通過java反射機制來調(diào)用set函數(shù)修改對象的屬性值剩盒。同樣也可以調(diào)用setInterpolator設(shè)置相應(yīng)的插值器。
下面是一些常用的可以直接使用的屬性動畫的屬性值
- tranlationX和tranlationY:這兩個屬性作為一種增量來控制著view對象從它布局容器的左上角坐標(biāo)偏移的位置慨蛙。
- rotation辽聊、rotationX和rotationY:這三個屬性控制View對象圍繞支點進(jìn)行2D和3D旋轉(zhuǎn)。
- scaleX和scaleY:這兩個屬性控制著View對象圍繞它的支點進(jìn)行2D縮放期贫。
- pivotX和pivotY:這兩個屬性控制著View對象的支點位置跟匆,圍繞這個支點進(jìn)行旋轉(zhuǎn)和縮放變換處理,默認(rèn)狀況下唯灵,該支點的位置就是View對象的中心點贾铝。
- x和y:這是兩個簡單使用的屬性,它描述View對象在它容器中的最終位置埠帕,它是最初的左上角坐標(biāo)和translationX,translationY值的累計和垢揩。
- alpha:它表示View對象的alpha透明度。默認(rèn)為1(不透明)敛瓷,0代表完全透明(不可見)叁巨。
如果一個屬性沒有set/get方法可以通過以下兩個方法實現(xiàn):
1)通過自定義一個屬性類或者包裝類,來間接的給這個屬性增加get/set方法
//使用包裝類的方法給一個屬性增加get/set方法
private static class WrapperView {
private View mTarget;
public WrapperView(View mTarget) {
this.mTarget = mTarget;
}
public int getWidth() {
return mTarget.getLayoutParams().width;
}
void setWidth(int width) {
mTarget.getLayoutParams().width = width;
mTarget.requestLayout();
}
}
//通過以上代碼呐籽,就給屬性包裝了一層锋勺,并給他提供了get/set方法。使用如下:
WrapperView wrapper = new WrapperView(mButton);
ObjectAnimator.ofInt(wrapper,"width",500).setDuration(1000).start();
2)通過ValueAnimator來實現(xiàn)狡蝶。
2.ValueAnimator
ValueAnimator在屬性動畫中占有非常重要的地位庶橱,ObjectAnimator也是繼承自ValueAnimator。
public final class ObjectAnimator extends ValueAnimator
ValueAnimator本身不提供任何動畫效果贪惹,它更像一個數(shù)值發(fā)生器苏章,用來產(chǎn)生具有一定規(guī)律的數(shù)字,從而讓調(diào)用者來控制動畫的實現(xiàn)過程。
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 100);
valueAnimator.addUpdateListener(new valueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
String message = "$" + (Integer) animation.getAnimatedValue();
textView5.setText(message);
}
});
valueAnimator.setDuration(10 * 1000);
valueAnimator.start();
//在ValueAnimator的AnimatorUpdateListener中監(jiān)聽數(shù)值的變換枫绅,從而完成動畫的變換泉孩。
3.PropertyValuesHolder
PropertyValuesHolder類似視圖動畫中的AnimationSet,在屬性動畫中,如果針對同一個對象的多個屬性并淋,要同時作用多種動畫寓搬,可以使用PropertyValuesHolder來實現(xiàn)。
PropertyValuesHolder propertyValuesHolder = PropertyValuesHolder.ofFloat("translationX",300);
PropertyValuesHolder propertyValuesHolder1 = PropertyValuesHolder.ofFloat("ScaleX",1f,0,1f);
ObjectAnimator.ofPropertyValuesHolder(propertyValuesHolder,propertyValuesHolder1)
.setDuration(1000)
.start();
4.AnimatorSet
對于一個屬性同時作用多個屬性動畫效果县耽,還可以使用AnimatorSet實現(xiàn)相應(yīng)的效果句喷,同時還能實現(xiàn)更為精確的順順序控制。
ObjectAnimator animator = ObjectAnimator.ofFloat(textView,"translationY", -100f);
ObjectAnimator animator1 = ObjectAnimator.ofFloat(textView,"scaleX",1f酬诀,0脏嚷,1f);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playTogether(animator,animator1);
animatorSet.setDuration(100);
animatorSet.start();
//在屬性動畫中,Animator正是通過playTogether()瞒御、playSequentially()父叙、animatorSet.play().with()、before()肴裙、after()這些方法來控制多個動畫的協(xié)同工作方式趾唱,從而做到對動畫播放順訊的精確控制。
5.在XML中使用屬性動畫
屬性動畫可以直接寫在XML文件中
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"
android:propertyName="scaleX"
android:valueFrom="1.0"
android:valueTo="2.0"
android:valueType="floatType"
>
</objectAnimator>
//在程序中使用XML定義的屬性動畫
public void scaleX(View view){
Animator animator = AnimatorInflater.loadAnimator(this,R.animator.on);
animator.setTarget(view);
animator.start();
}
6.View的animate方法
在Android3.0之后蜻懦,Google給View增加了animate方法來直接驅(qū)動屬性動畫甜癞。可以認(rèn)為是屬性動畫的一種簡寫方式宛乃。
imageView.animate()
.alpha(0)
.y(300)
.setDuration(1000)
.withStartAction(new Runnable() {
@Override
public void run() {
}
})
.withEndAction(new Runnable() {
@Override
public void run() {
}
})
.start();
Android動畫部分暫時記錄至此悠咱,進(jìn)階還需繼續(xù)深入,共勉征炼!