Android Skia简介
Android Skia 是一个二维图形处理引擎,是 Android 操作系统中用于处理图形渲染、图像处理和矢量图形显示的核心组件之一。它利用 CPU 和 GPU 加速来操作位图和向量图像,并提供了各种渲染效果和动画效果。
Skia 最初是由 Google 开发的,在 2005 年成为 Chrome 浏览器中的默认渲染引擎。Android 系统也采用了 Skia 引擎作为其默认的绘图引擎,并将其与 Android Framework 结合使用。一些其他流行的应用程序框架,如 Flutter 和 Fuchsia OS,也使用了 Skia 引擎。
Skia 底层使用 C++ 实现,同时提供了跨平台接口,包括针对 Android 平台的 Java 接口。在 Skia 内部,表面上任意多个图形通道都是用一种基本数据类型表示的,这使得图形对象能够轻松地进行序列化、反序列化和复制等操作。
总体而言,Skia 是一个功能强大、高效的图形处理引擎,不仅适用于 Android 平台,也可以应用于其他环境中。它对于开发者来说,提供了丰富的 API 和工具,用于实现各种图形渲染、动画效果和 UI 布局等功能。
Android Skia结构
Android Skia 可以分为三个主要层次的结构:
- 应用程序层:这是使用 Android Skia 的应用程序层,它通常是基于 Android Framework 开发的应用程序。在这一层次上,开发者可以使用 Skia 提供的高层次 API 来实现 UI 绘制、图形渲染和动画效果等功能。
- Skia 层:这是 Skia 引擎的核心层次,包括了大量的类库和工具,用于处理图像渲染、向量图形绘制、颜色管理和字体渲染等方面。在这一层次上,Skia 主要负责将开发者通过 API 提供的绘图指令转换成可执行的图形操作。
- 三方库层:在 Skia 的底层,还有一些其他的库支持,包括零散式的各种 C++ 标准库、WebKit 引擎提供的 FontCache 方案,以及与 GPU 相关的 OpenGL ES 等库。这些库对于 Skia 的性能和功能起着非常重要的作用。
整个 Android Skia 结构比较清晰,在不同的层次中,都提供了丰富的 API 和工具,同时也允许开发者自行扩展和优化,并针对具体应用场景建立相应的图形渲染流程。
Android Skia层
Android Skia 层的源码结构比较复杂,但是可以大致分为以下几个部分:
- core/:这个目录下存放了 Skia 引擎的核心代码,包括绘图操作、颜色管理、字体渲染、抽象渲染层等。
- images/:这个目录下主要存放了与 Android 平台密切相关的图形处理代码,包括位图变换、学习线性、颜色空间转换等。
- gpu/:这个目录下存放了 Skia 引擎与 GPU 相关的专用接口和实现代码,包括 OpenGL ES 和 Vulkan 等图形 API 的支持库和封装类。
- utils/:这个目录下存放了一些工具类和公用方法,如集合操作、文件读写、调试信息记录等。
- ports/:这个目录下存放了 Android Skia 的各种移植和适配代码,包括针对不同平台的编译选项、对特定硬件的优化等。
Android Skia 的源码结构非常复杂,其内部涉及的细节也非常多。主要开发者需要通过阅读文档、跟踪代码、测试样例等方式来深度理解 Skia 的使用和原理,并在此基础上开发高效、健壮的应用程序。
Skia 源码路径
在 AOSP 中,Skia 的源代码位于 frameworks/base/libs/hwui 目录下。
具体来说,Skia 的头文件位于 frameworks/base/libs/hwui/include 目录下,而其 C++ 实现则位于 frameworks/base/libs/hwui/renderthread 目录下。另外,Skia 的公共接口也被包含在了 Android 框架的 Java API 中,路径为 frameworks/base/core/java/android/graphics/。
需要注意的是,AOSP 中 Skia 发布版本可能会有所不同,可以通过跟踪 Git 历史记录查看相应版本中的代码实现情况。
Skia 的核心代码
Skia 的核心代码主要包含了以下几个方面:
- 图形渲染操作:Skia 通过继承 SkCanvas 类实现图形渲染操作。SkCanvas 提供了一系列方法用于向画布中添加基本形状和文本,如矩形、圆弧、椭圆和文字等。
- 颜色管理:Skia 内部使用 ICC 颜色空间标准来进行颜色管理,其提供了一个类 SkColorSpace 来表示颜色空间,支持了各种常见的 RGB 和 CMYK 空间,同时还额外支持了其中一些不常见的即时扩展。
- 字体渲染:Skia 提供了良好的字体渲染能力,It主要使用 FreeType 引擎来处理字体文件,并在此基础上支持了变换、形变和过滤等操作。此外,Skia 也支持以基于跨平台的字体格式(SkFontFamily) 自定义字体类型。
- 位图处理:Skia 提供了许多用于位图处理的工具,如对图片进行裁剪,压缩和缩放等操作,及对各种原始图像数据(DNG, RAW) 和 GPU 纹理的支持。
- 矢量图架构:Skia 使用了单独的 VectorDrawable 类们制作和呈现矢量图形,并且针对这种矢量图形能够提供高性能的 GPU 加速。
总体来说,Skia 的核心代码非常强大,支持各种平台、颜色空间、字体和图片格式,并且提供良好的图形渲染能力和扩展性。开发人员利用 Skia 提供的 API 可以轻松地实现各种业务需求,如 UI 绘制、动画效果、游戏开发等。
Android 中常用的图形 API 包括 Canvas 和 OpenGL ES。
1. Canvas API
Canvas 是 Android 中 2D 图形绘制的基础 API,可以用于绘制文本、图形以及位图等。它提供了一系列绘制方法,如 drawText、drawLine、drawRect、drawBitmap 等。以下是几个常用方法的示例代码:
- 绘制文本(Draw Text)
Paint paint = new Paint();
paint.setTextSize(30);
canvas.drawText("Hello, world!", 100, 100, paint);
- 绘制矩形(Draw Rectangle)
Paint paint = new Paint();
paint.setColor(Color.RED);
canvas.drawRect(50, 50, 200, 200, paint);
- 绘制图片(Draw Bitmap)
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image);
canvas.drawBitmap(bitmap, 0, 0, null);
2. OpenGL ES API
OpenGL ES 是 Android 中 3D 图形渲染的基础 API,它通过 GPU 来加速 3D 图形渲染。与 Canvas 不同,OpenGL ES 是一个相对底层的 API,需要手动管理顶点坐标、纹理坐标等数据。以下是几个常用方法的示例代码:
- 初始化 OpenGL ES
GLSurfaceView glView = new GLSurfaceView(context);
glView.setEGLConfigChooser(8, 8, 8, 8, 16, 0); // 配置像素格式和深度缓存
glView.setRenderer(new MyRenderer()); // 设置渲染器
- 绘制一个三角形(Draw a Triangle)
public void onDrawFrame(GL10 gl){
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
gl.glLoadIdentity();
gl.glTranslatef(0f, 0f, -4.0f);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
}
- 加载纹理并绘制图片(Load Textures and Draw Image)
// 加载纹理
InputStream is = context.getResources().openRawResource(R.drawable.texture);
Bitmap bitmap = BitmapFactory.decodeStream(is);
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
bitmap.recycle();
is.close();
// 绘制图片
gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);
gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
gl.glDisable(GL10.GL_TEXTURE_2D);
3.Android中的Graphics包
(即android.graphics)提供了许多用于处理图形和画布操作的基本组件,主要包括以下几种:
Canvas - 画布,用于绘制各种图形、文本等。
Paint - 画笔,用于定义绘制图形或文本的样式,如颜色、线条宽度、字体大小等。
Bitmap - 图像位图,用于表示图像数据。
Path - 路径,用于描述由复杂的曲线和直线段组成的形状。
Rect 和 RectF - 分别代表整数和浮点数格式的矩形区域。
Matrix - 用于执行图形变换,如旋转、缩放等。
Shader - 着色器,用于实现特定效果,如渐变、图像填充等。
PorterDuffXfermode - 用于控制画布上绘制图形时的混合模式。
ColorFilter - 用于对绘制的图像进行颜色过滤。
以上基本组件可以结合使用以实现各种复杂的效果和图形。详细信息可以参阅Android开发者文档。