1. 程式人生 > >Android動畫

Android動畫

補間動畫

補間動畫主要由四種
Alpha透明度動畫
Scale尺寸縮放動畫
Translate位置移動動畫
Rotate旋轉動畫
補間動畫的共同屬性
Duration:動畫持續時間(單位:毫秒)
FillAfter:設定為true,動畫轉化在動畫結束後被應用。
Interpolator:動畫插入器(加速減速插入器)
repeatCount:動畫重複的次數
repeatMode:順序重複、倒敘重複
startOffset:動畫之間的時間間隔(應用於組合動畫)
動畫實現方式
1 配置檔案(/res/anim)—alpha、scale、translate、rotate(更簡單)
2 java程式碼實現——AlphaAnimation、ScaleAnimation、TranslateAnimation、RotateAnimation(更靈活)
例如
用java程式碼去建立

//建立Alpha動畫(透明度為10%-100%)
        Animation ani=new AlphaAnimation(0.1f, 1.0f);

        //設定動畫時間為5秒
        ani.setDuration(5000);

        //開始播放
        iv.startAnimation(ani);
配置檔案
//解析動畫檔案,生成動畫物件
        Animation ani = AnimationUtils.loadAnimation(this, R.anim.set);

        iv.startAnimation(ani);

        //註冊動畫監聽器
ani.setAnimationListener(new AnimationListener() { //當動畫開始播放時,呼叫該方法 @Override public void onAnimationStart(Animation animation) { } //當動畫重複播放時,呼叫該方法 @Override public void onAnimationRepeat(Animation animation) { } //當動畫播放完畢後,呼叫該方法
@Override public void onAnimationEnd(Animation animation) { }

AlphaAnimation
fromAlpha動畫起始時的透明度 (1.0表示完全不透明)
toAlpha動畫終止時的透明度 (0.0表示完全透明)
ScaleAnimation
fromX,toX分別是起始和結束時x座標上的伸縮尺寸
fromY,toY分別是起始和結束時y座標上的伸縮尺寸
pivotX,pivotY分別為伸縮動畫相對於x,y軸開始位置
Translate
fromXDelta,fromYDelta分別是起始的X,Y的座標
toXDelta,toYDelta分別是結束時X,Y的座標
RotateAnimation
fromDegrees
toDegrees
pivotX,pivotY分別宣戰動畫相對於x,y的座標開始位置

幀動畫(Frame Animation)

概念
幀動畫是一種常見的動畫形式(Frame by frame),其原理是在“連續的關鍵幀”中分解動畫動作,也就是在時間軸上逐幀繪製不同的內容,使其連續播放而成動畫。
幀動畫實現
使用載入配置檔案
1. 將圖片資源拷貝到drawable資源目錄中
2. 在drawable目錄中建立幀動畫配置檔案,在該檔案中配置動畫所需圖片,以及每個圖片停留時間。

<animation-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item
    android:drawable="幀圖片的資源id"
    android:duration="播放該幀的時間"/>
<item
    android:drawable="幀圖片的資源id"
    android:duration="播放該幀的時間"/>
</animation-list>
//載入xml逐幀動畫資源
imageView.setImageResource(R.drawable.btn_animation);
aniDrawable = (AnimationDrawable) imageView.getDrawable();
//播放動畫
aniDrawable.setOneShot(true);
aniDrawable.start();
//停止動畫
//aniDrawable.stop();   
//檢查動畫是否正在播放
//aniDrawable.isRunning();
使用Java程式碼建立
//建立動畫物件
AnimationDrawable aniDrawable = new AnimationDrawable();
//設定每一幀的幀圖片,每一幀播放時間
aniDrawable.addFrame(this.getResources().getDrawable(R.drawable.inc_btn_emphasize_normal), 100);
aniDrawable.addFrame(this.getResources().getDrawable(R.drawable.inc_btn_emphasize_pressed), 100);
aniDrawable.addFrame(this.getResources().getDrawable(R.drawable.inc_btn_normal), 100);
aniDrawable.addFrame(this.getResources().getDrawable(R.drawable.inc_btn_pressed), 100);

imageView.setImageDrawable(aniDrawable);

例子:

//設定資原始檔
        iv_down.setImageResource(R.drawable.anim_frame_down);
  //獲取資原始檔
        anim_down = (AnimationDrawable) iv_down.getDrawable();
//設定監聽
        btn_down.setOnClickListener(this);

屬性動畫(Property Animation)

一個屬性動畫的實現
//引數:
//動畫作用目標
//屬性
//屬性值
ObjectAnimator animator = ObjectAnimator.ofFloat(iv, "translationX", 0, 100);
animator.setDuration(2000);
animator.start();

Animation動畫框架僅僅只是讓影象發生位移,而監聽事件依然在原地。而屬性動畫可以移動讓監聽事件也跟著移動。

多個屬性動畫實現01
PropertyValuesHolder p01 = PropertyValuesHolder.ofFloat("translationX", 0, 100);
PropertyValuesHolder p02 = PropertyValuesHolder.ofFloat("translationY", 0, 100);
PropertyValuesHolder p03 = PropertyValuesHolder.ofFloat("rotation", 0, 360);
ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(iv, p01, p02, p03);
animator.setDuration(2000);
animator.start();

多個屬性動畫實現02

ObjectAnimator oa01 = ObjectAnimator.ofFloat(iv, "translationX", 0, 50);
ObjectAnimator oa02 = ObjectAnimator.ofFloat(iv, "translationY", 0, 50);
ObjectAnimator oa03 = ObjectAnimator.ofFloat(iv, "rotation", 0, 360);
AnimatorSet set = new AnimatorSet();
//同時播放
//set.playTogether(oa01, oa02, oa03);
//按順序播放(先播01,再播02,最後播03)
//set.playSequentially(oa01, oa02, oa03);
//按指定順序播放 (01和02同時播放,最後播放03)
set.play(oa01).with(oa02);
set.play(oa03).after(oa01);
set.setDuration(1000);
set.start();

動畫監聽事件
透明度屬性動畫

ObjectAnimator animator = ObjectAnimator.ofFloat(v, "alpha", 0, 1);
animator.setDuration(1000);
//新增屬性動畫的監聽
animator.addListener(new AnimatorListener() {

    @Override
    public void onAnimationStart(Animator animation) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onAnimationRepeat(Animator animation) {
        // TODO Auto-generated method stub

    }

    //動畫結束之後呼叫該方法
    @Override
    public void onAnimationEnd(Animator animation) {
        // TODO Auto-generated method stub
        Toast.makeText(MainActivity.this, "click", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onAnimationCancel(Animator animation) {
        // TODO Auto-generated method stub

    }
});

animator.start();

ValueAnimator:

@Override
    public void onClick(View v) {
        // TODO Auto-generated method stub


        ValueAnimator valueAni = ValueAnimator.ofInt(0, 255);
        valueAni.setDuration(1000);
        valueAni.addUpdateListener(new AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                // TODO Auto-generated method stub

                Log.d("Test", "updata value = " + animation.getAnimatedValue());

                tv.setTextColor(Color.rgb((Integer)animation.getAnimatedValue(), 0, 0));
            }
        });
        //播放動畫
        valueAni.start();
    }