动画详解

三种动
  • 1.视图动画(view Animation)
  • 2.帧动画()
  • 3.属性动画
插值器(Interpolator)与估值器(TypeEvaluator)

面试题

  • 1.帧动画在使用时需要注意什么?

通过动画可以实现一些比较绚丽的效果,但是在使用过程中,也需要注意一些事情,主要分为下面几类。

1.OOM问题

这个问题主要出现在帧动画中,当图片数量较多且图片较大时就容易出现OOM,这个在实际开发中尤其注意,尽量避免使用帧动画。

2.内存泄漏

在属性动画中有一类无线循环的动画,这类动画需要在Activity退出时及时停止,否则将会导致Activity无法释放从而造成内存泄漏,通过验证后发现View动画并不存在此问题。

3.兼容性问题

动画在3.0以下的系统上有兼容性问题,在某些特殊场景可能无法正常工作,因此要做好适配工作。

4.View动画的问题

View动画是对View的影像做动画,并不是真正地改变View地状态,因此有时会出现动画完成后View无法隐藏地现象,即setVisibility(View.GONE)失效了,这个时候只要调用view.clearAnimation()清楚View动画即可解决此问题。

5.不要使用px

在进行动画的过程中,要尽量使用dp,使用px会导致在不同的设备上有不同的效果。

6.动画元素的交互

将view平移后,在Andre 3.0以前的系统上,不管是View动画还是属性动画,新位置均无法交互,同时老位置仍然可以触发单击事件。尽管View以及在视觉上不存在了,将View移回原位以后,原位置的单击事件继续生效。从3.0开始,属性动画的单击事件触发为止为移动后的位置,但是View动画仍然在原位置。

7.硬件加速

使用动画的过程中,建议开启硬件加速,这样会提高动画的流畅性。

  • 2.View动画和属性动画的区别?

View动画执行之后并未改变View的真实布局属性值。切记这一点,譬如我们在Activity中有一个 Button在屏幕上方,我们设置了平移动画移动到屏幕下方然后保持动画最后执行状态呆在屏幕下方,这时如果点击屏幕下方动画执行之后的Button是没 有任何反应的,而点击原来屏幕上方没有Button的地方却响应的是点击Button的事件。

属性动画弥补了View动画的缺陷,你可以为一个对象的任意属性添加动画,对象自己的属性会被真的改变;当对象的属性变化的时候,属性动画会自动刷新屏幕;属性动画改变的是对象的真实属性,而且属性动画不止用于View,还可以用于任何对象。

  • 3.属性动画出现的版本和原因(或者关于属性动画的其他问题)?

出现的版本:Android 3.0(API 11)后才提供的一种全新动画模式,出现原因为作用对象局限于View,没有改变View的属性,只是改变视觉效果,动画效果单一。

属性动画简单说明(二类三方):

二类:ValueAnimator、ObjectAnimator是其重要的两个类。

三方:ValueAnimator有ofInt、ofFloat、ofObject三个重要的方法

三个方法的作用:

1.创建动画实例

2.将传入的多个参数进行平滑过渡:此处传入0和1,表示将值从0平滑过渡到1 ,如果传入了3个Int参数 a,b,c ,则是先从a平滑过渡到b,再从b平滑过渡到c,以此类推,他们内置了估值器

插值器和估值器:

插值器(Interpolator):决定值的变化模式

估值器(TypeEvaluator):决定值的具体变化数值

  • 4.动画能组合在一起使用么?

可以将动画组合在一起使用AnimatorSet,

AnimatorSet.play() 播放当前动画的同时可以

.with() :将现有动画和传入的动画同时执行

.after() :将现有动画插入到传入的动画之后执行

.before() : 将现有动画插入到传入的动画之前执行

  • 5.ObjectAnimator需要操作的view的属性(Property)有

1、Alpha 控制View的透明度

2、float TranslationX 控制X方向的位移

3、float TranslationY 控制Y方向的位移

4、float ScaleX 控制X方向的缩放倍数

5、float ScaleY 控制Y方向的缩放倍数

6、float Rotation 控制以屏幕方向为轴的旋转度数

7、float RotationX 控制以X轴为轴的旋转度数

8、float RotationY 控制以Y轴为轴的旋转度数

  • 6.补间动画都有哪些(Tween动画有哪些|怎么旋转、平移、缩放、透明度)?

补间动画由Animation类来实现具体效果,

包括平移(TranslateAnimation)、

缩放(ScaleAnimation)、

旋转(RotateAnimation)、

透明度(AlphaAnimation)

四个子类,四种变化。

  • 7.项目实现过哪些动画、怎么实现的?

帧动画、补间动画、属性动画都用过

例如下拉刷新时头布局里我们使用了帧动画

页面里有个弹出窗口使用了补间动画,还加入了BounceInterpolator插值器的效果

[ 进度条 ] 使用了属性动画

  • 8.Android动画原理

Animation框架定义了透明度,旋转,缩放和位移几种常见的动画,而且控制的是整个View
实现原理是每次绘制视图时View所在的ViewGroup中的drawChild函数获取该View的Animation的Transformation值

然后调用canvas.concat(transformToApply.getMatrix()),通过矩阵运算完成动画帧,如果动画没有完成,继续调用invalidate()函数,启动下次绘制来驱动动画

动画过程中的帧之间间隙时间是绘制函数所消耗的时间,可能会导致动画消耗比较多的CPU资源,最重要的是,动画改变的只是显示,并不能相应事件

  • 9.插值器用过没(插值器的种类有哪些|怎么自定义插值器)?

插值器决定值的变化模式,默认的种类有九个。

默认种类有:

AccelerateDecelerateInterpolator :在动画开始与结束的地方速率改变比较慢,在中间的时候加速

AccelerateInterpolator:在动画开始的地方速率改变比较慢,然后开始速率变化加快

LinearInterpolator:以常量速率改变

AnticipateInterpolator:开始的时候向后然后向前甩

CycleInterpolator:动画循环播放特定的次数,速率改变沿着正弦曲线

PathInterpolator:动画执行的效果按贝塞尔曲线

anticipateOvershootInterpolator:开始的时候向后然后向前甩一定值后返回最后的值

OvershootInterpolator:向前甩一定值后再回到原来位置

BounceInterpolator:动画结束的时候有弹起效果

自定义插值器:

写一个类实现Interpolator接口,Interpolator是一个空的接口继承了TimeInterpolator接口,定义getInterpolation方法即可