|
序
通過google, baidu,我們都很難搜索到關(guān)于skia引擎方面的文檔,skia的官方wiki(http://code.google.com/p/skia)也只有寥寥無幾的文字簡單介紹了SkCanvas, SkBitmap等幾個(gè)主要的class,我通過分析源代碼,查看jni接口對(duì)skia引擎的封裝,總結(jié)和翻譯了下面的一些文字,希望對(duì)想在Android平臺(tái)進(jìn)行native畫圖的朋友有所幫助,當(dāng)然,你也可以直接使用OpenGL來畫圖。
Skia引擎在Android源代碼庫當(dāng)中的位置
- 頭文件(也可以說是internal API, 因?yàn)間oogle沒有在NDK里面提供他)位置:Android/external/skia/include。其中還包含以下幾個(gè)子目錄:animator, core, effects, images, views..., 最重要的就是core目錄了,我們?cè)谶@里的分析也主要針對(duì)core目錄里面的API。
- 源文件位于: Android/external/skia/src目錄,子目錄結(jié)構(gòu)和頭文件目錄相同。
- 封裝層:Android對(duì)Skia引擎進(jìn)行了封裝,以便讓Java代碼方便的調(diào)用,對(duì)skia封裝的代碼存在于Android/framework/base/core/jni以及Android/framework/base/core/jni/Android/graphics目錄下面。主要是對(duì)Canvas, Bitmap, Graphics, Picture等等的封裝,以及和libui庫的結(jié)合使用。
Skia引擎重要類簡介
(PS: 注意是簡介了,觀眾不要要求太高,我也是在摸索中整理的文檔)
1. SkCanvas
這個(gè)類是Skia引擎的一個(gè)核心類,他封裝了所有對(duì)設(shè)備進(jìn)行的畫圖操作。這個(gè)類自身包含了一個(gè)設(shè)備的引用,以及一個(gè)矩陣和裁剪棧。所有的畫圖操作,都是在經(jīng)過棧內(nèi)存放的矩陣變幻之后才進(jìn)行的(這點(diǎn)和OpenGL類似)。當(dāng)然,最終顯示給用戶的圖像,還必須經(jīng)過裁剪堆棧的運(yùn)算。
SkCanvas記錄著整個(gè)設(shè)備的繪畫狀態(tài),而設(shè)備上面繪制的對(duì)象的狀態(tài)又是由SkPaint類來記錄的,SkPaint類作為參數(shù),傳遞給不同SkCanvas類的成員函數(shù)drawXXXX().(比如:drawPoints, drawLine, drawRect, drawCircle)。SkPaint類里記錄著如顏色(color), 字體(typeface), 文字大小(textSize), 文字粗細(xì)(strokeWidth), 漸變(gradients, patterns)等。
SkCanvas類的主要成員函數(shù):
> 構(gòu)造函數(shù),給定一個(gè)Bitmap或者Device,在給定的這個(gè)對(duì)象上進(jìn)行畫圖,Device可以為空。
SkCanvas(const SkBitmap& bitmap);
SkCanvas(SkDevice* device = NULL);
> setViewport, getViewport, 這2個(gè)函數(shù)只有在支持OpenGL視圖時(shí)才有效。
> save, saveLayer, saveLayerAlpha, restore, 這4個(gè)函數(shù)用于保存和恢復(fù)顯示矩陣,剪切,過濾堆棧,不同函數(shù)有不同的附加功能。
> 移位,縮放,旋轉(zhuǎn),變形函數(shù)。
translate(SkiaScalar dx, SkiaScalar dy);
scale(SkScalar sx, SkScalar sy);
rotate(SkScalar degrees);
skew(SkScalar sx, SkScalar sy);
> 指定具體矩陣,進(jìn)行相應(yīng)的變換的函數(shù),以上4個(gè)方法都可以通過定義特定的矩陣,再調(diào)用此函數(shù)實(shí)現(xiàn)。
cancat(const SkMatrix& matrix);
> 圖像剪輯,把指定的區(qū)域顯示出來。
clipRect(SkRect&...);
clipPath(SkPath&...);
clipRegion(SkRegion&...);
> 在當(dāng)前畫布內(nèi)畫圖,有以下多種畫圖方式:
drawARGB(u8 a, u8 r, u8 g, u8 b....) 給定透明度以及紅,綠,蘭3色,填充整個(gè)可繪制區(qū)域。
drawColor(SkColor color...) 給定顏色color, 填充整個(gè)繪制區(qū)域。
drawPaint(SkPaint& paint) 用指定的畫筆填充整個(gè)區(qū)域。
drawPoint(...)/drawPoints(...) 根據(jù)各種不同參數(shù)繪制不同的點(diǎn)。
drawLine(x0, y0, x1, y1, paint) 畫線,起點(diǎn)(x0, y0), 終點(diǎn)(x1, y1), 使用paint作為畫筆。
drawRect(rect, paint) 畫矩形,矩形大小由rect指定,畫筆由paint指定。
drawRectCoords(left, top, right, bottom, paint), 給定4個(gè)邊界畫矩陣。
drawOval(SkRect& oval, SkPaint& paint) 畫橢圓,橢圓大小由oval矩形指定。
drawCicle(cx, cy, radius, paint), 給定圓心坐標(biāo)和半徑畫圓。
drawArcSkRect& oval...) 畫弧線,用法類似于畫橢圓。
drawRoundRect(rect, rx, ry, paint) 畫圓角矩形,x, y方向的弧度用rx, ry指定。
drawPath(path, paint) 路徑繪制,根據(jù)path指定的路徑繪制路徑。
drawBitmap(SkBitmap& bitmap, left, top, paint = NULL) 繪制指定的位圖, paint可以為空。
drawBitmapRect(bitmap, src, dest, paint=NULL), 繪制給定位圖的一部分區(qū)域,此區(qū)域由src指定,然后把截取的部分位圖繪制到dest指定的區(qū)域,可能進(jìn)行縮放。
drawBitmapMatrix(bitmap, matrix, paint=NULL), 功效同上,可以通過給定矩陣來進(jìn)行裁剪和縮放變換。
drawSprite(bitmap, left, top, paint=NULL), 繪制位圖,不受當(dāng)前變換矩陣影響。
drawText(void* text, byteLength, x, y, paint), 以(x,y)為起始點(diǎn)寫文字,文字存儲(chǔ)在text指針內(nèi),長度有byteLength指定。
drawPosText(...) 功能同上,不過每個(gè)文字可以單獨(dú)指定位置。
drawPosTextH(...) 功能同上,不過由一個(gè)變量指定了當(dāng)前所有文字的統(tǒng)一Y坐標(biāo),即在同一條水平線上以不同的間隔寫字。
drawTextOnPathHV, drawTextOnPath, drawTextOnPath, 以不同方式在給點(diǎn)定的path上面繪制文字。
drawPicture(SkPicture& picture) 在畫布上繪制圖片,比較高效的繪圖函數(shù)。
drawShape(SkShape*) 在畫布上繪制指定形狀的圖像。
drawVertices(...) 繪制點(diǎn),可以有紋理,顏色,等附加選項(xiàng)。
作者:Aries @ 米狗族
地址:http://www.meegozu.com
歡迎轉(zhuǎn)載,轉(zhuǎn)載時(shí)請(qǐng)保留以上信息。
it知識(shí)庫:Skia引擎API整理介紹(skia in Android 2.3 trunk),轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。