帧动画动态加载
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;
}
}
}
这是我的动画源码,是动态加载,