1.分类
- View动画
- 帧动画
- 属性动画
2.View动画
View动画的作用对象是View
支持四种效果: TranslateAnimation , ScaleAnimation , RotateAnimation , AlphaAnimation
定义:可以在代码中,也可以在xml文件中(建议)
需要在res目录下新建anim文件夹,对应的标签: set , translate , alpha , roatate , scale
使用: AnimationUtils.loadAnimation(context , id) -> Animation
调用: view.startAnimation();
自定义view动画: 继承Animation , 重写initialize() & applyTransformation() ; 可通过借助Camera来简化矩阵变化。
3.帧动画
帧动画是顺序播放一组预先定义好的图片,相关API: AnimationDrawable
需要在xml文件种定义: ,可作为View的背景 , 通过getBackground()获取AnimationDrawable实例。
4.View动画的特殊使用场景
- LayoutAnimation
作用于ViewGroup:子元素出场时的动画效果
属性: delay:延迟 (0~1) 动画时长相乘 , 第一个动画1 , 第二个动画 2 ….
animationOrder动画顺序 [normal , reverse , random] , animation 指定动画
使用: xml中 layoutAnimation ; code 中 LayoutAnimationController. - Activity切换效果
overridePendingTransition(int enterAinm , int exitAnim)
生效的时期: startActivity() or finish()之后。
5.属性动画
常用类: ValueAnimator , ObjectAnimator , AnimatorSet
特点: 作用对象做了拓展 ; 对动画效果做了拓展
使用: xml 中 animator文件夹 ; code中 ObjectAnimator.ofFloat…
标签 : , , 对应 ValueAnimator
对任意属性做动画
如果想对Object的属性abc做动画,想要动画生效,需要满足两个条件:
- 必须提供getAbc() , setAbc()方法
- object的setAbc对属性abc所做的改变必须能够通过某种方式反映出来
对button的width属性做动画没有效果?
button内部提供了getWidth() , setWidth()方法
但setWidth()并不是改变视图的大小。
解决方法(三种):
- 添加get和set方法,如果有权限的
看似最简单,但不太可行 - 用一个类包装原始对象,间接为其提供get和set方法
定义ViewWrapper(demo)
public class ViewWrapper {
private View mTarget;
public ViewWrapper(View mTarget) {
this.mTarget = mTarget;
}
public int getWidth(){
return mTarget.getLayoutParams().width;
}
public void setWidth(int width){
mTarget.getLayoutParams().width = width;
mTarget.requestLayout();
}
}
- 采用ValueAnimator,监听动画的过程,自己实现属性的改变
ValueAnimator valueAnimator = ValueAnimator.ofInt();
valueAnimator.addUpdateListener(new AnimatorUpdateListener(){
@override
public void onAnimationUpdate(ValueAnimator animator){
}
})
6.注意事项
- OOM(帧动画)
- 内存泄漏(属性动画且无限循环,在Activity退出时及时停止)
- 兼容性问题