Window WindowManager WindowManagerImpl ViewManager

Button floatingButton=new Button(this);
floatingButton.setText("我是一个滚动Button");

WindowManager.LayoutParams layoutParams=new WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT,
        WindowManager.LayoutParams.WRAP_CONTENT,0,0, PixelFormat.TRANSLUCENT);
// flag 设置 Window 属性
layoutParams.flags= WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
// type 设置 Window 类别(层级)
layoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY;
layoutParams.gravity = Gravity.CENTER;
WindowManager windowManager = getWindowManager();
windowManager.addView(floatingButton, layoutParams);


Window就是一个窗体,具体实现类是PhoneWindow

WindowManager真正实现控制view添加删除更新。详见WindowManager相关属性 layoutParams

        设置Window相关属性 以及view的相关属性


Window的创建是通过WindowManager实现  WindowManager是外界访问Window的窗口。

Window的具体实现是在WindowManagerService中。

WindowManager和WindowManagerService的交互是一个IPC过程。

Android的视图都是通过Window展示的


每一个Window斗对应一个View和一个ViewRootImpl, Window和View通过ViewRootImpl来建立联系。

WindowManager  是一个接口

实现类WindowManagerImpl

在Window中创建WindowManager

public void setWindowManager(WindowManager wm, IBinder appToken, String appName,
        boolean hardwareAccelerated) {
    mAppToken = appToken;
    mAppName = appName;
    mHardwareAccelerated = hardwareAccelerated
            || SystemProperties.getBoolean(PROPERTY_HARDWARE_UI, false);
    if (wm == null) {
        wm = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);
    }
    mWindowManager = ((WindowManagerImpl)wm).createLocalWindowManager(this);
}
mWindowManager = ((WindowManagerImpl)wm).createLocalWindowManager(this);

这行代码实现创建WindowManagerImpl对象

WindowManagerImpl中的实现方法:

public WindowManagerImpl createLocalWindowManager(Window parentWindow) {
    return new WindowManagerImpl(mContext, parentWindow);
}


其实还要到

private final WindowManagerGlobal mGlobal = WindowManagerGlobal.getInstance();
@Override
public void addView(@NonNull View view, @NonNull ViewGroup.LayoutParams params) {
    applyDefaultToken(params);
    mGlobal.addView(view, params, mContext.getDisplay(), mParentWindow);
}

@Override
public void updateViewLayout(@NonNull View view, @NonNull ViewGroup.LayoutParams params) {
    applyDefaultToken(params);
    mGlobal.updateViewLayout(view, params);
}


WindowManagerGlobal 

测试真正实现了updateview  addView  RemoveView的方法。

WindowManagerImpl这种模式属于桥接模式   将操作全部交给WindowManagerGlobal实现。


具体实现:

创建ViewRootImpl  具体看WindowManagerGlobal中的代码实现。



















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值