1.View动画是通过平移,缩放,旋转,透明度改变图片的一种渐进式的动画
2.帧动画类似于放电影一样切换一张张准备好的图片而形成的动画
3.属性动画是通过改变对象每个时段的属性值而形成的动画
注意:动画中尽量使用dp做单位,使用硬件加速
一。View动画
XML方式:
在res/anim/filename.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@[package:]anim/interpolator_resource" //插值器
android:shareInterpolator="true" | "false" //集合中动画是否和集合共享插值器,若为false则不共享
android:duration=“integer” //动画持续时间
android:fillAfter="true|false" //动画结束后是否停留在结束位置
>
<alpha //透明度
android:fromAlpha="float"
android:toAlpha="float" />
<scale //缩放
android:fromXScale="float"
android:toXScale="float"
android:fromYScale="float"
android:toYScale="float"
android:pivotX="float"
android:pivotY="float" />
<translate //位移
android:fromXDelta="float"
android:toXDelta="float"
android:fromYDelta="float"
android:toYDelta="float" />
<rotate //旋转
android:fromDegrees="float"
android:toDegrees="float"
android:pivotX="float"
android:pivotY="float" />
<set>
...
</set>
</set>
使用上面的动画:
TextView v = (TextView)findViewById(R.id.test);
Animation a = AnimationUtils.loadAnimation(this,R.anim.filename);
v.startAnimation(a);
代码方式:
TextView v = (TextView)findViewById(R.id.test);
AlphaAnimation a = new AlphaAnimation(0,1);
a.setDuration(300);
v.startAnimation(a);
TranslateAnimation/ScaleAnimation/RotateAnimation用法同上
注意:View使用setVisbility(View.GONE)失效时,可以使用view.clearAnimation清除
可以通过setAnimationListener方法设置AnimationListener来对动画进行监听,在动画开始,结束,和重复播放时进行操作
a.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { } @Override public void onAnimationRepeat(Animation animation) { } });
当以上动画不能满足要求时,我们可以通过继承Animation进行动画自定义
需要重写initialize和applyTransformation两个方法
public class a extends Animation{ @Override public void initialize(int width, int height, int parentWidth, int parentHeight) { super.initialize(width, height, parentWidth, parentHeight); //完成一些初始化的工作:如mCamera = new Camera(); } @Override protected void applyTransformation(float interpolatedTime, Transformation t) { //当前值 = 初始值 + (最终值 - 初始值) * interpolatedTime; Matrix matrix = t.getMatrix(); //通过camera进行一些矩阵操作,最后对matrix进行变化 } }
二。帧动画
在res/drawable/filename.xml:
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot=["true" | "false"] >
<item
android:drawable="@[package:]drawable/drawable_resource_name"
android:duration="integer" />
</animation-list>
使用以上动画:
TextView v = (TextView)findViewById(R.id.test);
v.setBackgroundResource(R.drawable.filename);
AnimationDrawable a = (AnimationDrawable)v.getBackground();
a.start();
注意:图片数量多且图片较大容易出现OOM,尽量避免使用帧动画
三。LayoutAnimation
xml形式:
res/anim/finename.xml
<?xml version="1.0" encoding="utf-8"?>
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
android:delay="float"
android:animationOrder="normal|reverse|random”//子元素按什么顺序播放动画 正序/逆序/随机
android:animation="@anim/~"/> //动画样式
在ViewGroup的xml文件中指定android:layoutAnimation = "@anim/filename"
则ViewGroup入场时,他的item就会开始播放动画
代码形式:
ListView v = (ListView)findViewById(R.id.listview);
Anaimation a = AnimationUtils.loadAnimation(this,R.anim.a);
LayoutAnimationController con = new LayoutAnimationController(a);
con.setDelay(0.5f);
con.setOrder(LayoutAnimationController.ORDER_REVERSE);
v.setLayoutAnimation(con);
四.属性动画
ObjectAnimator实现属性动画
ObjectAnimator.ofFloat(Object,"alpha",1,0,1).start();
ValueAnimator实现属性动画:
ValueAnimator anim = ObjectAnimator.ofInt(this,"backgroundColor",0xffffffff,0x00000000);
anim.setDuration(1000);
anim.setEvaluator(new ArgbEvalutor); //颜色估值器
anim.setRepeatCount(ValueAnimator.INFINITE);
anim.setRepeatMode(ValueAnimator.REVERSE);
anim.start();
属性动画的监听器AnimatorListener,AnimatorUpdateListener.
AnimatorUpdateListener:动画每播放一帧,调用一次
AnimatorListener:监听动画开始,结束,取消以及重复播放
注意:属性动画有一类无限循环动画在Activity退出时要让它停止
否则会让Activity无法释放而造成内存泄露
动画集合:
xml形式:
<set
android:ordering=["together" | "sequentially"]> //集合中的动画是同时播放还是依次播放
<objectAnimator
android:propertyName="string" //属性名
android:duration="int"
android:valueFrom="float | int | color"
android:valueTo="float | int | color"
android:startOffset="int"
android:repeatCount="int" //重复次数
android:repeatMode=["repeat" | "reverse"]
android:valueType=["intType" | "floatType"]/>
<animator
android:duration="int"
android:valueFrom="float | int | color"
android:valueTo="float | int | color"
android:startOffset="int"
android:repeatCount="int"
android:repeatMode=["repeat" | "reverse"]
android:valueType=["intType" | "floatType"]/>
<set>
...
</set>
</set>
使用以上动画:TextView v = (TextView)findViewById(R.id.textview);
AnimatorSet set = (AnimatorSet)AnimatorInflater.loadAnimator(this,R.anim.filename);
set.setTarget(v);
set.start();
//利用AnimatorSet和ObjectAnimator实现缩放动画
final AnimatorSet animatorSet = new AnimatorSet();
image.setPivotX(image.getWidth()/2);
image.setPivotY(image.getHeight()/2);
animatorSet.playTogether(ObjectAnimator.ofFloat(image, "scaleX", 1, 0).setDuration(5000),
ObjectAnimator.ofFloat(image, "scaleY", 1, 0).setDuration(5000));
animatorSet.start();