幀動(dòng)畫動(dòng)態(tài)加載
private ImageView show_iv;
private AnimationDrawable drawable;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
show_iv = (ImageView) findViewById(R.id.show_iv);
// 資源文件加載的方式 ?一定要設(shè)置該資源為 ImageView的backGround ? 不能是 ?src
// drawable = (AnimationDrawable) show_iv.getBackground();
// // true 只播放一次 否則 重復(fù)播放 (默認(rèn))
// drawable.setOneShot(false);
drawable = new AnimationDrawable();
drawable.addFrame(getResources().getDrawable(R.drawable.girl_1), 200);
drawable.addFrame(getResources().getDrawable(R.drawable.girl_2), 200);
drawable.addFrame(getResources().getDrawable(R.drawable.girl_3), 200);
drawable.addFrame(getResources().getDrawable(R.drawable.girl_4), 200);
drawable.addFrame(getResources().getDrawable(R.drawable.girl_5), 200);
drawable.addFrame(getResources().getDrawable(R.drawable.girl_6), 200);
drawable.addFrame(getResources().getDrawable(R.drawable.girl_7), 200);
drawable.addFrame(getResources().getDrawable(R.drawable.girl_8), 200);
drawable.addFrame(getResources().getDrawable(R.drawable.girl_9), 200);
drawable.addFrame(getResources().getDrawable(R.drawable.girl_10), 200);
drawable.addFrame(getResources().getDrawable(R.drawable.girl_11), 200);
show_iv.setImageDrawable(drawable);
drawable.setOneShot(true);
}
public void onClick(View view) {
if (drawable.isRunning()) {
drawable.stop();
} else {
drawable.start();
}
}
}
補(bǔ)間動(dòng)畫
/**
* 補(bǔ)間動(dòng)畫 TwennAnimation 補(bǔ)充開始與結(jié)束之間的動(dòng)作 支持 位移隧熙, 旋轉(zhuǎn) 杆查,縮放 透明度的改變 這四種動(dòng)畫 并且 只支持 View 來執(zhí)行
* 動(dòng)畫的資源可以使用xml資源文件的方式 定義 也可以使用Java代碼的方式 定義
*
*
* xml資源放在 res文件夾下的 anim 文件夾中
* @author alice
*
*/
public class MainActivity extends Activity {
private ImageView show_iv;
// 每次加載 res 資源文件都是耗費(fèi)資源的一個(gè)過程 因此 先將資源加載出來 每次啟動(dòng)動(dòng)畫的時(shí)候 都直接執(zhí)行動(dòng)畫即可 不需要再次去加載資源
private Animation translate;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
show_iv = (ImageView) findViewById(R.id.show_iv);
show_iv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "這里是View 存在的地方", Toast.LENGTH_SHORT).show();
}
});
}
public void onClick(View view) {
switch (view.getId()) {
case R.id.translate_bt:
// 位移動(dòng)畫
Animation tAnimation = new TranslateAnimation(0, 100, 0, 300);
tAnimation.setDuration(3000);
tAnimation.setFillAfter(true);
//插值器 ?減速插值器
tAnimation.setInterpolator(new DecelerateInterpolator());
show_iv.startAnimation(tAnimation);
break;
case R.id.alpha_bt:
// 透明度
Animation alpha = new AlphaAnimation(0.0f, 1.0f);
alpha.setDuration(3000);
alpha.setFillAfter(true);
show_iv.startAnimation(alpha);
break;
case R.id.rotate_bt:
// 旋轉(zhuǎn)
Animation rotate = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
0.5f);
rotate.setDuration(3000);
rotate.setFillAfter(true);
show_iv.startAnimation(rotate);
break;
case R.id.scale_bt:
// 縮放
Animation scale = new ScaleAnimation(1, 0.5f, 1, 1, 0, 0.5f);
scale.setDuration(3000);
scale.setFillAfter(true);
show_iv.startAnimation(scale);
break;
case R.id.set_bt:
// 集合
setAnimationList();
break;
default:
break;
}
}
private void setAnimationList() {
// false 使用集合動(dòng)畫 自己的 插值器
// true 則使用 set 默認(rèn)的 插值器
AnimationSet set = new AnimationSet(false);
//位移動(dòng)畫
Animation tAnimation = new TranslateAnimation(0, 100, 0, 200);
tAnimation.setDuration(3000);
//透明度動(dòng)畫
Animation alpha = new AlphaAnimation(0.0f, 1.0f);
alpha.setDuration(3000);
//添加動(dòng)畫
set.addAnimation(tAnimation);
set.addAnimation(alpha);
//開始動(dòng)畫
show_iv.startAnimation(set);
}
屬性動(dòng)畫
/**
* 屬性動(dòng)畫
位移 translationX translationY
* 旋轉(zhuǎn) rotation rotationX rotationY
* 縮放 scaleX scaleY
* 透明度 alpha
*
* ObjectAnimator
* 構(gòu)造方法:
* ObjectAnimator.OfFloat()
* 第一個(gè)參數(shù):執(zhí)行該動(dòng)畫的對(duì)象
* 第二個(gè)參數(shù):動(dòng)畫的屬性名稱
* 第三個(gè)參數(shù):可變參數(shù)盅安,執(zhí)行的動(dòng)畫的值
*
* 集合
* AnimatorSet
* 邏輯不要出錯(cuò) ?不用使用重復(fù)的對(duì)象 并且 ?每一個(gè)關(guān)系都是相對(duì)于 第一個(gè)動(dòng)畫的
* set.Play().with().before().after()
*
*用集合將動(dòng)畫記錄下來 之后 ?有序或同步執(zhí)行
* set.playTogether(List)
* set.playSequentially(List)
*
*動(dòng)畫監(jiān)聽
* animator.setListener(){
* start
* end
* repeat
* cancle
* }
*
*動(dòng)畫延遲
* startDelayed
*
*
* 加載動(dòng)畫中的xml資源:
* 1.在res 文件夾下創(chuàng)建文件夾名字為 ? animator的文件夾
* 在 該文件夾下添加資源
*
* AnimatorInflate.loadAnimator(Context,resId);
* animator.setTartget(Object)
*
* ValueAnimator ?OnjectAnimator的 父類
* 也可以實(shí)現(xiàn)動(dòng)畫 只是比較麻煩
*
*
* @author alice
*
*/
public class MainActivity extends Activity {
private ImageView show_iv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
show_iv = (ImageView) findViewById(R.id.show_iv);
show_iv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "我就在這里痕惋!", Toast.LENGTH_SHORT).show();
}
});
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB) @SuppressLint("NewApi")
public void onClick(View view) {
switch (view.getId()) {
case R.id.translate_bt:
// 位移動(dòng)畫
/*
* 第一個(gè)參數(shù): 執(zhí)行該動(dòng)畫的 對(duì)象 第二個(gè)參數(shù): 動(dòng)畫的屬性名稱 第三個(gè)參數(shù): 可變參數(shù) 執(zhí)行動(dòng)畫的 值
*
*/
ObjectAnimator translateAnimator = ObjectAnimator.ofFloat(show_iv, "translationX", 0, 200, 100, 50);
translateAnimator.setDuration(3000);
translateAnimator.start();
break;
case R.id.rotate_bt:
// 旋轉(zhuǎn)
ObjectAnimator rotationAnimator = ObjectAnimator.ofFloat(show_iv, "rotationY", 0, 360, 720);
rotationAnimator.setDuration(3 * 1000);
rotationAnimator.start();
break;
case R.id.scale_bt:
//縮放
ObjectAnimator scaleAnimator = ObjectAnimator.ofFloat(show_iv, "scaleX", 1, 4, 2);
scaleAnimator.setDuration(3000);
scaleAnimator.setRepeatCount(3);
// 動(dòng)畫延時(shí)
scaleAnimator.setStartDelay(3000);
scaleAnimator.start();
// 動(dòng)畫的監(jiān)聽
scaleAnimator.addListener(new AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
// 動(dòng)畫開始的時(shí)候
Log.d("TAG", "onAnimationStart");
}
@Override
public void onAnimationRepeat(Animator animation) {
// 動(dòng)畫重復(fù)的時(shí)候
Log.d("TAG", "onAnimationRepeat");
}
@Override
public void onAnimationEnd(Animator animation) {
// 動(dòng)畫 結(jié)束的時(shí)候
Log.d("TAG", "onAnimationEnd");
}
@Override
public void onAnimationCancel(Animator animation) {
// 動(dòng)畫取消的時(shí)候
}
});
break;
case R.id.alpha_bt:
//透明
ObjectAnimator alphaAnimator = ObjectAnimator.ofFloat(show_iv, "alpha", 0, 1);
alphaAnimator.setDuration(3000);
alphaAnimator.start();
break;
case R.id.set_bt:
// 集合
AnimatorSet set = new AnimatorSet();
ObjectAnimator translateX = ObjectAnimator.ofFloat(show_iv, "translationX", 0, 200, 200, 0, 0);
translateX.setDuration(3000);
ObjectAnimator translateY = ObjectAnimator.ofFloat(show_iv, "translationY", 0, 0, 200, 200, 0);
translateY.setDuration(3000);
// 第二種表達(dá)方式
List list = new ArrayList();
list.add(translateY);
list.add(translateX);
// 依次執(zhí)行
// set.playSequentially(list);
// 同步執(zhí)行
// set.playTogether(list);
// 后面的 邏輯思維一定要正確 并且 同一個(gè)動(dòng)畫只能參與一次 后面的所有添加的 邏輯 都是相對(duì)于 第一個(gè) play()中的動(dòng)畫
set.play(translateX).with(translateY).after(translateY);
set.start();
break;
case R.id.value_bt:
// ValueAnimator 是 ObjectAnimator的 父類
// 實(shí)現(xiàn)起來比較麻煩
ValueAnimator animator = ValueAnimator.ofFloat(0, 200);
animator.setDuration(3000);
animator.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float value = (Float) animation.getAnimatedValue();
show_iv.setTranslationX(value);
}
});
animator.start();
break;
default:
break;
}
}
}
這是我的動(dòng)畫源碼妓灌,是動(dòng)態(tài)加載把夸,