补间动画
- 透明度动画
AlphaAnimation animation = new AlphaAnimation(0,1);
animation.setDuration(1000);
view.startAnimation(animation);
从0不显示到1全显示
- 旋转动画
RotateAnimation animation = new RotateAnimation(0,360, Animation.RELATIVE_TO_SELF,0.5f, Animation.RELATIVE_TO_SELF,0.5f);
animation.setDuration(1000);
view.startAnimation(animation);
- 位移动画
TranslateAnimation animation = new TranslateAnimation(0,200,0,300);
animation.setDuration(1000);
view.startAnimation(animation);
从原来的位置X轴移动200,Y轴移动300
- 缩放动画
ScaleAnimation animation = new ScaleAnimation(0,2,0,2);
animation.setDuration(1000);
view.startAnimation(animation);
- 动画集合(AnimationSet)
AnimationSet as = new AnimationSet(true);//是否共享插补器
as.setDuration(1000);
AlphaAnimation aa = new AlphaAnimation(0, 1);
aa.setDuration(1000);
as.addAnimation(aa);
TranslateAnimation ta = new TranslateAnimation(0, 100, 0, 200);
ta.setDuration(1000);
as.addAnimation(ta);
view.startAnimation(as);
属性动画
由于Android3.0之前已有的补间动画改变的只是显示,并不能响应事件。所以在3.0之后提出了一个新的动画框架Animator。
- ObjectAnimator
ObjectAnimator animator = ObjectAnimator.ofFloat(btnTest,"translationY",300);
animator.setDuration(3000);
animator.start();
ObjectAnimator 操作的属性必须有get,set方法。如果没有,底层是通过反射改变的值,如果没有get,set就会无法出现想要的效果。所以就会用到包装类。
static class WrapperButton{
private View mTargetView;
private int width;
public WrapperButton(View mTargetView){
this.mTargetView =mTargetView;
}
public int getWidth() {
return mTargetView.getLayoutParams().width;
}
public void setWidth(int width) {
mTargetView.getLayoutParams().width = width;
mTargetView.requestLayout();
}
}
ValueAnimator(ObjectAnimator的父类)
``` PropertyValuesHolder holder1 = PropertyValuesHolder.ofFloat("scaleX", 1f, 0, 1f); PropertyValuesHolder holder2 = PropertyValuesHolder.ofFloat("scaleY", 1f, 0, 1f); PropertyValuesHolder holder3 = PropertyValuesHolder.ofFloat("translationX", 300f); ObjectAnimator.ofPropertyValuesHolder(btnTest,holder1,holder2,holder3).setDuration(300).start(); ```
- PropertyValuesHolder
ValueAnimator animator = ValueAnimator.ofFloat(0,100); animator.setTarget(btnTest); animator.setDuration(3000); animator.start(); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { Float value = (Float) animation.getAnimatedValue(); btnTest.setTranslationX(value); } });
帧动画
Frame动画,即顺序播放事先做好的图像,跟放胶片电影类似。
开发步骤:
- 把准备好的图片放进项目res/ drawable下。
- 在项目的drawable文件夹下面定义动画XML文件,文件名称可以自定义。当然也可以采用编码方式定义动画效果(使用AnimationDrawable类)。
- 为View控件绑定动画效果。调用代表动画的AnimationDrawable的start()方法开始动画。
实例:
android:oneshot=”false”表示重复播放。
framelist.xml
“1.0”encoding=”utf-8”?>
“http://schemas.android.com/apk/res/android”
android:oneshot=”false”>
“@drawable/zzlx1”android:duration=”200”/>
“@drawable/zzlx2”android:duration=”200”/>
“@drawable/zzlx3”android:duration=”200”/>
“@drawable/zzlx4”android:duration=”200”/>
“@drawable/zzlx5”android:duration=”200”/>
“@drawable/zzlx6”android:duration=”200”/>
“@drawable/zzlx7”android:duration=”200”/>
“@drawable/zzlx8”android:duration=”200”/>
代码分析:
上面的XML就定义了一个Frame动画,其包含8帧动画,8帧动画中分别应用了drawable中的8张图片:zzlx1、zzlx2、zzlx3….,每帧动画持续200毫秒。android:oneshot属性如果为true,表示动画只播放一次停止在最后一帧上,如果设置为false表示动画循环播放。
在Xml中定义好帧动画之后就可以将其设置到View上了,请看下面代码:
//第一步将animation-list设置为ImageView的背景
imgShow.setBackgroundResource(R.drawable.framelist);
//第二步获取ImagView的背景并将其转换成AnimationDrawable
AnimationDrawableanimationDrawable=(AnimationDrawable)imgShow.getBackground();
//第三步开始播放动画
animationDrawable.start();
提示:
有一点需要强调的是:启动Frame动画的代码animationDrawable.start();不能应用在OnCreate()方法中,因为在OnCreate()中AnimationDrawable还没有完全的与ImageView绑定。在OnCreate()中启动动画,只能看到第一张图片。
帧动画内容参考博客:Android开发之动画效果浅析(一)