深入理解动画
android动画分为view动画,帧动画,属性动画三种
View动画
-
种类:平移动画(TranslateAnimation),缩放动画(ScaleAnimation),旋转动画(RotateAnimation),透明度动画(AlphaAnimation)
-
创建方式:1.创建xml文件(在res/anim/下创建)
2.代码动态创建
对于view动画建议使用xml创建,可读性好
名称 | 标签 | 子类 | 效果 |
---|---|---|---|
平移动画 | TanslateAnimation | 移动view | |
缩放动画 | ScaleAnimation | 放大或缩小view | |
旋转动画 | RotateAnimation | 旋转view | |
透明度动画 | AlphaAnimation | 改变view的透明度 |
例如:
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:repeatMode="restart"
>
<scale android:fromXScale="1"
android:toXScale="1.5"
android:fromYScale="1"
android:toYScale="1.5"
android:pivotY=""----------缩放的轴点的y坐标,默认为view的中心
android:pivotX=""
/>
<rotate android:fromDegrees="0"
android:toDegrees="180"
android:pivotX=""
android:pivotY=""
/>
</set>
在代码里使用xml创建的动画:
Animation translateAnimation=AnimationUtils.loadAnimation(this,R.anim.anim_translate);
mBtnLogin.startAnimation(translateAnimation);
标签表示动画集合,它可以是某个单一的动画,也可以是一系列的动画
它的两个属性:
-
android:interpolater
表示动画集合使用的差值器,它影响动画的执行速度。默认为加速减速差值器
-
android:shareInterpolater
表示集合中的动画是否和集合共享一个差值器。
还可以监听animation的动画过程,具体api为AnimationListener
view动画的特殊使用场景
1.在viewGroup中控制子元素的出场效果
使用LayoutAnimation
在xml文件中给viewGroup指定layoutAnimation属性,这样viewGroup中的child就具有出场动画了。这种方式适用所有的viewGroup.
2.不同activity的切换效果
activity有默认的切换效果,也可以自定义切换效果,主要用到overridePendingTransition方法,该方法必须在startActivity()或finish()之后调用才生效。
帧动画
顺序播放一系列的图片类似播放电影。不同于view动画,帧动画通过AnimationDrawable来播放。
使用:创建xml文件定义一个AnimationDrawable,将该drawable作为view的背景,通过drawablew来播放动画。
注意:在定义Animation时不要使用过多尺寸较大的图片以免引起OOM。
属性动画
API 11新加入的特性,和view动画不同,属性动画可以对任意对象的属性进行动画,不仅仅是view,动画默认时间间隔是300ms.在一个时间间隔内完成对象从一个属性值到另一个属性值的改变。有ValueAnimator,ObjectAnimator,AnimatorSet等概念,通过它们可以实现各种绚丽的效果。
可以改变一个对象的translationY,backgroundColor等属性
//改变view的背景色
ValueAnimator colorAnimator=ObjectAnimator.ofInt(mBtnLogin,"backgroundColor",0xffff8080,0xff8080ff);
colorAnimator.setDuration(500);
colorAnimator.start();
也可以设置插值器。
也可以通过xml来定义,位于res/animator目录下。通过AnimatorInflater.loadAnimator.setTarget将定义的xml属性动画作用于一个对象上。
建议开发中使用代码实现属性动画。
属性动画还提供了监听动画过程的接口:AnimatorUpdateListener,AnimatorListener.监听动画的开始,结束,取消和重复播放的过程
属性动画原理
属性动画要求作用的对象提供set和get方法,根据外界传递的初始值和最终值以动画的效果多次调用set方法,随着时间的推移所传递的值越来越接近最终值。
总结:如果对一个对象的某个属性做动画要同时满足两个条件才可以生效
-
object必须要提供set方法,如果动画的时候没有提供初始值,还要提供get方法,因为系统要去取属性的初始值
-
object的set方法对属性做的操作必须能够通过某种方式展现出来(ui发生变化)
有时会出现不能同时满足以上两种条件的情况,解决方案:
- 给对象加上get,set方法,如果有权限的话(很多情况下是没有的)
- 用一个类来包装原始对象,间接提供get,set方法(推荐)
- 使用ValueAnimator,监听动画过程,自己实现属性的改变
动画使用注意事项:
-
OOM问题。
尽量避免使用过多过大的图片
-
内存泄漏。
在属性动画中用无限循环播放的动画在activity退出时要及时停止,以免activity无法释放从而造成内存泄漏,view动画不存在该问题。
-
动画元素的交互。
将view移动后,在3.0以前,不管是属性动画或是view动画在新位置都无法触发单击事件,3.0以后属性动画不存在该问题,但view动画依然在原位置。
-
硬件加速
使用动画时为保证动画的流畅性建议开启硬件加速。