您的位置:华清远见教育科技集团 >> 新闻动态 >> Android资料 >> Android Skia图形渲染  
 
Android Skia图形渲染
分享到:

图形渲染是Skia引擎的重要功能之一,在Skia图形渲染的基类为SkDisplayable,其扩展类包括SkText、SkLine、SkDrawPath、SkBaseBitmap、SkDrawRect等基本图形操作。Skia引擎的图形架构下图所示。


Skia引擎的图形架构

SkDevice是渲染设备的逻辑抽象,支持获取SkBitmap的宽、高、配置、是否透明等信息。支持通过SkDraw进行的基本绘图操作,如Paint、Points、Rect、Path、Bitmap、Sprite、Text、PosText、TextOnPath、Vertices、Device等操作。在通常情况下,不建议直接调用SkDevice的方法,为了进行图形操作,可以通过SkCanvas的方法来进行。

SkDraw是Skia进行渲染时的实际执行类,SkDevice在进行渲染操作时需要调用该类的方法。

SkBitmap是渲染设备的物理抽象,是SkDevice的渲染对象。SkBitmap的配置信息包括色深(1位还是8位)、配色板(Color Table)、元数据模式(RGB565、ARGB4444、ARGB8888)等。

Image* ImageBuffer::image() const
    {
    if (!m_image) {
        ASSERT(context());
        SkCanvas* canvas=context()->platformContext()->mCanvas;    //获取SkCanvas
        SkDevice* device=canvas->getDevice();    //获取SkDevice
        const SkBitmap& orig=device->accessBitmap(false);    //获取SkBitmap
        SkBitmap copy;
        orig.copyTo(©, orig.config());    //深度复制
        …
        }
    …
    }

SkCanvas是Skia的画布类,封装了渲染设备上的所有状态,通过和画笔类SkPaint协同工作,来完成所有的渲染操作。SkCanvas渲染的一般过程如代码8-5所示:

SkRegion是Skia的渲染区域类,是Surface Flinger里面计算可视区域的操作基本单位。

代码:SkCanvas渲染的一般过程

void CursorRing::DrawRing(SkCanvas* canvas,const Vector< WebCore::IntRect>& rects, Flavor flavor)
    {
    unsigned    rectCount=rects.size();
    SkRegion    rgn;
    SkPath    path;
    for (unsigned i=0; i < rectCount; i++)
    {
        SkRect  r(rects[i]);
        SkIRect ir;
        r.round(&ir);
        ir.inset(-CURSOR_RING_OUTER_OUTSET, -CURSOR_RING_OUTER_OUTSET);
        rgn.op(ir, SkRegion::kUnion_Op);
    }
    rgn.getBoundaryPath(&path);
    SkPaint paint;
    paint.setAntiAlias(true);
    paint.setPathEffect(new SkCornerPathEffect(CURSOR_RING_ROUNDEDNESS))->unref();
    if (flavor >=NORMAL_ANIMATING) { // pressed
        paint.setColor(cursorPressedColors[flavor - NORMAL_ANIMATING]);
        canvas->drawPath(path, paint);
    }
    paint.setStyle(SkPaint::kStroke_Style);    //设置风格
    paint.setStrokeWidth(CURSOR_RING_OUTER_DIAMETER);    //设置宽度
    paint.setColor(cursorOuterColors[flavor]);    //设置颜色
    canvas->drawPath(path, paint);    //执行渲染
    paint.setStrokeWidth(CURSOR_RING_INNER_DIAMETER);
    paint.setColor(cursorInnerColors[flavor]);
    canvas->drawPath(path, paint);
    }

SkString为进行字符串的渲染提供了一个轻量级的接口,通过引入参考记数机制减小了内存的消耗,支持字符串的插入、合并、追加、互换、字体大小、编码设置等操作。其默认的编码为UTF8,支持UTF16编码。

SkIPoint在渲染一个点时需要(x,y)坐标。支持点的旋转、缩放、点间距离等操作。

 更多相关文章

·Android Skia 渲染概述
·Android Surface渲染管理
·Android LayerBuffer模式的layer渲染
·Android应用程序之WebApp开发实战
·从开发到盈利--安卓程序商业化之路