Skia API
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(...) 繪制點,可以有紋理,顏色,等附加選項。
總結
- 上一篇: sdch: chrome支持的新HTTP
- 下一篇: Android root概念