注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

民主与科学

独立之人格,自由之思想

 
 
 

日志

 
 

用WindowManager直接显示View  

2011-08-08 10:08:51|  分类: 问题小汇 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

我们Android平台是一个又一个的Activity组成的,每一个Activity有一个或者多个View构成。所以说,当我们想显示一个界面的时候,我们首先想到的是建立一个Activity,然后所有的操作在Activity里面实现,或者是一个Dialog或者Toast。这种方式固然简单,但是在有些情况下,我们要求的只是简单的显示,用Activity显然是多余,这个时候,我们如何处理呢?
原来,整个Android的窗口机制是基于一个叫做WindowManager,这个接口可以添加view到屏幕,也可以从屏幕删除view。它面向的对象一端是屏幕,另一端就是View,直接忽略我们以前的Activity或者Dialog之类的东东。其实我们的Activity或者Diolog底层的实现也是通过WindowManager,这个WindowManager是全局的,整个系统就是这个唯一的东东。它是显示View的最底层了。
写一个简单的代码:
示例1
    WindowManager wm=null;
    View rootView;
    public void showWindow()
    {
    if(wm==null)
    wm = (WindowManager)getSystemService(Context.WINDOW_SERVICE);  
    if(rootView==null)
    {
     Button btn = new Button(this);  
     btn.setText("window manager test!"); 
          OnClickListener listener = new OnClickListener() {
              public void onClick(View v) {
              Toast.makeText(MainActivity.this, "How are you? No is:"+System.currentTimeMillis()%100, 2000).show();
              }
             };
             btn.setOnClickListener(listener);
     rootView=btn;
    }
     WindowManager.LayoutParams params = new WindowManager.LayoutParams();  
    params.width=400;
    params.height=100;
    /*@1params.flags |=(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
|WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);  */ 
    //@2params.flags|=WindowManager.LayoutParams.FLAG_SPLIT_TOUCH;
    wm.addView(rootView, params);  
    }
    public void romoveWindow()
    {
    if(rootView!=null)
    wm.removeView(rootView);
    }
我们这个button的显示和当前的运行环境基本上是无关的,当前是什么activity或者是桌面,使用WindowManager可以给你的编程带来很大的灵活性,但是要注意,显示出来就要销毁掉,这个是必须的,销毁其实就是一个remove。
注意默认的话,view显示在最上层,但是后面的view无法获得焦点,当你touch的坐标超出你的view的范围时,它还是把touch事件发送到它。在Android SDK3.0之前的话,没有很好的处理方式。只有采用@1处的代码,让你的view不能获得焦点,不能处理触摸屏事件,不能接收按键事件及其他按钮事件,这样它后面的view才能获得焦点,才能接收触摸屏事件,按键事件及其他按钮事件。在Android SDK3.0之后,才支持slipt touch的处理。这时你可以采用@2处的代码。

关于WindowManager.LayoutParams的更多内容请参考《WindowManager.LayoutParams
  评论这张
 
阅读(1125)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017