android Surface概述
16lz
2021-01-23
Surface的主要作用是存储View树的绘制数据,主要由屏幕组合器管理(screen compositor),每个Window都有一个Surface。
android中Surface分为两种:
一、Java层surface
二、Native层Surface
Java层产生Surface的主要有两个地方:ViewRoot和SurfaceView。
Native层主要由NativeWindow产生。
Surface是如何和View树搭上关系的呢?
不过相信大家对View中的draw()方法一定很熟悉!
boolean draw(Canvas canvas, ViewGroup parent, long drawingTime) { } protected void onDraw(Canvas canvas) { }
draw里面的Canvas都是由Framework传递来的参数,那么Canvas就是View树和Surface的连接点。
View树的测绘(measure)、布局(layout)和绘制(draw)都是由ViewRoot发起和管理的,View树绘制起点由ViewRoot的drawSoftware开始的!
drawSoftware的方法体大致如下:
private boolean drawSoftware(Surface surface, AttachInfo attachInfo, int xoff, int yoff, boolean scalingRequired, Rect dirty) { // Draw with software renderer. final Canvas canvas; canvas = mSurface.lockCanvas(dirty);//获取Canvas try { if (!canvas.isOpaque() || yoff != 0 || xoff != 0) { canvas.drawColor(0, PorterDuff.Mode.CLEAR); } dirty.setEmpty(); mIsAnimating = false; attachInfo.mDrawingTime = SystemClock.uptimeMillis(); mView.mPrivateFlags |= View.PFLAG_DRAWN; if (DEBUG_DRAW) { Context cxt = mView.getContext(); } try { canvas.translate(-xoff, -yoff); if (mTranslator != null) { mTranslator.translateCanvas(canvas); } canvas.setScreenDensity(scalingRequired ? mNoncompatDensity : 0); attachInfo.mSetIgnoreDirtyState = false; mView.draw(canvas);//绘制view树 drawAccessibilityFocusedDrawableIfNeeded(canvas); } finally { if (!attachInfo.mSetIgnoreDirtyState) { // Only clear the flag if it was not set during the mView.draw() call attachInfo.mIgnoreDirtyState = false; } } } finally { try { surface.unlockCanvasAndPost(canvas); } catch (IllegalArgumentException e) { Log.e(TAG, "Could not unlock surface", e); mLayoutRequested = true; // ask wm for a new surface next time. //noinspection ReturnInsideFinallyBlock return false; } } return true; }
更多相关文章
- Android中杀进程的几种方法 (1) - killBackgroundProcesses
- Android客户端和服务器端数据交互的第四种方法
- Android选项卡的几种实现方法
- MTK 添加宏控方法
- Android AsyncTask onProgressUpdate 方法的些许研究
- Android Studio中genymotion安装方法
- Android使用HttpClient方法和易错问题
- Android开机自启动程序设置及控制方法思路浅谈
- android获取当前运行Activity名字的方法