android对skia的封装,Skia引擎API整理介绍(skia in Android 2.3 trunk)
序
通过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)相关推荐
- Skia引擎API整理介绍(skia in Android 2.3 trunk)
序 通过google, baidu,我们都很难搜索到关于skia引擎方面的文档,skia的官方wiki(http://code.google.com/p/skia)也只有寥寥无几的文字简单介绍了SkC ...
- Skia引擎API整理介绍
http://code.google.com/p/skia/ svn checkout http://skia.googlecode.com/svn/trunk/ skia-read-only Ski ...
- 【定有惊喜】android程序员如何做自己的API接口?php与android的良好交互(附环境搭建),让前端数据动起来~...
一.写在前面 web开发有前端和后端之分,其实android还是有前端和后端之分.android开发就相当于手机app的前端,一般都是php+android或者jsp+android开发.androi ...
- android 百度地图 itemizedoverlay,[008] 百度地图API之ItemizedOverlay的使用(Android) .
本篇文章主要介绍如何在百度地图上添加Overlay(即图层或覆盖物). Overlay简介 Overlay通常被译为"图层"或"覆盖物".那么对于地图而言,什么 ...
- android 百度地图 itemizedoverlay,[008] 百度地图API之ItemizedOverlay的使用(Android)
本篇文章主要介绍如何在百度地图上添加Overlay(即图层或覆盖物). Overlay简介 Overlay通常被译为"图层"或"覆盖物".那么对于地图而言,什么 ...
- android使用post方法登录,使用REST API使用POST方法在Android中登录示例
如果您熟悉库,则完成此任务的简单方法是使用库.我推荐 Ion,因为它小而且易于使用.添加库并将以下代码段添加到您选择的方法中. Ion.with(getApplicationContext()) .l ...
- Android第三方开发包之高德地图SDK使用介绍
Android第三方开发包之高德地图SDK使用介绍 前言 准备 Android Studio 配置工程 1,新建一个 Empty Activity 应用项目. 2,添加SDK 3,集成SDK 显示地图 ...
- Skia的初探(Skia的GN脚本编译与第一个Skia应用)
前言 如今大前端代表之一flutter十分火热,也是一种大的趋势.flutter与rn对大前端上的理解不同,rn是自上而下的大前端解决方案,而flutter是自下而上的大前端解决方案.为什么我说flu ...
- Android Animation学习(一) Property Animation原理介绍和API简介
Android Animation学习(一) Property Animation介绍 Android Animation Android framework提供了两种动画系统: property a ...
最新文章
- 使用OpenGL Shader实现放大镜效果
- r语言导出html改不了名,请问如何进行数据框列的重命名?
- npm打包前端项目太慢问题分析以及暂时解决方案
- .NET IdentityServer4实战-开篇介绍与规划
- JS判断UA动态加载CSS的方法
- (亲测)Hbase安装(傻瓜式安装)
- 记一次虚拟机共享文件夹的采坑之旅
- Quartus II 9.0正式版下载
- Urlrewrite地址重写
- HSRP协议 实现单 双机热备份(计算机网络课设)
- Lammps安装教程 windows版
- 失去灵魂的百度还能撑几年?
- 手把手教你使用Newstart HA
- 深入剖析串口通信数据格式
- 《勋伯格和声学》读书笔记(六):关于获得较好和声的一些提示
- 一文了解在职提升专、本科还有多少途径?
- 合众达SEED-DEC138工作环境配置
- MyDockFinder 5.5体验极致模拟 Mac OS 系统桌面,完美支持最新版Win10 系统,可使用系统级模糊效果
- 凯利公式介绍、计算公式以及在投资中的运用
- UC/OS的46个系统函数