幀動畫動態加載
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);
// 資源文件加載的方式 ?一定要設置該資源為 ImageView的backGround ? 不能是 ?src
// drawable = (AnimationDrawable) show_iv.getBackground();
// // true 只播放一次 否則 重復播放 (默認)
// 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();
}
}
}
補間動畫
/**
* 補間動畫 TwennAnimation 補充開始與結束之間的動作 支持 位移, 旋轉 ,縮放 透明度的改變 這四種動畫 并且 只支持 View 來執行
* 動畫的資源可以使用xml資源文件的方式 定義 也可以使用Java代碼的方式 定義
*
*
* xml資源放在 res文件夾下的 anim 文件夾中
* @author alice
*
*/
public class MainActivity extends Activity {
private ImageView show_iv;
// 每次加載 res 資源文件都是耗費資源的一個過程 因此 先將資源加載出來 每次啟動動畫的時候 都直接執行動畫即可 不需要再次去加載資源
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:
// 位移動畫
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:
// 旋轉
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 使用集合動畫 自己的 插值器
// true 則使用 set 默認的 插值器
AnimationSet set = new AnimationSet(false);
//位移動畫
Animation tAnimation = new TranslateAnimation(0, 100, 0, 200);
tAnimation.setDuration(3000);
//透明度動畫
Animation alpha = new AlphaAnimation(0.0f, 1.0f);
alpha.setDuration(3000);
//添加動畫
set.addAnimation(tAnimation);
set.addAnimation(alpha);
//開始動畫
show_iv.startAnimation(set);
}
屬性動畫
/**
* 屬性動畫
位移 translationX translationY
* 旋轉 rotation rotationX rotationY
* 縮放 scaleX scaleY
* 透明度 alpha
*
* ObjectAnimator
* 構造方法:
* ObjectAnimator.OfFloat()
* 第一個參數:執行該動畫的對象
* 第二個參數:動畫的屬性名稱
* 第三個參數:可變參數,執行的動畫的值
*
* 集合
* AnimatorSet
* 邏輯不要出錯 ?不用使用重復的對象 并且 ?每一個關系都是相對于 第一個動畫的
* set.Play().with().before().after()
*
*用集合將動畫記錄下來 之后 ?有序或同步執行
* set.playTogether(List)
* set.playSequentially(List)
*
*動畫監聽
* animator.setListener(){
* start
* end
* repeat
* cancle
* }
*
*動畫延遲
* startDelayed
*
*
* 加載動畫中的xml資源:
* 1.在res 文件夾下創建文件夾名字為 ? animator的文件夾
* 在 該文件夾下添加資源
*
* AnimatorInflate.loadAnimator(Context,resId);
* animator.setTartget(Object)
*
* ValueAnimator ?OnjectAnimator的 父類
* 也可以實現動畫 只是比較麻煩
*
*
* @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:
// 位移動畫
/*
* 第一個參數: 執行該動畫的 對象 第二個參數: 動畫的屬性名稱 第三個參數: 可變參數 執行動畫的 值
*
*/
ObjectAnimator translateAnimator = ObjectAnimator.ofFloat(show_iv, "translationX", 0, 200, 100, 50);
translateAnimator.setDuration(3000);
translateAnimator.start();
break;
case R.id.rotate_bt:
// 旋轉
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);
// 動畫延時
scaleAnimator.setStartDelay(3000);
scaleAnimator.start();
// 動畫的監聽
scaleAnimator.addListener(new AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
// 動畫開始的時候
Log.d("TAG", "onAnimationStart");
}
@Override
public void onAnimationRepeat(Animator animation) {
// 動畫重復的時候
Log.d("TAG", "onAnimationRepeat");
}
@Override
public void onAnimationEnd(Animator animation) {
// 動畫 結束的時候
Log.d("TAG", "onAnimationEnd");
}
@Override
public void onAnimationCancel(Animator animation) {
// 動畫取消的時候
}
});
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);
// 第二種表達方式
List list = new ArrayList();
list.add(translateY);
list.add(translateX);
// 依次執行
// set.playSequentially(list);
// 同步執行
// set.playTogether(list);
// 后面的 邏輯思維一定要正確 并且 同一個動畫只能參與一次 后面的所有添加的 邏輯 都是相對于 第一個 play()中的動畫
set.play(translateX).with(translateY).after(translateY);
set.start();
break;
case R.id.value_bt:
// ValueAnimator 是 ObjectAnimator的 父類
// 實現起來比較麻煩
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;
}
}
}
這是我的動畫源碼,是動態加載,