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中的代码实现。