Android 动画相关面试总结

动画总结:Android 动画总结

面试题持续更新中~~

1 动画分类

1.1 动画类型有哪几种?它们的区别在哪里?

两种。视图动画、属性动画

视图动画包括:逐帧动画(frame-by-frame animation)、补间动画(tweened animation)

属性动画包括:ValueAnimator、ObjectAnimator 、AnimatorSet

区别:视图动画只能作用于View,而属性动画能作用于任何对象。

1.2 两种动画类型它们的优缺点分别是什么?

视图动画

优点:使用简单,并且设置需要的时间较短。

缺点:

只能对公开对象的部分添加动画效果(例如:可以对View缩放和旋转添加动画,但无法对背景颜色这样做);
只能对绘制视图的位置进行修改,而不能修改实际的视图本身(例如:View位移到了上方,但是其点击区域还是在原来的地方)。

属性动画

优点:相比视图动画,使用相对复杂,设置需要的时间更长。

缺点:

可以为任何对象(视图和非视图)的任何属性添加动画效果

能够修改实际对象本身

1.3 为什么视图动画只能修改视图而无法改变自身属性?

视图动画是通过父view来不断调整子view的画布canvas坐标系来实现的,发生动画的其实是父View而不是该view。所以补间动画其实只是调整了子view画布canvas的坐标系,其实并没有修改任何属性,所以只能在原位置才能处理触摸事件。

2 视图动画

2.1 帧动画在使用时需要注意什么?

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

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

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

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

2.2 帧动画如果避免OOM?

减少帧数、压缩图片

降低帧动画的帧数,别搞那么高帧率了,能用就行。

将所有资源图片压缩一波,什么png转webp统统走一遍。

如果播放完了给View来一波stopAnimation()、setDrawable(null)等。

bitmap优化

http://stackoverflow.com/questions/8692328/causing-outofmemoryerror-in-frame-by-frame-animation-in-android

surfaceView

https://blog.csdn.net/qq_25804863/article/details/65634864

https://www.jianshu.com/p/edcca8d3dd00

2.3 多个动画如何一起执行?

使用AnimatorSet或者PropertyValuesHolder。

AnimatorSet:

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

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

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

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

PropertyValuesHolder:

//可以通过Keyframe类实现添加关键帧数据。
Keyframe ka0 = Keyframe.ofFloat(0f, 0f);
Keyframe ka1 = Keyframe.ofFloat(1f, 1f);
PropertyValuesHolder p0 = PropertyValuesHolder.ofKeyframe("alpha", ka0, ka1);

Keyframe ks0 = Keyframe.ofFloat(0f, 0.2f);
Keyframe ks1 = Keyframe.ofFloat(1f, 1.0f);
PropertyValuesHolder p1 = PropertyValuesHolder.ofKeyframe("scaleX", ks0, ks1);

ObjectAnimator objectAnimator = ObjectAnimator.ofPropertyValuesHolder(view, p0, p1);
objectAnimator.setDuration(2500);
objectAnimator.start();
2.4 插值器是什么?如何使用?

插值器是用来控制动画变化的速率

实现Interpolator接口重写getInterpolation方法。在getInterpolation方法利用参数input得到动画进度,通过input计算出你想要的进度并返回。

2.5 补间动画都有哪些?

平移(TranslateAnimation)、缩放(ScaleAnimation)、旋转(RotateAnimation)、透明度(AlphaAnimation)

3 属性动画

3.1 属性动画出现的版本和原因

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

3.2 估值器是什么?如何使用?

估值器是用来计算出属性在当前进度的具体值。也就是说插值器是计算进度百分比,而估值器是利用这个百分比,计算出具体值。

实现TypeEvaluator接口重写evaluate方法。根据evaluate方法提供的参数计算出具体值。

// evaluate方法参数说明
// fraction:插值器getInterpolation()的返回值
// startValue:动画的初始值
// endValue:动画的结束值

3.3 插值器与估值器的作用是什么?

插值器是计算进度百分比,决定动画的变化趋势,插值器算是动画的速度控制器(匀速、加速、减速)。而估值器是利用这个百分比计算出具体值。

估值器是属性动画的特有的。

3.4 PropertyValuesHolder的作用是什么?

属性动画数据存储单元。

是用来保存某个属性property对应的一组值,这些值对应了一个动画周期中的所有关键帧。

在属性动画中,不管我们调用哪个ofXXX,最终都会被封装成PropertyValuesHolder,然后保存在ValueAnimator的mValues中。

同时利用PropertyValuesHolder也可以在属性动画中实现类似AnimatorSet的多动画执行的功能。具体可以使用ofPropertyValuesHolder方法。

4 其他

4.1 项目实现过哪些动画?怎么实现的?

因人而异啦!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值