码迷,mamicode.com
首页 > Windows程序 > 详细

理解Window和WindowManger

时间:2016-05-02 16:49:55      阅读:219      评论:0      收藏:0      [点我收藏+]

标签:

一、Window简介

作用:桌面上显示一个类似悬浮的东西。

介绍:Window是一个抽象类,实现是由PhoneWindow。WindowManager是外界访问Window的入口。但是最终实现是在WindowService中。WindowManger和WindowService是IPC交互。Andorid所有的视图都是由Window实现的,所以Window是View的直接管理者。(从第四章也知道)

二、Window和WindowManager

(一)、如何添加一个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);
View Code

两个重要的设置参数: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)

WindowManger方法及Window的拖动效果

主要方法(继承了ViewManger):

技术分享
public interface ViewManager{
  //添加View
  public void addView();
  //升级View的Layout
  public void updateViewLayout();
  //移除View
  public void removeVIew();
}
//详细参数将P296
View Code

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;  
  }
}    
View Code

Window的内部机制

window的定义:window是一个抽象概念,每个Window都对应着一个View和ViewRootImpl。Window与View通过ViewRootImpl建立联系。WindowManager的所有方法都是针对View的,所以View才是Window的实现。

分析Window的增、删、改

从addView开始:WindowManger只是一个接口,WindowMangerIml才是接口的实现类,根据内部方法,交给WindowMangerGlobal类来处理。

WindowManagerGlobal  :首先检查参数是否合法

之后创建ViewRootImpl并将分别放入两个ArrayList中(详见P299 2)。

通过ViewRootIml的setView()方法调用内部requestLayout()调用scheduleTraversals()然后利用mWindowSession(是Binder对象).appToDisplay(所以整个实现通过了一层IPC),真正实现类是Session类。在Session类中,通过WindowMangerService实现Window添加。

Window的删除过程:

理解Window和WindowManger

标签:

原文地址:http://www.cnblogs.com/rookiechen/p/5452472.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!