android动画分为View动画 帧动画 属性动画
View动画
- View动画包括平移,透明,缩放,旋转。用xml文件在res/anim创建 set标签做动画集合。interpolator插值器来改变动画是速度;shareInterpolator是否共享插值器。用duration改变动画时间,fillafter表示动画结束是否停留。最后通过AnimationUtils调用anim文件。可以setAnimationListerner添加动画监听。
自定义view动画
- 派生新动画只需要继承Animation重写initialize和applytransformation,在initialize做初始化工作,在applytransformation相应矩阵变换。使用Camera简单实现3D效果。
帧动画
- 系统提供AndroidDrawable类使用帧动画,xml可以在drawable用animation-list标签。注意避免图片过大引起OOM.
- LayoutAnimation作用于viewGroup,常备用于listview等。
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
android:delay="30%"
android:animationOrder="reverse"
android:animation="@anim/slide_right"/>
android:delay表示动画播放的延时,既可以是百分比,也可以是float小数。
android:animationOrder表示动画的播放顺序,有三个取值normal(顺序)、reverse(反序)、random(随机)。
android:animation指向了子控件所要播放的动画
为ViewGroup指定android:layoutAnimation=”@anim/list_anim_layout”这样我们的listview的item就可以有出场动画了。
activity切换效果
- overridePendingTransition(R.anim.zoomin, R.anim.zoomout)第一个参数是打开动画,第二个参数是暂停动画
淡入淡出的效果Android的包中已经提供了,
overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
左右滑动的效果Android的效果也提供了,
overridePendingTransition(android.R.anim.slide_in_left, android.R.anim.slide_out_right);
fragment可以通过fragmentTrasaction的setCustomAnimation来切换动画。
注意必须startActvity或者finish后面调用
属性动画
- 属性动画可以对任意对象做动画,但是它是从API 11才有的,所以存在兼容性问题,可以考虑使用开源动画库nineoldandroids。
- 常用动画类ValueAnimator,ObjectAnimator和Animatorset。
- 属性android:repeatMode表示动画的重复模式,repeat表示连续重复播放,reverse表示逆向重复播放,也就是第一次播放完后第二次倒着播放动画,第三次还是重头开始播放动画,第四次再倒着播放。porpertyName属性名称,假如指定了是color,不需要指定valuetype。
- 插值器和估值器:属性动画实现非匀速动画的重要手段
时间插值器TimeInterpolator的作用是根据时间流逝的百分比计算出当前属性值改变的百分比,系统内置的插值器有线性插值器LinearInterpolator、加速减速插值器AccelerateDecelerateInterpolator和减速插值器DecelerateInterpolator。
类型估值器(TypeEvaluator)的作用是根据当前属性改变的百分比计算出改变后的属性值,系统内置的估值器有IntEvaluator、FloatEvaluator和ArgbEvaluator。 - 动画监听器
AnimatorListener:监听动画的开始、结束、取消以及重复播放;
AnimatorUpdateListener监听动画的整个过程,动画每播放一帧的时候onAnimationUpdate方法就会被回调一次 - 属性动画的工作原理:属性动画需要运行在有Looper的线程中,反射调用get/set方法。对任意属性做动画的方法:用一个类封装原始对象或者ValueAnimator
- 使用动画的注意事项 1)属性动画中的无限循环动画需要在Activity退出的时候及时停止,否则将导致Activity无法释放而造成内存泄露。view动画不存在这个问题;2)view动画的问题:view动画是对view的影像做动画,并不是真正的改变view的状态,因此有时候动画完成之后view无法隐藏,即setVisibility(View.GONE)失效了,此时需要调用view.clearAnimation()清除view动画才行;3)不要使用px;