资源描述:
《ANDROID图形系统详解》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、ANDROID图形系统详解木文试图讲述Android图形系统的底层实现。Android图形系统底层实现非常复杂,文档较少,没冇使用比较流行的图形组建如Xwindow,Cairo等。Android中的图形系统采用Client/Server架构。Server(即SurfaceFlingcr)主耍由c++代码编写而成。Client端代码分为两部分,一部分是由Java提供的供应用使用的api,另一部分则是由C++写成的底层实现。下图概要介绍了android图形系统的架构以及使用到的主要组件。Android图形系统中一个重要的概念和线索是sur
2、face®View及其子类(如TextView,Button)要画在surface上。每个surface创建一个Canvas对象(但属性时常改变),用来管理view在surfaceJ:的绘图操作,如画点画线。每个canvas对象对应一个bitmap,存储画在surface上的内容。每个Surface通常对应两个buffer,一个frontbuffer,一个backbuffer<>其中,backbuffer就是canvas绘图时对应的bitmap(研究android_view_Surface.cpp::lockCanvas)。因此,绘画
3、总是在backbuffcr_E,需要更新时,则将backbuffer和frontbuffer互换。ThewindowistiedtoaSurfaceandtheViewRootaskstheSurfaceforaCanvasthatisthenusedbytheViewstodrawonto.AfterViewdrawitsdatatocanvas,ViewRootwillcallsurface.unlockCanvasAndPost(canvas)toschedulesurfaceFlinger::composeSurfaces()
4、whichdotheactuallydisplaytodisplaypanel.SurfaceFlingerhandlestotransfersdrawndataincanvastosurfacefrontbufferorbackbufferExceptforSurfacoVicws,diffcrcntviewswithinthesameViewRootsharethesamesurface.Layer的概念:每个surface又对应一个layer,SurfaceFlinger负责将各个layer的frontbuffer合成(comp
5、osite)绘制到屏幕上。ALayerissomethingthatcanbecompositedbySurfaceFlinger(shouldhavebeencalledLayerFlinger).ThereareseveraltypesofLayersifyoulookinthecode,inparticulartheregularones(Layer,cpp),theyarebackedbyaSurface,andtheLayerBuffer(verybadlychosenname)whichdon'thaveabackings
6、tore,butreceiveonefromtheirclient..NotethattheGGLSurfacetype,shouldhavebeencalledGGLBufferMultiplelayersarejustcompositedtothefinalbufferintheirZorder.有几个对象与Surface概念紧密和关:1.JavaSurface(framcworks/base/corc/java/android/vicw/Surfacc.java)。该对•象被应用间接调用(通过SurfaceView,ViewRo
7、ot等),应用需要创建surface,(并同时创建canvas),将图形绘制到这个対象上并最终投递到屏幕上。2.C++Surface(frameworks/base/1ibs/ui/Surface.cppo这个对象被JavaSurface通过Jni调用,实现JavaSurface的功能3.ISurfacc(以及其派生类BnSurfacc)<>这个对象是应用和server间的接CihSurface创建这个ISurface(BnSurface)并发送命令,如更新surface内容到屏幕上。Server端接受这个命令并执行相应操作。研究一个
8、surface如何创建的关键路径如下:1.framcworks/basc/corc/java/android/vicw/Surfacc.javaSurface::Surface()2.frameworks/base/co