`
luochuang
  • 浏览: 24058 次
  • 性别: Icon_minigender_1
  • 来自: 成都
最近访客 更多访客>>
社区版块
存档分类
最新评论

windowWindow的操作

 
阅读更多

WindowManager对Window进行管理,包括了window添加、更新和删除的操作,最终都是交由WMS来进行处理的。窗口的操作分为两大部分,一部分是WindowManager处理部分,另一部分是WMS 处理部分。Window分为三大类,分别是应用程序窗口、子窗口、系统窗口,对于不同类型的窗口添加过程会有所不同,但是WMS对于这三大类的窗口基本是“一 视同仁”的。

1、系统窗口statusbar的添加过程
    ① 添加入口Statusbar::addStatusBarWindow

 

    private void addStatusBarWindow() {
        makeStatusBarView();
        mStatusBarWindowManager = Dependency.get(StatusBarWindowManager.class);
        ...
        mStatusBarWindowManager.add(mStatusBarWindow, getStatusBarHeight());
    }

   ②:StatusBarWindowManager::add

 

 

    /**
     * Adds the status bar view to the window manager.
     *
     * @param statusBarView The view to add.
     * @param barHeight The height of the status bar in collapsed state.
     */
    public void add(View statusBarView, int barHeight) {

        // Now that the status bar window encompasses the sliding panel and its
        // translucent backdrop, the entire thing is made TRANSLUCENT and is
        // hardware-accelerated.
        mLp = new WindowManager.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                barHeight,
                //设置了 TYPE_STATUS_BAR,表示StatusBar视图的窗口类型是状态栏。
                WindowManager.LayoutParams.TYPE_STATUS_BAR,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                        | WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING
                        | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH
                        | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
                        | WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS,
                PixelFormat.TRANSLUCENT);
        mLp.token = new Binder();
        mLp.gravity = Gravity.TOP;
        mLp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
        mLp.setTitle("StatusBar");
        mLp.packageName = mContext.getPackageName();
        mLp.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
        mStatusBarView = statusBarView;
        mBarHeight = barHeight;
        //处调用了WindowManager的addView方法,addView方法定义在WindowManager的父类接口ViewManager中,而addView方法则是在WindowManagerImpl中实现的 
        mWindowManager.addView(mStatusBarView, mLp);
        mLpChanged = new WindowManager.LayoutParams();
        mLpChanged.copyFrom(mLp);
    }

 ③:WindowManagerGlobal::addView

 

public void addView(View view, ViewGroup.LayoutParams params,
            Display display, Window parentWindow) {
        //首先会对参数view、params和display进行检查 省略
        final WindowManager.LayoutParams wparams = (WindowManager.LayoutParams) params;
        //如果当前窗口要作为子窗口,就会根据父窗口对子窗口的WindowManager.LayoutParams 类型的 wparams 对象进行相应调整。
        if (parentWindow != null) {
            parentWindow.adjustLayoutParamsForSubWindow(wparams);
        } else {
            // If there's no parent, then hardware acceleration for this view is
            // set from the application's hardware acceleration setting.
            final Context context = view.getContext();
            if (context != null
                    && (context.getApplicationInfo().flags
                            & ApplicationInfo.FLAG_HARDWARE_ACCELERATED) != 0) {
                wparams.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;
            }
        }

        ViewRootImpl root;
        View panelParentView = null;

        synchronized (mLock) {
            .......
            // If this is a panel window, then find the window it is being
            // attached to for future reference.
            if (wparams.type >= WindowManager.LayoutParams.FIRST_SUB_WINDOW &&
                    wparams.type <= WindowManager.LayoutParams.LAST_SUB_WINDOW) {
                final int count = mViews.size();
                for (int i = 0; i < count; i++) {
                    if (mRoots.get(i).mWindow.asBinder() == wparams.token) {
                        panelParentView = mViews.get(i);
                    }
                }
            }
            //创建了ViewRootImp并赋值给root
            root = new ViewRootImpl(view.getContext(), display);
            view.setLayoutParams(wparams);
            mViews.add(view);
            mRoots.add(root);
            mParams.add(wparams);

            // do this last because it fires off messages to start doing things
            try {
                //将窗口和窗口的参数通过setView方法设置到ViewRootImpl中,可见添加窗口这一操作是通过ViewRootImpl来进行的。
                root.setView(view, wparams, panelParentView);
            } catch (RuntimeException e) {
            }
        }
    }

 

 

 

ViewRootImpl 身负了很多职责,主要有以下几点:

· View树的根并管理View树。

· 触发View的测量、布局和绘制。

· 输入事件的中转站。

· 管理Surface。 · 负责与WMS进行进程间通信。

 

ViewRootImpl::setView

public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView) {
        synchronized (this) {
            if (mView == null) {
                mView = view;
         .........
                // Schedule the first layout -before- adding to the window
                // manager, to make sure we do the relayout before receiving
                // any other events from the system.
                requestLayout();
         .......
                if ((mWindowAttributes.inputFeatures
                        & WindowManager.LayoutParams.INPUT_FEATURE_NO_INPUT_CHANNEL) == 0) {
                    mInputChannel = new InputChannel();
                }
                
        }
    }

scheduleTraversals实际是View绘制的入口

public void requestLayout() {
        if (!mHandlingLayoutInLayoutRequest) {
                checkThread();
                mLayoutRequested = true;
                scheduleTraversals();
        }
    }

 

 

 
分享到:
评论

相关推荐

    window操作快捷键

    window操作快捷键,window操作快捷键大全,各类快捷键,包括资源管理器,多窗口视图,快捷键整合

    JavaScript bom操作 window-event 示例代码

    JavaScript bom操作 window_event 示例代码JavaScript bom操作 window_event 示例代码JavaScript bom操作 window_event 示例代码JavaScript bom操作 window_event 示例代码JavaScript bom操作 window_event 示例代码...

    JavaScript bom操作 window对象的方法 示例代码

    JavaScript bom操作 window对象的方法 示例代码JavaScript bom操作 window对象的方法 示例代码JavaScript bom操作 window对象的方法 示例代码JavaScript bom操作 window对象的方法 示例代码JavaScript bom操作 ...

    JavaScript BOM操作 window对象的子级对象 示例代码

    JavaScript BOM操作 window对象的子级对象 示例代码JavaScript BOM操作 window对象的子级对象 示例代码JavaScript BOM操作 window对象的子级对象 示例代码JavaScript BOM操作 window对象的子级对象 示例代码...

    window7 64位操作系统镜像文件

    window7 64位操作系统镜像文件

    Window2000 操作系统简介

    《Window2000操作系统详解》 Window2000是一款由微软公司推出的经典操作系统,其设计理念在于提供高效稳定的计算环境,尤其适用于企业级应用。本文将深入介绍Window2000的基本操作、核心概念以及桌面组成,帮助用户...

    加快window的操作

    加快window的操作,内容横多。

    CloseWindow 1.00_C#窗口操作_

    "CloseWindow 1.00"显然是一款用C#编写的工具,主要用于处理和操作Windows系统中的窗口。这款工具提供了获取、打开、关闭窗口以及执行其他相关操作的功能。下面将详细介绍这个主题中的相关知识点。 1. **C#基础**:...

    windowForm 对Excel操作,将原来的列变成行并保存

    windowForm 对Excel操作,将原来的列变成行并保存windowForm 对Excel操作,将原来的列变成行并保存windowForm 对Excel操作,将原来的列变成行并保存windowForm 对Excel操作,将原来的列变成行并保存windowForm 对...

    WindowXP基础操作.rar

    Window XP是微软公司推出的一款经典操作系统,以其稳定性和易用性深受用户喜爱,尤其适合初学者上手。这个“Window XP基础操作.rar”压缩包包含了多个PPT文件,旨在教授初学者如何进行基本的系统操作。以下是根据...

    window.open最大化操作

    Window.open最大化操作 在Web开发中,我们经常需要弹出新的浏览器窗口,而在某些情况下,我们需要将这个窗口最大化以便于用户体验。那么,如何使用JavaScript的window.open方法来实现窗口的最大化呢? 首先,让...

    window7和windowXP双操作系统安装教程.doc

    Window7 和 WindowXP 双操作系统安装教程知识点 本文主要介绍了 Window7 和 WindowXP 双操作系统安装教程,旨在帮助用户快速安装和配置双操作系统。下面是从给定的文件信息中生成的相关知识点: 1. Window7 和 ...

    Excel窗口_Window对象_基本操作应用示例.pdf

    Excel窗口_Window对象_基本操作应用示例.pdf

    window unix file.rar_file操作_unix file_功能操作说明_文件操作

    本文将深入探讨文件操作的相关知识点,特别是针对“window unix file.rar”压缩包中的“file操作”、“unix_file”和“功能操作说明”。 首先,让我们从基本概念开始。文件在计算机中是数据的容器,可以包含文本、...

    最早的window操作系统window1.0

    虽然是Windows的前身,“界面管理器”中却没有一个“Window”,而是纯粹用字符堆砌起来的。尽管简陋之极,但是微软想让计算机“更易用”的理念已现雏形。  由于年代过于久远,“界面管理器”的屏幕截图已经很少,...

    window-常用操作及linux下常用指令讲解

    Window操作系统和Linux操作系统是两种最常用的操作系统,它们之间有很多不同,但也有一些相似之处。本文将详细讲解Window操作系统和Linux操作系统下的常用操作和指令。 文件夹管理是计算机操作系统中最基本的操作...

    window 2003操作系统安全设置与Linux安全配置步骤大全

    window 2003操作系统安全设置与Linux安全配置步骤大全

    linux与window平台移植

    Linux与Window平台移植是指在不同的操作系统平台之间实现移植的技术,包括从硬件抽象层到操作系统环境的建立,以及任务调度、时钟管理、串口驱动和命令行 Shell 的实现。本文将对 Linux 与 Window 平台移植的技术...

    [修订]中文 WindowXP操作系统图文基础教程.pdf

    文 WindowXP操作系统图文基础教程

Global site tag (gtag.js) - Google Analytics