标签:
作用:桌面上显示一个类似悬浮的东西。
介绍:Window是一个抽象类,实现是由PhoneWindow。WindowManager是外界访问Window的入口。但是最终实现是在WindowService中。WindowManger和WindowService是IPC交互。Andorid所有的视图都是由Window实现的,所以Window是View的直接管理者。(从第四章也知道)
(一)、如何添加一个Window到WindowManager
步骤:①、在java代码中创建一个View ②、创建View对应的LayoutParams属性 ③、结合View与Layout放入WindowManager.addView()中。
//创建View TextView float = new TextView(context); float.settext("this is a float window "); //创建LayoutParams WindowManager.LayoutParams params = new LayoutParams(); //配置LayoutParams params.width = width; params.height = height; params.format = PixelFormat.TRANSLUCENT; params.type = WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG; params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;//后面窗口仍然可以处理点设备事件 params.setTitle("Toast"); params.gravity = gravity; params.windowAnimations = styleAnimations; //获取WindowManager WindowManager windowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE); //将Window添加到WindowManager windowManager.addView(view, this.mLayoutParams);
两个重要的设置参数:flags和type
常见flags:
FLAG_NOT_FOCUSABLE:不需要获取焦点,不接受各种输入事件(同时启用FLAG_NOT_TOUCH_MODAL)。最终事件传给下层具有焦点的Window
FLAG_NOT_TOUCH_MADAL:系统将当前Window区域以外的单击事件传给下一层Window,当前Window区域内的单击事件则自己处理。
FLAG_SHOW_WHEN_LOCKED:让Window显示在锁屏界面上
常见Type(表示Window的类型):
应用类Window:对应着一个Activity
子Window:无法单独存在,需要附属在特定的父Window上(比如:Dialog就是子Window)。
系统Window:需要声明权限在创建(Toast,系统状态栏都是)
Window的分层概念:应用Window1~99层,子Window1000~1999层,系统Window2000~2999(同时系统层级有许多值,一般采用TYPE_SYSTEM_OVERLAY,并声明权限P296)
主要方法(继承了ViewManger):
public interface ViewManager{ //添加View public void addView(); //升级View的Layout public void updateViewLayout(); //移除View public void removeVIew(); } //详细参数将P296
Window的拖动效果
public void onTouch(View v,MontionEvent event){ //获取当前绝对位置 int rawX= (int)event.getRawX(); int rawY = (int)event.getRawY(); //当移动的时候,将位置给Layout,然后从新载入layotu switch(event.geAction){ case MotionEvent.ACTION_MOVE: mLayoutParams.x = rawX; mLayoutParans.y = rawY; mWindowManger.updateViewLayout(view,mLayoutParams); break; } }
window的定义:window是一个抽象概念,每个Window都对应着一个View和ViewRootImpl。Window与View通过ViewRootImpl建立联系。WindowManager的所有方法都是针对View的,所以View才是Window的实现。
从addView开始:WindowManger只是一个接口,WindowMangerIml才是接口的实现类,根据内部方法,交给WindowMangerGlobal类来处理。
WindowManagerGlobal :首先检查参数是否合法
之后创建ViewRootImpl并将分别放入两个ArrayList中(详见P299 2)。
通过ViewRootIml的setView()方法调用内部requestLayout()调用scheduleTraversals()然后利用mWindowSession(是Binder对象).appToDisplay(所以整个实现通过了一层IPC),真正实现类是Session类。在Session类中,通过WindowMangerService实现Window添加。
标签:
原文地址:http://www.cnblogs.com/rookiechen/p/5452472.html