canvas教程

android非硬件加速绘制简单流程

字号+ 作者:H5之家 来源:H5之家 2017-07-08 14:00 我要评论( )

这里的硬件加速是指openGL + GPU 如果不适用硬件加速: 1 ViewRootImpl.java draw:if (!dirty.isEmpty() || mIsAnimating || accessibilityFocusDirty) { if (mA

标签:left   surface   fff   asa   face   cpp   erp   erer   enter   

这里的硬件加速是指openGL + GPU

如果不适用硬件加速:

 

1 ViewRootImpl.java draw:
if (!dirty.isEmpty() || mIsAnimating || accessibilityFocusDirty) {
if (mAttachInfo.mHardwareRenderer != null && mAttachInfo.mHardwareRenderer.isEnabled()) {
...
mAttachInfo.mHardwareRenderer.draw(mView, mAttachInfo, this); //使用硬件绘制
...
} else {
//使用软件绘制
if (!drawSoftware(surface, mAttachInfo, xOffset, yOffset, scalingRequired, dirty)) {
return;
}
}

2. drawSoftware:
...
canvas = mSurface.lockCanvas(dirty); //dequeueBuffer, 向sf申请buffer 构造一个canvas
...
mView.draw(canvas); //调用view类中的draw,使用canvas画图
...
surface.unlockCanvasAndPost(canvas); // queueBuffer 提交到sf
...

3. canvas 画图的实现如 Canvas.java 中drawArc:
=》 native_drawArc

4. android_graphics_canvas.cpp:
static JNINativeMethod gMethods[] = {
...
{"native_drawArc","(JFFFFFFZJ)V", (void*) CanvasJNI::drawArc},
...
}
=> static void drawArc(JNIEnv* env, jobject, jlong canvasHandle, jfloat left, jfloat top,
jfloat right, jfloat bottom, jfloat startAngle, jfloat sweepAngle,
jboolean useCenter, jlong paintHandle) {
const Paint* paint = reinterpret_cast<Paint*>(paintHandle);
get_canvas(canvasHandle)->drawArc(left, top, right, bottom, startAngle, sweepAngle,
useCenter, *paint);
}
// canvasHandle从何而来?
static jlong initRaster(JNIEnv* env, jobject, jobject jbitmap) {
SkBitmap bitmap;
if (jbitmap != NULL) {
GraphicsJNI::getSkBitmap(env, jbitmap, &bitmap);
}
return reinterpret_cast<jlong>(Canvas::create_canvas(bitmap));
}

5. SkiaCanvas.cpp:
Canvas* Canvas::create_canvas(const SkBitmap& bitmap) {
return new SkiaCanvas(bitmap);
}
=>
SkiaCanvas::SkiaCanvas(const SkBitmap& bitmap) : mHighContrastText(false) {
mCanvas.reset(new SkCanvas(bitmap));
}

//最终调到了SkCanvas ? 它是google的2d图像库,这里用bitmap构造,在bitmap上画图
源码位于android/external/skia/

所以封装层次是 Canvas.java (Java) -》 android_graphics_canvas.cpp(JNI) -》SkiaCanvas.cpp(native) -》 SkCanvas (so lib)

android非硬件加速绘制简单流程

标签:left   surface   fff   asa   face   cpp   erp   erer   enter   

原文:

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • Unity3D之UGUI学习笔记(一):UGUI介绍以及Canvas

    Unity3D之UGUI学习笔记(一):UGUI介绍以及Canvas

    2017-06-01 10:02

  • 【Android】自己定义View、画家(画布)Canvas与画笔Paint的应用

    【Android】自己定义View、画家(画布)Canvas与画笔Paint的应用

    2017-05-26 08:00

  • CSS Secrets边框技巧

    CSS Secrets边框技巧

    2017-05-05 14:02

  • 众创缘 web前端开发,ui设计,seo,网络营销互联网技术学习网站

    众创缘 web前端开发,ui设计,seo,网络营销互联网技术学习网站

    2017-03-29 14:00

网友点评