補間動畫(Tween Animation)
補間動畫有以下四種
Alpha透明度動畫
Scale尺寸縮放動畫
Translate位置移動動畫
Rotate旋轉(zhuǎn)動畫
補間動畫的共同屬性
Duration:動畫持續(xù)時間(單位:毫秒)
fillAfter:設(shè)置為true,動畫轉(zhuǎn)化在動畫結(jié)束后被應(yīng)用
interpolator:動畫插入器(加速、減速插入器)
repeatCount:動畫重復(fù)次數(shù)
repeatMode:順序重復(fù)/倒序重復(fù)
startOffset:動畫之間的時間間隔(應(yīng)用于組合動畫)
動畫實現(xiàn)方式
配置文件(/res/anim)——alpha、scale、translate、rotate (更簡單)
Java代碼實現(xiàn)——AlphaAnimation、ScaleAnimation、TranslateAnimation、RotateAnimation
(更靈活)
例如
用Java代碼去創(chuàng)建
//創(chuàng)建Alpha動畫(透明度為10%-100%)
Animation alpha = new AlphaAnimation(0.1f,1.0f);
//設(shè)置動畫時間為5秒
alpha.setDuration(5000);
//開始播放
img.startAnimation(alpha);
加載配置文件
Animation scale = AnimationUtils.loadAnimation(context, R.anim.scale_anim);
//開始動畫
img.startAnimation(scale);
AlphaAnimation
fromAlpha動畫起始時的透明度 (1.0表示完全不透明)
toAlpha動畫終止時的透明度 (0.0表示完全透明)
ScaleAnimation
fromX,toX分別是起始和結(jié)束時x坐標上的伸縮尺寸
fromY,toY分別是起始和結(jié)束時y坐標上的伸縮尺寸
pivotX,pivotY分別為伸縮動畫相對于x,y軸開始位置
Translate
fromXDelta,fromYDelta分別是起始的X,Y的坐標
toXDelta,toYDelta分別是結(jié)束時X,Y的坐標
RotateAnimation
fromDegrees
toDegrees
pivotX,pivotY分別為旋轉(zhuǎn)動畫相對于x,y的坐標開始位置
動畫監(jiān)聽器
AnimationListener
幀動畫(Frame Animation)
概念
逐幀動畫是一種常見的動畫形式(Frame By Frame),其原理是在“連續(xù)的關(guān)鍵幀”中分解動畫動作,也就是在時間軸的每幀上逐幀繪制不同的內(nèi)容,使其連續(xù)播放而成動畫。
幀動畫實現(xiàn)
使用加載配置文件
將圖片資源拷貝到drawable資源目錄中
在drawable目錄中創(chuàng)建幀動畫配置文件,在該文件中配置動畫所需圖片,以及每個圖片停留時間。
<item< p="">
android:drawable="幀圖片的資源id"
android:duration="播放該幀的時間"/>
<item< p="">
android:drawable="幀圖片的資源id"
android:duration="播放該幀的時間"/>
//載入xml逐幀動畫資源
imageView.setImageResource(R.drawable.btn_animation);
aniDrawable = (AnimationDrawable) imageView.getDrawable();
//播放動畫
aniDrawable.setOneShot(true);
aniDrawable.start();
//停止動畫
//aniDrawable.stop();
//檢查動畫是否正在播放
//aniDrawable.isRunning();
使用Java代碼創(chuàng)建
//創(chuàng)建動畫對象
AnimationDrawable aniDrawable = new AnimationDrawable();
//設(shè)置每一幀的幀圖片,每一幀播放時間
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);
練習(xí)
制作不會說話的湯姆貓
屬性動畫(Property Animation)
概念
andorid3.0引入。屬性動畫改變對象的一個field值實現(xiàn)動畫。指定你想要的屬性,多長時間,動畫的值就可以實現(xiàn)了。
Animation的局限性
一個屬性動畫的實現(xiàn)
//參數(shù):
//動畫作用目標
//屬性
//屬性值
ObjectAnimator animator = ObjectAnimator.ofFloat(iv, "translationX", 0, 100);
animator.setDuration(2000);
animator.start();
Animation動畫框架僅僅只是讓圖像發(fā)生位移,而監(jiān)聽事件依然在原地。而屬性動畫可以移動讓監(jiān)聽事件也跟著移動。
多個屬性動畫實現(xiàn)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();
多個屬性動畫實現(xiàn)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();
動畫監(jiān)聽事件
透明度屬性動畫
ObjectAnimator animator = ObjectAnimator.ofFloat(v, "alpha", 0, 1);
animator.setDuration(1000);
//添加屬性動畫的監(jiān)聽
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
}
//動畫結(jié)束之后調(diào)用該方法
@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改變文字顏色
ValueAnimator valueAni = ValueAnimator.ofInt(0, 255);
valueAni.setDuration(2000);
valueAni.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
// TODO Auto-generated method stub
tv.setTextColor(Color.rgb((Integer)animation.getAnimatedValue(), 0, 0));
}
});
valueAni.start();