1. 程式人生 > >Android 動畫三種 摘要

Android 動畫三種 摘要

動畫三種   1幀動畫 2view 3屬性動畫

A 幀動畫 是把一些列圖片類似於播放展示  

  1. img_loding.setImageResource(R.drawable.loading_animation);  
  2. animationDrawable = (AnimationDrawable) img_loding.getDrawable();  
  3. animationDrawable.start(); //Drawable作為View的背景並通過Drawable來播放動畫

  B View 動畫

     PS:

View動畫改變的只是顯示,並不能在新的位置響應事件。

同理,有時候會出現動畫完成後View無法隱藏的現象,即setVisibility(View.GONE)失效,這時只需

呼叫view.clearAnimation()清除View動畫即可解決問題。


    

  1  在程式碼裡使用XML中定義好的動畫:

Animation animation = AnimationUtils.loadAnimation(this, R.anim.animation_demo);

view.startAnimation(animation);

  2  在程式碼裡直接使用View動畫

示例:

 AlphaAnimation animation = new AlphaAnimation(0,1);

animation.setDuration(1000);

view.startAnimation(animation);

動畫集合示例: 

AnimationSet set = new AnimationSet(true);

set.setDuration(1000);

 AlphaAnimation animation1 = new AlphaAnimation(0,1);

animation1.setDuration(1000);

TranslateAnimation animation2 = new TranslateAnimation(0,100, 0, 200);

animation2.setDuration(1000);

set.addAnimation(animation1);

set.addAnimation(animation2);

view.startAnimation(set);

//動畫監聽

animation.setAnimationListener(new Animation.AnimationListener(){

@Override

public void onAnimationStart(Animation animation){

//動畫開始時

}

@Override

public void onAnimationEnd(Animation animation){

//動畫結束時

}

@Override

public void onAnimationRepeat(Animation animation){

//動畫重複時

}

});


3 屬性動畫 ps Android11 3.0 才加入 object必須提供setA方法,如果動畫沒有傳遞初始值,還必須提供getA方法,因為系統要去獲取屬性a的初始值(如果獲取不到初始值,程式直接crash


3.1 ValueAnimator

ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f, 3f, 5f); 

anim.setDuration(1000); 

anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {  

@Override  

public void onAnimationUpdate(ValueAnimator animation) {  

float currentValue = (float) animation.getAnimatedValue(); 

}); 

anim.start();

3.2

ObjectAnimator

ObjectAnimator scaleXAnimator = ObjectAnimator.ofFloat(image, "scaleX", 0f, 1f);
ObjectAnimator scaleYAnimator = ObjectAnimator.ofFloat(image, "scaleY", 0f, 1f);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playTogether(scaleXAnimator, scaleYAnimator);
// 設定插值器
animatorSet.setInterpolator(new JellyInterpolator());
animatorSet.setDuration(3000);
animatorSet.start();
animator.addListener(new Animator.AnimatorListener() {
    @Override
    public void onAnimationStart(Animator animator) {
    }
    @Override
    public void onAnimationEnd(Animator animator) {
    }
    @Override
    public void onAnimationCancel(Animator animator) {
    }

    @Override
    public void onAnimationRepeat(Animator animator) {
    }
});


Android 3.0 之後,Google給View增加了animate方法來直接驅動 屬性動畫,它可以被認為是屬性動畫的一種簡寫方式。

java]  view plain  copy
  1. private void animateButtonsIn() {  
  2.     for (int i = 0; i < bgViewGroup.getChildCount(); i++) {  
  3.         View child = bgViewGroup.getChildAt(i);  
  4.         child.animate()  
  5.                 .setStartDelay(100 + i * DELAY)  
  6.                 .setInterpolator(interpolator)  
  7.                 .alpha(1)  
  8.                 .scaleX(1)  
  9.                 .scaleY(1);  
  10.     }