这里的硬件加速是指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)

最新文章

  1. Struts相关
  2. Atitit 理解Monad attilax总结
  3. node 日志管理log4js
  4. bzoj2012: [Ceoi2010]Pin
  5. Erlang库 -- 有意思的库汇总
  6. POJ 2823【单调队列】
  7. Python 中使用optparse进行参数解析
  8. php/ java/asp.net
  9. Smarty中一些标签的使用
  10. Ubuntu桌面版与服务器版有什么不同?
  11. tomcat,tomcat7配置https
  12. C# DropDownList绑定添加新数据的几种方法
  13. QSqlDatabase::addDatabase第一次运行的时候,生成SQLite文件的同时会产生一个默认连接
  14. C++中const用法详解
  15. HNTX_PC 代码总结
  16. 打开&quot;我的电脑&quot;等特殊文件夹ShellExecute
  17. JQ滚动特效
  18. docker挂载NVIDIA显卡运行pytorch
  19. Spring声明式事务配置
  20. cents上运行wget报错:unable to resolve host address

热门文章

  1. [转]C#线程同步(1)- 临界区&Lock
  2. WPF 导出Excel 导出图片
  3. LUOGU P2962 [USACO09NOV]灯Lights
  4. BZOJ 1933 [Shoi2007]Bookcase 书柜的尺寸
  5. go modules
  6. spring入门案例分析及原理
  7. JAVA面试常见问题之常见集合篇
  8. Django项目:CRM(客户关系管理系统)--26--18PerfectCRM实现King_admin搜索关键字
  9. poj 1654 Area(求多边形面积 &amp;&amp; 处理误差)
  10. Eclipse安装Spket插件