Android 页面显示体系简述(Canvas,Surface,ViewRootImpl,WMS)

注:此文章的源码与理解基于 Android SDK 30

在Activity中显示画面:

DecorView:

它是显示体系的根View,我们的xml文件写的布局与DecorView形成了一个ViewTree结构。在执行DecorView.onDraw()时,就会一层一层往下绘制,从而绘制形成完成的页面。

ViewRootImpl:

它是View与WMS通信的桥梁,一个DecorView对应一个ViewRootImpl,DecorView在执行onDraw所需要的canvas(画布)就是它来提供的。

public final class ViewRootImpl implements ViewParent,
        View.AttachInfo.Callbacks, ThreadedRenderer.DrawCallbacks {
    // .....

    private boolean drawSoftware(Surface surface, AttachInfo attachInfo, int xoff, int yoff,
            boolean scalingRequired, Rect dirty, Rect surfaceInsets) {
        // ....
        final Canvas canvas;

        canvas = mSurface.lockCanvas(dirty);

        mView.draw(canvas); // mView 就是 DecorView
        // ....
    }

    private int relayoutWindow(WindowManager.LayoutParams params, int viewVisibility,
            boolean insetsPending) throws RemoteException {
        // ....

        // mWindowSession.relayout 通过ADIL与WMS通信
        int relayoutResult = mWindowSession.relayout(mWindow, mSeq, params,
                (int) (mView.getMeasuredWidth() * appScale + 0.5f),
                (int) (mView.getMeasuredHeight() * appScale + 0.5f), viewVisibility,
                insetsPending ? WindowManagerGlobal.RELAYOUT_INSETS_PENDING : 0, frameNumber,
                mTmpFrame, mPendingOverscanInsets, mPendingContentInsets, mPendingVisibleInsets,
                mPendingStableInsets, mPendingOutsets, mPendingBackDropFrame, mPendingDisplayCutout,
                mPendingMergedConfiguration, mSurfaceControl, mTempInsets);
        if (mSurfaceControl.isValid()) {
            mSurface.copyFrom(mSurfaceControl);
        } else {
            destroySurface();
        }

        // ....
    }

    // ....
}

WindowManagerService:

WindowManagerService是Android系统中的一个核心服务,负责管理系统中所有的窗口。它主要负责以下几项任务:

  • 布局管理:管理系统中所有窗口的大小和位置,以及它们在屏幕上的显示顺序。

  • 输入事件处理:处理来自设备的输入事件,如触摸事件,按键事件等。

  • 渲染窗口:通过SurfaceFlinger服务与硬件绘图引擎进行交互,以在屏幕上渲染窗口。

  • 管理窗口状态:管理窗口的状态,如是否可见,是否激活等。

通过WindowManagerService,应用可以请求创建和管理自己的窗口,并与系统的其他组件进行交互,以提供一个完整的用户界面体验。

SurfaceFlinger:

SurfaceFlinger 是 Android 操作系统中一个系统组件,负责合成最终显示在屏幕上的图像。它是图形管道的最后一步,将多个应用程序的输出结合成单个图像,显示在屏幕上。

SurfaceFlinger 作为显示子系统和设备上运行的应用程序之间的中间人。当应用程序想要在屏幕上显示内容时,它会创建一个“表面”,并将其传递给 SurfaceFlinger。SurfaceFlinger 负责将这些表面组合成最终的图像,并将其发送到显示系统以显示在屏幕上。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值