分析windowManager中添加一个悬浮框的方式

1
2
3
4
5
6
7
8
9
10
11
12
13
WindowManager.LayoutParams  params  new  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)context.getSystemService(Context.WINDOW_SERVICE);
TextView  float  new  TextView(context);
float .settext( "this is a float window " );
windowManager.addView(view,  this .mLayoutParams)

关于param参数的详解:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
type 的取值: 
       应用程序窗口。
       public  static  final  int  FIRST_APPLICATION_WINDOW = 1;    
 
       所有程序窗口的“基地”窗口,其他应用程序窗口都显示在它上面。     
       public  static  final  int  TYPE_BASE_APPLICATION   =1;
        
       普通应用功能程序窗口。token必须设置为Activity的token,以指出该窗口属谁。
       public  static  final  int  TYPE_APPLICATION       = 2;
 
        用于应用程序启动时所显示的窗口。应用本身不要使用这种类型。
       它用于让系统显示些信息,直到应用程序可以开启自己的窗口。   
       public  static  final  int  TYPE_APPLICATION_STARTING = 3; 
      
       应用程序窗口结束。
       public  static  final  int  LAST_APPLICATION_WINDOW = 99;
 
       子窗口。子窗口的Z序和坐标空间都依赖于他们的宿主窗口。
       public  static  final  int  FIRST_SUB_WINDOW       = 1000;
 
       面板窗口,显示于宿主窗口上层。
       public  static  final  int  TYPE_APPLICATION_PANEL  = FIRST_SUB_WINDOW;
 
       媒体窗口,例如视频。显示于宿主窗口下层。
       public  static  final  int  TYPE_APPLICATION_MEDIA  = FIRST_SUB_WINDOW+1;
 
       应用程序窗口的子面板。显示于所有面板窗口的上层。(GUI的一般规律,越“子”越靠上)
       public  static  final  int  TYPE_APPLICATION_SUB_PANEL = FIRST_SUB_WINDOW +2;
 
       对话框。类似于面板窗口,绘制类似于顶层窗口,而不是宿主的子窗口。
       public  static  final  int  TYPE_APPLICATION_ATTACHED_DIALOG = FIRST_SUB_WINDOW +3;
 
       媒体信息。显示在媒体层和程序窗口之间,需要实现透明(半透明)效果。(例如显示字幕)
       public  static  final  int  TYPE_APPLICATION_MEDIA_OVERLAY  = FIRST_SUB_WINDOW +4;
 
       子窗口结束。( End of types of sub-windows )
       public  static  final  int  LAST_SUB_WINDOW        = 1999;
 
       系统窗口。非应用程序创建。
       public  static  final  int  FIRST_SYSTEM_WINDOW    = 2000;
 
       状态栏。只能有一个状态栏;它位于屏幕顶端,其他窗口都位于它下方。
       public  static  final  int  TYPE_STATUS_BAR        =  FIRST_SYSTEM_WINDOW;
 
       搜索栏。只能有一个搜索栏;它位于屏幕上方。
       public  static  final  int  TYPE_SEARCH_BAR        = FIRST_SYSTEM_WINDOW+1;
 
       电话窗口。它用于电话交互(特别是呼入)。它置于所有应用程序之上,状态栏之下。
       public  static  final  int  TYPE_PHONE            = FIRST_SYSTEM_WINDOW+2;
 
       系统提示。它总是出现在应用程序窗口之上。
       public  static  final  int  TYPE_SYSTEM_ALERT      =  FIRST_SYSTEM_WINDOW +3;
 
       锁屏窗口。
       public  static  final  int  TYPE_KEYGUARD          = FIRST_SYSTEM_WINDOW +4;
 
       信息窗口。用于显示toast。
       public  static  final  int  TYPE_TOAST            = FIRST_SYSTEM_WINDOW +5;
 
       系统顶层窗口。显示在其他一切内容之上。此窗口不能获得输入焦点,否则影响锁屏。
       public  static  final  int  TYPE_SYSTEM_OVERLAY    =  FIRST_SYSTEM_WINDOW +6;
 
       电话优先,当锁屏时显示。此窗口不能获得输入焦点,否则影响锁屏。
       public  static  final  int  TYPE_PRIORITY_PHONE    =  FIRST_SYSTEM_WINDOW +7;
 
       系统对话框。(例如音量调节框)。
       public  static  final  int  TYPE_SYSTEM_DIALOG     =  FIRST_SYSTEM_WINDOW +8;
 
       锁屏时显示的对话框。
       public  static  final  int  TYPE_KEYGUARD_DIALOG   =  FIRST_SYSTEM_WINDOW +9;
 
       系统内部错误提示,显示于所有内容之上。
       public  static  final  int  TYPE_SYSTEM_ERROR      =  FIRST_SYSTEM_WINDOW +10;
 
       内部输入法窗口,显示于普通UI之上。应用程序可重新布局以免被此窗口覆盖。
       public  static  final  int  TYPE_INPUT_METHOD      =  FIRST_SYSTEM_WINDOW +11;
 
       内部输入法对话框,显示于当前输入法窗口之上。
       public  static  final  int  TYPE_INPUT_METHOD_DIALOG= FIRST_SYSTEM_WINDOW +12;
 
       墙纸窗口。
       public  static  final  int  TYPE_WALLPAPER         = FIRST_SYSTEM_WINDOW +13;
 
       状态栏的滑动面板。
       public  static  final  int  TYPE_STATUS_BAR_PANEL   = FIRST_SYSTEM_WINDOW +14;
 
       系统窗口结束。

      
public  static  final  int  LAST_SYSTEM_WINDOW     = 2999;

这里需要注意的地方是:

  对于需要依附于activity的选择2000以下的,独立于activity,使用2002

2.对于flag,这里详细的说明
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
int  FLAGS_CHANGED   
int  FLAG_ALLOW_LOCK_WHILE_SCREEN_ON Window flag:  as  long  as  this  window  is  visible to the user, allow the  lock  screen to activate  while  the screen  is  on .
int  FLAG_ALT_FOCUSABLE_IM   Window flag: invert the state of FLAG_NOT_FOCUSABLE with respect to how  this  window interacts with the current method.
int  FLAG_BLUR_BEHIND     This constant was deprecated  in  API level 14. Blurring  is  no longer supported.
int  FLAG_DIM_BEHIND Window flag: everything behind  this  window will be dimmed.
int  FLAG_DISMISS_KEYGUARD   Window flag: when  set  the window will cause the keyguard to be dismissed, only  if  it  is  not a secure  lock  keyguard.
int  FLAG_DITHER  This constant was deprecated  in  API level 17. This flag  is  no longer used.
int  FLAG_FORCE_NOT_FULLSCREEN   Window flag:  override  FLAG_FULLSCREEN and force the screen decorations (such  as  the status bar) to be shown.
int  FLAG_FULLSCREEN Window flag: hide all screen decorations (such  as  the status bar)  while  this  window  is  displayed.
int  FLAG_HARDWARE_ACCELERATED   
Indicates whether  this  window should be hardware accelerated.
int  FLAG_IGNORE_CHEEK_PRESSES   Window flag: intended  for  windows that will often be used when the user  is  holding the screen against their face, it will aggressively filter the  event  stream to prevent unintended presses  in  this  situation that may not be desired  for  a particular window, when such an  event  stream  is  detected, the application will receive a CANCEL motion  event  to indicate  this  so applications can handle  this  accordingly  by  taking no action  on  the  event  until the finger  is  released.
int  FLAG_KEEP_SCREEN_ON Window flag:  as  long  as  this  window  is  visible to the user, keep the device's screen turned  on  and bright.
int  FLAG_LAYOUT_INSET_DECOR Window flag: a special option only  for  use  in  combination with FLAG_LAYOUT_IN_SCREEN.
int  FLAG_LAYOUT_IN_OVERSCAN Window flag: allow window contents to extend  in  to the screen's overscan area,  if  there  is  one.
int  FLAG_LAYOUT_IN_SCREEN   Window flag: place the window within the entire screen, ignoring decorations around the border (such  as  the status bar).
int  FLAG_LAYOUT_NO_LIMITS   Window flag: allow window to extend outside of the screen.
int  FLAG_NOT_FOCUSABLE  Window flag:  this  window won't ever  get  key input focus, so the user can not send key or other button events to it.
int  FLAG_NOT_TOUCHABLE  Window flag:  this  window can never receive touch events.
int  FLAG_NOT_TOUCH_MODAL    Window flag: even when  this  window  is  focusable (its FLAG_NOT_FOCUSABLE  is  not  set ), allow any pointer events outside of the window to be sent to the windows behind it.
int  FLAG_SCALED Window flag: a special mode  where  the layout parameters are used to perform scaling of the surface when it  is  composited to the screen.
int  FLAG_SECURE Window flag: treat the content of the window  as  secure, preventing it  from  appearing  in  screenshots or  from  being viewed  on  non-secure displays.
int  FLAG_SHOW_WALLPAPER Window flag: ask that the system wallpaper be shown behind your window.
int  FLAG_SHOW_WHEN_LOCKED   Window flag: special flag to  let  windows be shown when the screen  is  locked.
int  FLAG_SPLIT_TOUCH    Window flag: when  set  the window will accept  for  touch events outside of its bounds to be sent to other windows that also support split touch.
int  FLAG_TOUCHABLE_WHEN_WAKING  Window flag: when  set if  the device  is  asleep when the touch screen  is  pressed, you will receive  this  first touch  event .
int  FLAG_TURN_SCREEN_ON Window flag: when  set  as  a window  is  being added or made visible, once the window has been shown then the system will poke the power manager's user activity ( as  if  the user had woken up the device) to turn the screen  on .
int  FLAG_WATCH_OUTSIDE_TOUCH    Window flag:  if  you have  set  FLAG_NOT_TOUCH_MODAL, you can  set  this  flag to receive a single special MotionEvent with the action MotionEvent.ACTION_OUTSIDE  for  touches that occur outside of your window.

  3.对于windowAnimation

很多人说为什么我设置了windowAnimation,但是没有动画效果呢?

这里一定要注意,这里需要使用style,在style中添加如下:

     

1
2
3
4
5
6
7
  

  然后将style的resourceId赋给params.windowAnimation,如果是将动画的resourceId赋值给params.windowAnimation,死也看得不到动画效果滴。

你可能感兴趣的:(Android小知识)