Android的动画能够分为三种:View动画、帧动画和属性动画,帧动画也属于View动画的一种,只不过它和平移、旋转等常见的View动画在表现形式上略有不一样而已。app
平移动画:TranslateAnimationide
缩放动画:ScaleAnimation动画
旋转动画:RotateAnimationcode
透明度动画:AlphaAnimationorm
用XML来定义属性动画须要定义在res/anim目录下。对象
LayoutAnimation使用于ViewGroup,为ViewGroup指定一个动画,它的子元素出场时都会具备这种动画效果。这种效果经常使用在ListView上。图片
主要用到overridePendingTransition(int enterAnim,int exitAnim)这个方法,必须在startActivity(intent)或者finish()以后被调用才能生效。内存
Fragment中添加切换动画,能够经过FragmentTransaction中的setCustomAnimations()方法来添加切换动画,这个切换动画须要的是View动画。get
属性动画能够对任意对象的属性进行动画而不单单是View,动画默认时间间隔是300ms,默认帧是10ms/帧。animation
用XML来定义属性动画须要定义在res/animator目录下。
对object的属性abc属性作动画,若是要让动画生效,要同时知足两个条件:
一、object必需要提供setAbc方法,若是动画的时候没有传递初始值,还要提供getAbc方法,由于系统要去取abc属性的初始值。若是不知足这条,程序直接Crash。
二、object的setAbc对属性abc所作的改变必须可以经过某种方法反映出来,好比会带来UI的改变等。若是不知足这条,动画无效果但不会Crash。
若是只知足条件1,不知足条件2,能够有3种解决方法:
给对象加上get和set,若是有权限的话
用一个类来包装原始对象,间接为其提供get和set方法
private void performAnimate(){
ViewWrapper wrapper = new ViewWrapper(mButton);
ObjectAnimator.ofInt(wrapper,"width",500).setDuration(5000).start();
}
private static class ViewWrapper{
private View mTarget;
public ViewWrapper(View target){ mTarget = target; } public int getWidth(){ return mTarget.getLayoutParams().width; } public void setWidth(int width){ mTarget.getLayoutParams().width = width; mTarget.requestLayout(); }
}
采用ValueAnimator,监听动画过程,本身实现属性的改变
一、OOM问题
这个问题主要出如今帧动画中,当图片数量较多肯于图片较大时就极易出现OOM。
二、内存泄露
在属性动画中有一类无限循环的动画,这类动画须要在Activity退出时及时中止,不然将致使Activity没法释放从而形成内存泄露,View动画不存在此问题。
三、兼容性问题
动画在3.0如下系统上有兼容性问题。
四、View动画的问题
View动画是对View的影像作动画,并非真正地改变View的状态,所以有时候会出现动画完成后View没法隐藏的现象,即setVisibility(View.GONE)失效,这时只要调用view.clearAnimation()清除View动画便可解决此问题。
五、不要用px
六、动画元素的交互
7硬件加速
使用动画的过程当中,建议开启硬件加速,这样会提升动画的流畅性。