本文介绍: Android Skia一个二维图形处理引擎,是 Android 操作系统用于处理图形渲染图像处理矢量图形显示的核心组件之一。它利用 CPU 和 GPU 加速来操作位图和向量图像,并提供了各种渲染效果动画效果

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 可以分为三个主要层次的结构

  1. 应用程序层:这是使用 Android Skia 的应用程序层,它通常是基于 Android Framework 开发应用程序。在这一层次上,开发可以使用 Skia 提供的高层次 API 来实现 UI 绘制、图形渲染和动画效果功能
  2. Skia 层:这是 Skia 引擎的核心层次,包括了大量的类库和工具用于处理图像渲染、向量图形绘制、颜色管理字体渲染等方面。在这一层次上,Skia 主要负责开发者通过 API 提供的绘图指令转换成可执行的图形操作
  3. 三方库层:在 Skia 的底层,还有一些其他的库支持,包括零散式的各种 C++ 标准库、WebKit 引擎提供的 FontCache 方案,以及与 GPU 相关的 OpenGL ES 等库。这些库对于 Skia 的性能功能起着非常重要的作用。

整个 Android Skia 结构比较清晰,在不同的层次中,都提供了丰富的 API 和工具,同时也允许开发者自行扩展优化,并针对具体应用场景建立相应的图形渲染流程

Android Skia层

Android Skia 层的源码结构比较复杂,但是可以大致分为以下几个部分:

  1. core/:这个目录存放了 Skia 引擎的核心代码,包括绘图操作、颜色管理字体渲染、抽象渲染层等。
  2. images/:这个目录下主要存放了与 Android 平台密切相关的图形处理代码,包括位图变换、学习线性、颜色空间转换等。
  3. gpu/:这个目录存放了 Skia 引擎与 GPU 相关的专用接口实现代码,包括 OpenGL ES 和 Vulkan 等图形 API 的支持库和封装类。
  4. utils/:这个目录存放了一些工具类和公用方法,如集合操作文件读写调试信息记录等。
  5. 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 的核心代码主要包含了以下几个方面:

  1. 图形渲染操作:Skia 通过继承 SkCanvas 类实现图形渲染操作。SkCanvas 提供了一系列方法用于画布添加基本形状和文本,如矩形、圆弧、椭圆文字等。
  2. 颜色管理:Skia 内部使用 ICC 颜色空间标准来进行颜色管理,其提供了一个类 SkColorSpace 来表示颜色空间支持了各种常见的 RGB 和 CMYK 空间,同时还额外支持了其中一些不常见的即时扩展
  3. 字体渲染:Skia 提供了良好的字体渲染能力,It主要使用 FreeType 引擎来处理字体文件,并在此基础上支持了变换、形变和过滤等操作。此外,Skia 也支持基于平台的字体格式(SkFontFamily) 自定义字体类型
  4. 位图处理:Skia 提供了许多用于位图处理的工具,如对图片进行裁剪,压缩和缩放等操作,及对各种原始图像数据(DNG, RAW) 和 GPU 纹理的支持
  5. 矢量架构:Skia 使用了单独的 VectorDrawable 类们制作呈现矢量图形,并且针对这种矢量图形能够提供高性能的 GPU 加速。

总体来说,Skia 的核心代码非常强大,支持各种平台、颜色空间、字体和图片格式,并且提供良好的图形渲染能力和扩展性开发人员利用 Skia 提供的 API 可以轻松地实现各种业务需求,如 UI 绘制、动画效果游戏开发等。

Android 中常用的图形 API 包括 Canvas 和 OpenGL ES。

1. Canvas API

Canvas 是 Android 中 2D 图形绘制的基础 API,可以用于绘制文本、图形以及位图等。它提供了一系列绘制方法,如 drawText、drawLine、drawRect、drawBitmap 等。以下是几个常用方法示例代码:

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,需要手动管理顶点坐标、纹理坐标数据。以下是几个常用方法示例代码:

GLSurfaceView glView = new GLSurfaceView(context);
glView.setEGLConfigChooser(8, 8, 8, 8, 16, 0); // 配置像素格式和深度缓存
glView.setRenderer(new MyRenderer()); // 设置渲染器
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开发者文档

原文地址:https://blog.csdn.net/weixin_44008788/article/details/130184441

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_8811.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注