动画的分类
动画 | 区别 |
---|---|
View动画 | 作用对象是View,通过对场景里的对象不停做图形变换 从而产生动画效果 |
帧动画 | 顺序播放一系列图像从而产生动画 |
属性动画 | 动态改变对象的属性从而达到动画效果 |
View动画的使用场景
1.LayoutAnimation:给ViewGroup的子元素加上效果
2.Activity切换效果:overridePendingTransition(int enterAnim ,int exitAnim)
enterAnim:打开时加载的动画资源id
exitAnim:暂停时所需要的动画资源id
== 注:== 这个方法必须在startActivity(Intent)和finish()之后调用才会有效
属性动画
在API11 之前。属性动画的本质还是View动画
原理
特殊的动画属性
repeatCount:动画的循环次数,默认值为0;-1为无限循环
repeatMode(动画循环模式):restart:连续重复;reverse:逆向重复
插值器
时间插值器:根据时间流逝的百分比来计算出当前属性值改变的百分比
线性插值器:匀速动画
加速减速插值器:两头慢中间快
减速插值器:越来越慢
public class LinearInterpolator implements Interpolator{
public LinearInterpolator(){
}
public LinearInterpolator(Context context,AttributeSet attrs){
}
public float getInterpolation(Float input)
{
return input;
}
}
插值器计算的主要是估值器需要的估值小数
估值器
TypeEvaluator:根据当前属性改变的百分比计算改变后的属性值
IntEvaluator:针对整形属性
FloatEvaluator:针对浮点型属性
ArgbEvaluator:针对Color属性
public class IntEvaluator implements TypeEvaluator<Integer>
{
public Integer evaluate(float fraction,Integer startValue,Integer endValue)
{
int startInt=startValue;
return (int)(startInt+fraction*(endValue-startValue));
}
}
对任意属性做动画
生效的两个条件:
1.object必须提供setAbc,如果没有初始值,还需要提供getAbc(不满足的情况下,程序会直接Crash)
2.object的setAbc对属性Abc所做的改变必须啊能通过某种方法展示出来(不满足无动画效果,但程序不会Crash)
解决方法:
1.在有权限的情况下,给你的对象加上get,set方法(一般情况下是不可行的,因为这是Android SDK内部实现的,是通过反射来进行调用的)
2.有一个类包装原始对象,间接为其提供get,set方法
3.采用ValueAnimator,监听动画过程,自己实现属性的改变
注意事项
1.OOM:避免使用帧动画
2.内存泄漏:无限循环动画在Activity退出时即时停止
3.兼容性问题:3.0以下存在
4.View动画:对view影像做动画,不真正改变View状态
5.不要使用px,尽量使用dp,使用px会导致在不同的设备上看到不同的效果。
6.动画元素交互:3.0以后,触发事件的位置为移动后的位置,View东湖依旧在原位置
7.硬件加速:使动画更加流畅