# 提升动画性能
Android
提供三个平台框架,帧动画(太耗资源能不用就不用),补间动画(包括:淡入淡出 AlphaAnimation,缩放
ScaleAnimation
,平移 TranslationAnimation
,和旋转 RotateAnimation
),和属性动画。
# 一、使用属性动画
# (一)补间动画局限性:
- 补间动画只能用于 View 对象,也就是继承于 View 或者 View 的控件。
- 只有四种动画操作,淡入淡出,缩放,平移,旋转
- 不见动画是改变 View 的显示效果,但是没有改变真正的属性。也就是假设 View 移动了,要是点击移动后的地方是没有用的,还是只能点击期初的位置。
# (二)属性动画的特性:
- 持续时间:默认长度 300Ms
- 时间插值器(Time Interpolation)。能够指定为计算当前动画运行时间的函数的属性值来觉得动画范围内的变化频率。
- 重复次数和行为。
- 动画集合(AnimationsSet)
- 帧刷新延迟:默认 10s 刷新一次。
具体的使用:查看 View 相关技术-->Animation 相关--->属性动画
# 二、硬件加速
# (一)硬件加速原理
在硬件加速渲染模型中有一个重要的核心类:DisplayList,每个 View 内部都会维护一个 DisplayList。
在不支持硬件加速的版本中,View 的更新通过 draw
和 invalidate
()方法通知更新并重新渲染。
在支持硬件加速的版本中,其中执行绘制的 draw
方法会把所有绘制命令记录到一个新的显示列表(DisplayList),这个 DisplayList
包含输出的 View 层级绘制代码,但是并不是加入到显示列表立即执行,当 ViewTree 的 DisplayList 全部记录完毕后,由 OpenGLRender
负责将 root view 的 DisplayList
渲染到屏幕上,而 invalidate()只是显示列表中的记录和更新显示层级就可以了,不用更新 View。
# (二)硬件加速的级别
- Application 级别:在 Mnifest.xml 文件中的 application 中添加属性:android:hardwareAccelerated="true",这样整个应用都采用硬件加速
- Activity 级别:在
<activity android:hardwareAccelerated="true"/>
- Window 级别:
getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED).
- View 级别:
View.setLayerType(View.LAYER_TYPE_SOFTWARE,null).
# (三)在动画上使用硬件加速
使用 view.setLayerType(type,Paint)
方法,第一个参数是使用的层类型,第二个参数为可选参数,可以吧 paint
参数应用到颜色过滤上,特别是混合模式或者是对一个 Layer 进行不透明处理。
类型有以下几种:
LAYER_TYPE_NONE
:默认渲染方式,不会返回一个离线缓冲,默认值LAYER_TYPE_HARDWARE
:使用硬件加速LAYER_TYPE_SOFTWARE
:此 View 通过软件渲染为一个 Bitmap。
设计动画的流程:
将要执行动画的 View
的 TYPE
设置为 LAYER_TYPE_HARDWARE。
计算动画 View 的属性和信息,更新 view 的属性
若动画结束,将 LayerType
设置为 None。
# 三、硬件加速的问题
- 在软件渲染的时候,可以重用 Bitmap 的方法来节省内存,但是如果开启硬件加速就不行了。
- 开启硬件加速的 view 在前台运行,需要耗费额外的内存,加速的 UI 切换到后台时,产生的额外内存可能不会释放。
- 当 UI 中存在过度绘制时候,硬件加速会比较容易发生问题。
- 本文链接: https://mrgaogang.github.io/android/performance/%E6%8F%90%E5%8D%87%E5%8A%A8%E7%94%BB%E6%80%A7%E8%83%BD.html
- 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 许可协议。转载请注明出处!