Skia引擎API整理介绍(转载)

原创 2016年08月31日 12:05:50

通过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

<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(921) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
评论热议
版权声明:本文为博主原创文章,转载请注明出处。

Skia引擎API整理

序 通过google, baidu,我们都很难搜索到关于skia引擎方面的文档,skia的官方wiki(http://code.google.com/p/skia)也只有寥寥无几的文字简单介绍了Sk...
  • xxbs2003
  • xxbs2003
  • 2013年07月23日 08:56
  • 517

浅谈 Google Skia 图形处理引擎 (转载)

2008 年九月,Google 宣布以改良过的 WebKit 为核心的网络浏览器 Chrome,揭露了众多新特征,比方说崭新的 [V8] JavaScript (ECMAscript) 执行引擎,或许...
  • chituhuan
  • chituhuan
  • 2016年08月31日 12:05
  • 832

Skia深入分析8——Skia的GPU绘图

Skia的GPU绘图一、Skia-GPU概述在Android4.2到Android5.0的过程中,skia中开发较频繁的部分莫过于GPU加速部分和延迟渲染机制,尽管目前来看几乎没有用到,但后续很可能会...
  • jxt1234and2010
  • jxt1234and2010
  • 2015年03月01日 21:56
  • 3317

Android 图形绘制(skia)

Skia是什么?打个比方来说吧,现在让你来画一幅画,比如我们的国画—山水画。画一幅画需要哪些工具呢?从常识上来说,我们需要一张纸,比如白纸,或者带有某些背景图的纸张;需要毛笔,不同型号的毛笔;墨汁;颜...
  • holdrise
  • holdrise
  • 2013年04月10日 17:55
  • 3937

Android图片编解码实现方案(Skia)

1. Android图片解码流程 1)  APP:BitmapDecode.java 2) API:BitmapFactory.java(static image)、Movie.java(dyna...
  • MyArrow
  • MyArrow
  • 2013年01月25日 10:45
  • 11339

skia编译与简单例子

我发现我总是懒得写文章。。。。本来y
  • glunoy
  • glunoy
  • 2014年05月11日 15:22
  • 7125

RESTful API知识整理

不是标准,是设计风格REST(英文:Representational State Transfer,简称REST),通常应用在web应用程序中,提供一套满足特定的约束和原则的接口,用于客户端和服务器交...
  • pony_maggie
  • pony_maggie
  • 2017年01月29日 16:41
  • 1649

Windows下从源码编译Skia

在PPAPI里面绘图,可以结合第三方的图形库,比如cairo、skia,我选择skia,Chrome、Android都用它……...
  • foruok
  • foruok
  • 2016年01月15日 17:53
  • 5110

Skia深入分析

一、渲染层级 从渲染流程上分,Skia可分为如下三个层级: 1、指令层:SkPicture、SkDeferredCanvas->SkCanvas 这一层决定需要执行哪些绘图操作,绘图操作的预变换...
  • hgl868
  • hgl868
  • 2015年05月08日 18:42
  • 7092

Skia深入分析5——skia文字绘制的实现

版权声明:本文为博主原创文章,转载请注明出处:http://blog.csdn.net/jxt1234and2010 文字绘制主要包括编码转换(主要是中文)、字形解析(点线或image)...
  • u012288815
  • u012288815
  • 2016年06月08日 18:06
  • 1310
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Skia引擎API整理介绍(转载)
举报原因:
原因补充:

(最多只允许输入30个字)