本文將按視圖動畫和屬性動畫講解。
android3.0之前視圖動畫一家獨大,使用也非常簡單,提供了AlphaAnimation(透明度),RotateAnimation(旋轉動畫),TranslateAnimation(平移動畫),ScaleAnimation(放大縮小動畫)。android3.0之後,出現屬性動畫,由於視圖動畫交互事件的缺陷性(視圖動畫後事件的相應依舊在原動畫位置),屬性動畫得到了開發者的青睞。
一、視圖動畫
1.透明度動畫
/**
* 透明度動畫
*/
private void alphaAnim(){
AlphaAnimation anim=new AlphaAnimation(1.0f,0.5f);
anim.setDuration(500);
slideTv.startAnimation(anim);
}
2.旋轉動畫
/**
* 旋轉動畫
*/
private void rotateAnim(){
//參數:起始角度,終止角度,中心的座標[0,0]
RotateAnimation anim= new RotateAnimation(90,180,0,0);
anim.setDuration(500);
slideTv.startAnimation(anim);
}
3.平移動畫
/**
* 平移動畫
*/
private void translateAnim(){
//參數:x起始位置,x終止位置,y起始位置,y終止位置
TranslateAnimation anim= new TranslateAnimation(0,100,0,300);
anim.setDuration(500);
slideTv.startAnimation(anim);
}
4.放大縮小
/**
* 放大縮小動畫
*/
private void scaleAnim(){
//參數:x起始倍數,x終止倍數,y倍數位置,y終止倍數。1爲原始,大於1放大,小於1縮小
ScaleAnimation anim= new ScaleAnimation(1,1.5f,1,1.5f);
anim.setDuration(500);
slideTv.startAnimation(anim);
}
5.AnimationSet動畫集,同時執行放大,縮小,透明度等動畫
private void animSet(){
AnimationSet anim= new AnimationSet(true);
anim.setDuration(500);
ScaleAnimation Sanim= new ScaleAnimation(1,1.5f,1,1.5f);
Sanim.setDuration(500);
anim.addAnimation(Sanim);
TranslateAnimation Tanim= new TranslateAnimation(0,100,0,300);
Tanim.setDuration(500);
anim.addAnimation(Tanim);
slideTv.startAnimation(anim);
}
二、屬性動畫
1.ObjectAnimatior是屬性動畫框架重要的實行類,需要注意的是屬性動畫的實施需要對象的屬性必須有set和get方法,android內部會通過反射機制調用到set函數對對象的屬性進行修改。
先通過ObjectAnimtor實現上述的透明度,旋轉,平移,放大縮小:
/**
* 透明度動畫
*/
private void objAlphaAnim(){
/**
* 屬性值只有:alpha
*/
ObjectAnimator anim=ObjectAnimator.ofFloat(slideTv,"alpha",0.5f);
anim.setDuration(500);
anim.start();
}
/**
* 旋轉動畫
*/
private void objRotateAnim(){
/**
* 表示橫向中心旋轉360
* 屬性值:rotationX,rotationY,rotation
*/
ObjectAnimator anim=ObjectAnimator.ofFloat(slideTv,"rotationX",360);
anim.setDuration(1500);
anim.start();
}
/**
* 平移動畫
*/
private void objTranslateAnim(){
/**
* 表示從距離當前位置200處向距離當前100處移動,然後從距離當前100處移動到距離當前三百處
* 屬性值:translationX,translationY
*/
ObjectAnimator anim=ObjectAnimator.ofFloat(slideTv,"translationX",200,100,300);
anim.setDuration(1500);
anim.start();
}
/**
* 放大縮小動畫
*/
private void objScaleAnim(){
/**
* 屬性值:scaleX,scaleY
*/
ObjectAnimator anim=ObjectAnimator.ofFloat(slideTv,"scaleX",0.2f);
anim.setDuration(500);
anim.start();
}
2.PropertyValuesHolder
該它類似視圖動畫中的動畫集AnimationSet,可以實現多種動畫一起播放,譬如:x,y軸的同時位移,如果只使用ObjectAnimation只能順序的播放x方向位移,再播放y方向的位移。
private void objAnimSet(){
PropertyValuesHolder pvh1=PropertyValuesHolder.ofFloat("scaleX",1.2f);
PropertyValuesHolder pvh2=PropertyValuesHolder.ofFloat("scaleY",1.2f);
PropertyValuesHolder pvh3=PropertyValuesHolder.ofFloat("translationX",100);
PropertyValuesHolder pvh4=PropertyValuesHolder.ofFloat("translationY",100);
PropertyValuesHolder pvh5=PropertyValuesHolder.ofFloat("alpha",0.3f);
ObjectAnimator.ofPropertyValuesHolder(slideTv,pvh1,pvh2,pvh3,pvh4,pvh5).setDuration(2000).start();
}
3.ValueAnimtor
ValueAnimtor本身不提供任何的動畫效果,ObjectAnimtor繼承自ValueAnimtor,ValueAnimtor更像一個數值監聽器,監聽數值變化完成動畫效果。
我們寫一個需求:當滑動view時,不斷變化其背景色,效果圖:
代碼:
private void valueAnim(int offSetX){
ValueAnimator anim=ValueAnimator.ofFloat(0,offSetX);
anim.setDuration(300);
anim.start();
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
if((float)animation.getAnimatedValue()%3==0){
slideTv.setBackgroundResource(R.color.test1);
}else if((float)animation.getAnimatedValue()%3==1){
slideTv.setBackgroundResource(R.color.test2);
}else {
slideTv.setBackgroundResource(R.color.test3);
}
}
});
}
4.AnimatorSet
注意AnimatorSet和視圖動畫中的AnimationSet拼寫是不一樣的。但它和視圖動畫都能同時完成幾個動畫效果。它能和PropertyValuesHolder達到同樣的效果,且比PropertyValuesHolder有更豐富的效果,譬如:通過playTogether,playSequentially等對動畫播放順序進行精確控制。
private void objAnimSet(){
ObjectAnimator anim1=ObjectAnimator.ofFloat(slideTv,"scaleX",1.2f);
ObjectAnimator anim2=ObjectAnimator.ofFloat(slideTv,"translationY",300);
ObjectAnimator anim3=ObjectAnimator.ofFloat(slideTv,"alpha",0.2f,1f);
AnimatorSet set=new AnimatorSet();
set.setDuration(1000);
set.playTogether(anim1,anim2,anim3);
set.start();
}
5.view的animate方法
我們也可以直接通過view.animate()方法直接驅動動畫,它相當於屬性動畫的簡寫方式。
private void objViewSet(){
slideTv.animate().alpha(0.2f).translationY(400).withStartAction(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this,"動畫開始",Toast.LENGTH_SHORT).show();
}
}).withEndAction(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this,"end",Toast.LENGTH_SHORT).show();
}
}).setDuration(3000).start();
}