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;    }


更多相关文章

  1. Android中杀进程的几种方法 (1) - killBackgroundProcesses
  2. Android客户端和服务器端数据交互的第四种方法
  3. Android选项卡的几种实现方法
  4. MTK 添加宏控方法
  5. Android AsyncTask onProgressUpdate 方法的些许研究
  6. Android Studio中genymotion安装方法
  7. Android使用HttpClient方法和易错问题
  8. Android开机自启动程序设置及控制方法思路浅谈
  9. android获取当前运行Activity名字的方法

随机推荐

  1. Android 教程 Android中UI设计的一些技巧
  2. Android 中自定义属性(attr.xml,TypedArr
  3. Android Studio gradle配置详解
  4. 自动 Android* 应用测试
  5. Android(安卓)图片转换为 Base64 编码
  6. js判断用户手机是IOS还是安卓
  7. 用adb抓取log
  8. 在android中创建圆角的文本框的实现
  9. 修正android cocos2dx项目当点击属性时提
  10. 我的Android 4 学习系列之创建应用程序和