ViewRootImpl 在哪里拿到的 surface 代码分析
时间: 2024-01-21 12:03:08 浏览: 29
ViewRootImpl在初始化时通过WindowManagerService获取到了该窗口的Surface对象,可以通过查看ViewRootImpl类的源代码来了解具体实现。
在ViewRootImpl类的构造方法中,会获取到WindowManagerService对象,并调用其addView方法将当前视图根节点添加到窗口管理器中。在addView方法中,会创建一个ViewRootImpl对象,并通过WindowManagerService的addWindow方法将该窗口添加到系统中。在addWindow方法中,会调用WindowManagerGlobal的addToWindowManager方法将该窗口添加到WindowManagerService中。
在addToWindowManager方法中,会创建一个新的WindowManager.LayoutParams对象,并设置相关的参数。然后,会调用WindowManagerService的addWindow方法将该窗口添加到系统中,并返回一个Surface对象。在addWindow方法中,会将该Surface对象与该窗口相关联,并将该Surface对象返回给ViewRootImpl。ViewRootImpl在接收到该Surface对象后,会将其保存到自己的变量中,并在后续渲染View树时将其作为渲染目标。
具体来说,可以在ViewRootImpl类的源代码中查看以下方法:
```
//ViewRootImpl构造方法
public ViewRootImpl(Context context, Display display) {
//获取WindowManagerService对象
mWindowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
//创建ViewRootImpl对象并添加到窗口管理器中
mWindowSession = WindowManagerGlobal.getWindowSession();
mDisplay = display;
mAttachInfo.mDisplay = display;
mSurface = new Surface();
try {
//调用WindowManagerService的addView方法将该窗口添加到系统中
mWindowSession.addToDisplay(mWindow, mSeq, mWindowAttributes,
getHostVisibility(), mDisplay.getDisplayId(), mTmpFrame, mAttachInfo.mContentInsets,
mAttachInfo.mStableInsets, mAttachInfo.mOutsets, mInputChannel);
//获取与该窗口相关联的Surface对象
mSurface.copyFrom(mWindowSession.mSurface);
} catch (RemoteException e) {
Log.e(TAG, "Could not add view to window manager", e);
}
//...
}
//WindowManagerService的addView方法
@Override
public void addView(View view, ViewGroup.LayoutParams params, Display display,
Window parentWindow, int parentWindowSeq) {
//...
//创建一个新的WindowManager.LayoutParams对象,并设置相关的参数
final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(
WindowManager.LayoutParams.TYPE_APPLICATION,
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
| WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR
| WindowManager.LayoutParams.FLAG_LAYOUT_IN_OVERSCAN
| WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_SPLIT_TOUCH
| WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
PixelFormat.OPAQUE);
//...
//调用WindowManagerService的addWindow方法将该窗口添加到系统中,并返回Surface对象
final SurfaceControl surfaceControl = mTransaction.apply();
final Surface surface = new Surface();
surface.copyFrom(surfaceControl);
window.setSurfaceControl(surfaceControl);
//...
}
```
需要注意的是,以上代码只是ViewRootImpl获取Surface的一个简化示例,实际上ViewRootImpl获取Surface的过程比较复杂,涉及到多个类和方法的调用,需要深入了解源代码才能掌握其详细实现。