通过google, baidu,我们都很难搜索到关于skia引擎方面的文档,skia的官方wiki(http://code.google.com/p/skia) 也只有寥寥无几的文字简单介绍了SkCanvas, SkBitmap等几个主要的class,我通过分析源代码,查看jni接口对skia引擎的封装,总结和翻译了下面的一些文字,希望对想在 Android平台进行native画图的朋友有所帮助,当然,你也可以直接使用OpenGL来画图。

Skia引擎在android源代码库当中的位置

头 文件(也可以说是internal API, 因为google没有在NDK里面提供他)位置:android/external/skia/include。其中还包含以下几个子目 录:animator, core, effects, images, views..., 最重要的就是core目录了,我们在这里的分析也主要针对core目录里面的API。

源文件位于: android/external/skia/src目录,子目录结构和头文件目录相同。

封 装层:android对Skia引擎进行了封装,以便让java代码方便的调用,对skia封装的代码存在于android/framework /base/core/jni以及android/framework/base/core/jni/android/graphics目录下面。主要是 对Canvas, Bitmap, Graphics, Picture等等的封装,以及和libui库的结合使用。

Skia引擎重要类简介

(PS: 注意是简介了,观众不要要求太高,我也是在摸索中整理的文档)

1. SkCanvas     这个类是Skia引擎的一个核心类,他封装了所有对设备进行的画图操作。这个类自身包含了一个设备的引用,以及一个矩阵和裁剪栈。所有的画图操作, 都是在经过栈内存放的矩阵变幻之后才进行的(这点和OpenGL类似)。当然,最终显示给用户的图像,还必须经过裁剪堆栈的运算。

SkCanvas记录着整个设备的绘画状态,而设备上面绘制的对象的状态又是由SkPaint类来记录的,SkPaint类作为参数,传递给不同 SkCanvas类的成员函数drawXXXX().(比如:drawPoints, drawLine, drawRect, drawCircle)。SkPaint类里记录着如颜色(color), 字体(typeface), 文字大小(textSize), 文字粗细(strokeWidth), 渐变(gradients, patterns)等。

SkCanvas类的主要成员函数:

> 构造函数,给定一个Bitmap或者Device,在给定的这个对象上进行画图,Device可以为空。

SkCanvas(const SkBitmap& bitmap);

SkCanvas(SkDevice* device = NULL);

> setViewport, getViewport, 这2个函数只有在支持OpenGL视图时才有效。

> save, saveLayer, saveLayerAlpha, restore, 这4个函数用于保存和恢复显示矩阵,剪切,过滤堆栈,不同函数有不同的附加功能。

> 移位,缩放,旋转,变形函数。

translate(SkiaScalar dx, SkiaScalar dy);

scale(SkScalar sx, SkScalar sy);

rotate(SkScalar degrees);

skew(SkScalar sx, SkScalar sy);

> 指定具体矩阵,进行相应的变换的函数,以上4个方法都可以通过定义特定的矩阵,再调用此函数实现。

cancat(const SkMatrix& matrix);

> 图像剪辑,把指定的区域显示出来。

clipRect(SkRect&...);

clipPath(SkPath&...);

clipRegion(SkRegion&...);

> 在当前画布内画图,有以下多种画图方式:

drawARGB(u8 a, u8 r, u8 g, u8 b....) 给定透明度以及红,绿,兰3色,填充整个可绘制区域。

drawColor(SkColor color...) 给定颜色color, 填充整个绘制区域。

drawPaint(SkPaint& paint) 用指定的画笔填充整个区域。

drawPoint(...)/drawPoints(...) 根据各种不同参数绘制不同的点。

drawLine(x0, y0, x1, y1, paint) 画线,起点(x0, y0), 终点(x1, y1), 使用paint作为画笔。

drawRect(rect, paint) 画矩形,矩形大小由rect指定,画笔由paint指定。

drawRectCoords(left, top, right, bottom, paint), 给定4个边界画矩阵。

drawOval(SkRect& oval, SkPaint& paint) 画椭圆,椭圆大小由oval矩形指定。

drawCicle(cx, cy, radius, paint), 给定圆心坐标和半径画圆。

drawArcSkRect& oval...) 画弧线,用法类似于画椭圆。

drawRoundRect(rect, rx, ry, paint) 画圆角矩形,x, y方向的弧度用rx, ry指定。

drawPath(path, paint) 路径绘制,根据path指定的路径绘制路径。

drawBitmap(SkBitmap& bitmap, left, top, paint = NULL) 绘制指定的位图, paint可以为空。

drawBitmapRect(bitmap, src, dest, paint=NULL), 绘制给定位图的一部分区域,此区域由src指定,然后把截取的部分位图绘制到dest指定的区域,可能进行缩放。

drawBitmapMatrix(bitmap, matrix, paint=NULL), 功效同上,可以通过给定矩阵来进行裁剪和缩放变换。

drawSprite(bitmap, left, top, paint=NULL), 绘制位图,不受当前变换矩阵影响。

drawText(void* text, byteLength, x, y, paint), 以(x,y)为起始点写文字,文字存储在text指针内,长度有byteLength指定。

drawPosText(...) 功能同上,不过每个文字可以单独指定位置。

drawPosTextH(...) 功能同上,不过由一个变量指定了当前所有文字的统一Y坐标,即在同一条水平线上以不同的间隔写字。

drawTextOnPathHV, drawTextOnPath, drawTextOnPath, 以不同方式在给点定的path上面绘制文字。

drawPicture(SkPicture& picture) 在画布上绘制图片,比较高效的绘图函数。

drawShape(SkShape*) 在画布上绘制指定形状的图像。

drawVertices(...) 绘制点,可以有纹理,颜色,等附加选项。

2. SkBitmap

(待续)

3. SkTypeface, SkFontHost

(待续)

作者:Aries @ 米狗族

地址:http://www.meegozu.com

欢迎转载,转载时请保留以上信息。

android对skia的封装,Skia引擎API整理介绍(skia in Android 2.3 trunk)相关推荐

  1. Skia引擎API整理介绍(skia in Android 2.3 trunk)

    序 通过google, baidu,我们都很难搜索到关于skia引擎方面的文档,skia的官方wiki(http://code.google.com/p/skia)也只有寥寥无几的文字简单介绍了SkC ...

  2. Skia引擎API整理介绍

    http://code.google.com/p/skia/ svn checkout http://skia.googlecode.com/svn/trunk/ skia-read-only Ski ...

  3. 【定有惊喜】android程序员如何做自己的API接口?php与android的良好交互(附环境搭建),让前端数据动起来~...

    一.写在前面 web开发有前端和后端之分,其实android还是有前端和后端之分.android开发就相当于手机app的前端,一般都是php+android或者jsp+android开发.androi ...

  4. android 百度地图 itemizedoverlay,[008] 百度地图API之ItemizedOverlay的使用(Android) .

    本篇文章主要介绍如何在百度地图上添加Overlay(即图层或覆盖物). Overlay简介 Overlay通常被译为"图层"或"覆盖物".那么对于地图而言,什么 ...

  5. android 百度地图 itemizedoverlay,[008] 百度地图API之ItemizedOverlay的使用(Android)

    本篇文章主要介绍如何在百度地图上添加Overlay(即图层或覆盖物). Overlay简介 Overlay通常被译为"图层"或"覆盖物".那么对于地图而言,什么 ...

  6. android使用post方法登录,使用REST API使用POST方法在Android中登录示例

    如果您熟悉库,则完成此任务的简单方法是使用库.我推荐 Ion,因为它小而且易于使用.添加库并将以下代码段添加到您选择的方法中. Ion.with(getApplicationContext()) .l ...

  7. Android第三方开发包之高德地图SDK使用介绍

    Android第三方开发包之高德地图SDK使用介绍 前言 准备 Android Studio 配置工程 1,新建一个 Empty Activity 应用项目. 2,添加SDK 3,集成SDK 显示地图 ...

  8. Skia的初探(Skia的GN脚本编译与第一个Skia应用)

    前言 如今大前端代表之一flutter十分火热,也是一种大的趋势.flutter与rn对大前端上的理解不同,rn是自上而下的大前端解决方案,而flutter是自下而上的大前端解决方案.为什么我说flu ...

  9. Android Animation学习(一) Property Animation原理介绍和API简介

    Android Animation学习(一) Property Animation介绍 Android Animation Android framework提供了两种动画系统: property a ...

最新文章

  1. 使用OpenGL Shader实现放大镜效果
  2. r语言导出html改不了名,请问如何进行数据框列的重命名?
  3. npm打包前端项目太慢问题分析以及暂时解决方案
  4. .NET IdentityServer4实战-开篇介绍与规划
  5. JS判断UA动态加载CSS的方法
  6. (亲测)Hbase安装(傻瓜式安装)
  7. 记一次虚拟机共享文件夹的采坑之旅
  8. Quartus II 9.0正式版下载
  9. Urlrewrite地址重写
  10. HSRP协议 实现单 双机热备份(计算机网络课设)
  11. Lammps安装教程 windows版
  12. 失去灵魂的百度还能撑几年?
  13. 手把手教你使用Newstart HA
  14. 深入剖析串口通信数据格式
  15. 《勋伯格和声学》读书笔记(六):关于获得较好和声的一些提示
  16. 一文了解在职提升专、本科还有多少途径?
  17. 合众达SEED-DEC138工作环境配置
  18. MyDockFinder 5.5体验极致模拟 Mac OS 系统桌面,完美支持最新版Win10 系统,可使用系统级模糊效果
  19. 凯利公式介绍、计算公式以及在投资中的运用
  20. UC/OS的46个系统函数

热门文章

  1. mysql 之 一个库中所有表复制到另一个数据库中的方法和工具
  2. OpenCV图像锐化/增强
  3. C# 跨线程调用控件
  4. [C++] 匿名管道的理解与实现
  5. MFC 操作配置文件INI的方法
  6. CImage与OpenCV兼容问题
  7. c++中,可以用类名直接访问非静态成员函数?
  8. envi插件大津法_IDL打开科学数据集
  9. 第三次握手为什么没有序列号_图解TCP三次握手与四次分手
  10. 信息收集——Web目录扫描