定义
A drawable is general abstraction for something that can be drawn.
实例化Drawable的两种方式
- inflate一个图片资源
- inflate一个XML文件
res/drawable/ 目录下的图片资源会自动被aapt无损压缩,因此实际占用的空间会更小,也正是因为这个原因,图片的二进制存储方式将改变,因此如果要用二进制流的方式读取一张图片,然后转换成bitmap,应该放到res/raw/目录下。
VectorDrawable(Android 5.0 above)
A VectorDrawable is a vector graphic defined in an XML file as a set of points, lines, and curves along with its associated color information
- 根标签为<vector>由group和path构成
- 低于Android5.0可以使用VectorDrawableCompat和AnimatedVectorDrawableCompat
处理Bitmap
- ALPHA_8,ARGB_8888,RGB_565代表的是1个像素的存储方式
- 通过bitmap能够拿到Palette,可以获得图片的主色等等信息
硬件加速
- Application和Activitiy级别 <application> hardwareAccelerated="true"
- window级别可以设置Flags
- View级别设置setLayerType
硬件加速和非硬件加速下的绘图模型
- 非硬件加速:
1.invalidate视图树
2.绘制视图树
缺点:要遍历视图树,带来非必要的操作、因为整个被涉及的视图树重绘,可能带来bug,比如重绘已经被更改的view - 硬件加速
1.invalidate视图树
2.记录并更新展示列表
3.绘制展示列表
优化:不需要重绘的view不会重绘,复用之前被记录的view
缺点:会消耗video内存
View层级
- View.setLayerType()
- LAYER_TYPE_NONE,默认模式,View会被正常渲染,没有off-screen buffer
- LAYER_TYPE_HADRWARE,View会被硬件加速渲染,如果设备不支持硬件加速,会用LAYER_TYPE_SOFEWARE模式渲染
- LAYER_TYPE_SOFTWARE,View会被软件渲染入bitmap
OpenGL ES
- Android支持OpenGL是通过framework API和NDK
- 两个基类
- GLSurfaceView
- GLSurfaceView.Renderer接口,通过setRenderer()方法和GLSurfaceView绑定,在回调中定义GLSurfaceView如何绘制
- 因为OpenGL会假设绘制区域是正方形的,所以需要投影转换坐标
- Projection matrix
- Camera transformation matrix
- 使用OpenGL显示图形
- 构建OpenGL ES环境:manifest声明、实现GLSurfaceView和GLSurfaceView.Renderer
- 定义形状
- 绘制形状
- 应用投影和相机视图
- 添加动画
- 响应触摸事件
优化
- 减少过度绘制
- 性能和视图层次结构
- 使用Profile GPU Renderering进行分析
网友评论