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();
}