动画
Android 有哪几种动画?
参考:
- 帧动画
- View动画(补间动画)
- 属性动画
帧动画
概念 AnimationDrawable,帧动画,由一组图片集合而成,是一种具有动画效果的图片资源,对应的xml标签是animation-list使用利用xml 布局加载
View动画(补间动画)
概念 是补间动画,主要是向View对象设置动画效果,包括AlphaAnimation 、RotateAnimation 、ScaleAnimation 、TranslateAnimation 这4种效果,对应的xml标签分别是alpha、rotate、scale、translate。使用 1、设置相应动画效果的起点值、终点值、duration(时长)、Interpolator(加速度)。(注:RotateAnimation还需要设置旋转中心坐标值) 2、View.startAnimation(animation)。Interpolator:插值器,随时间流逝动画路程所应走过的百分比。比如,若设置为LinearInterpolator(匀速),时间过一半则插值器的值是0.5;若设置的是DecelerateInterpolator(加速插值器),时间过一半则插值器的值大于0.5。
属性动画
概念 属性动画可以对任何对象的属性做动画而不仅仅是View,甚至可以没有对象。除了作用对象进行扩展外,属性动画的效果也加强了,不仅能实现View动画的4中效果,还能实现其它多种效果,这些效果都是通过ValuAnimator或ObjectAnimator、AnimatorSet等来实现的。使用 1、设置作用对象、属性的起点值、属性的终点值、TypeEvaluator(路线)、duration(时长)、Interpolator(加速度)。 2、animator.start()。
属性动画根据作用对象的属性的起点值、终点值、TypeEvaluator(这三者结合形成动画的路线)在动画过程中据Interpolator计算出当前已走过的路程,并以此设置属性的当前值。
属性动画与View动画效果区别:
- 属性动画和View动画最大的区别就是 属性动画是控件位置发生改变,而view动画则是界面的渲染,控件位置是固定不变的
注意事件
链接:
- 关于Android Animation的setFillBefore、setFillAfter和setFillEnable:
- 如果是独立的Animation,只有setFillAfter有效,设置为true动画结束后保持最后的状态。
- 如果是AnimationSet中的Animation,因为Animation的作用周期可能位于整个AnimationSet动画周期的中间一部分,setFillBefore设置的是在这个动画被执行前是否启用这个动画的第一帧效果填充开始前的动画,setFillAfter设置的是在这个动画结束后是否保留这个动画的最后一帧的效果填充后面的动画,而这两个设置必须同时设置setFillEnable。
- 如果想这个AnimationSet结束后保留最后的结果,需要设置AnimationSet的setFillAfter。
补充:当setFillEnable为false时,通过查看源码可知在AnimationSet中自身的动画周期不受setFillBefore和setFillAfter控制;当Animation独立存在时,或AnimationSet的setFillAfter为true时,ViewGroup会读取getFillAfter值,如果为true,不clearAnimation,也就保持了最终的状态。
- 让view自转:
- 方式一:java代码动态设定旋转动画的轴心为中心:
animation = new RotateAnimation(0, +720, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
- 方式二:xml中设置
<rotate>
属性中pivotY="50%"
和pivotX="50%"
来设定轴心为中点:
复制代码
- OOM问题: 主要出现在帧动画当中,当图片数量较多并且图片较大时就容易出现OOM(App拥有的内存已经装不下图片了)。所以,尽量避免使用帧动画。
- 内存泄露: 属性动画中有一类无线循环动画,这类动画需要在Activity退出时及时停止,否则将导致Activity无法释放从而造成内存泄露(ML)。通过验证发现View动画不存在此问题。
- 兼容性问题: 动画在Android3.0(API 11)以下的系统上有兼容性问题,所以,需要适当使用兼容库如nineoldandroids等进行适配(目前大多Android手机版本在4.0以上,这一点问题不大)
- View动画的问题: View动画是对View的影像做动画,不是真的改变View的布局属性和状态,所以,有时会出现:动画完成后View无法隐藏的情况,即
setVisibility(View.GONE);
失效。解决方法:调用view.clearAnimation()
清除View动画即可。 - 不要使用px: 由于不同尺寸的手机,dpi不一样,所以,用dp设定动画更容易适配不同手机。下面分享个人的一个dp转px的工具类DiaplayUtil:
持续更新.....