Android浮动窗口的实现


最近做项目的时候,要实现一个浮动窗口的效果,而浮动窗口的使用主要是一个WindowManager。先上效果图:

 

下面介绍下它的用法

 

 

1、WindowManager介绍

  全 部Android的窗口机制是基于一个叫做WindowManager实现,这个接口可以添加view到屏幕,也可以从屏幕删除view。它面向的对象一 端是屏幕,另一端就是View,直接忽视我们以前的Activity或者Dialog之类的元素。其实我们的Activity或者Diolog底层的实现 也是经过WindowManager,WindowManager是全局的,整个系统只有一个WindowManager。它是显示View的最底层了。WindowManager主要用来管理窗口的一些状态、属性、view增加、删除、更新、窗口顺序、消息收集和处理等。通过Context.getSystemService(Context.WINDOW_SERVICE)的方式可以获得WindowManager的实例.WindowManager继承自ViewManager,里面涉及到窗口管理的三个重要方法,分别是

  • addView(); 
  • updateViewLayout();
  • removeView();

  在WindowManager中还有一个重要的静态类LayoutParams。通过它可以设置和获得当前窗口的一些属性。我 们先来看看addView()方法,在addView中,会利用LayoutParams获得window的View属性,并为每个window创 ViewRoot,ViewRoot是View和WindowManager之间的桥梁,真正把View传递给WindowManager的是通过 ViewRoot的setView()方法,ViewRoot实现了View和WindowManager之间的消息传递。在将主窗口添加到 WindowManger时,它首先会建立一个代理对象:

wm=(WindowManagerImpl)context.getSystemService(Context.WINDOW_SERVICE)

并且打开会话(IWindowSession),之后Window将通过该会话与WindowManager建立联系。

2、使用WindowManager实现浮动窗口的创建

         

/**

    * 创建悬浮窗

    */

   private void createFloatView()

   {

  

      //加载xml布局

      myLayout=View.inflate(this, R.layout.window, null);

      btn_floatView=(Button) myLayout.findViewById(R.id.btn_win_call);

      btn_floatView2=(Button) myLayout.findViewById(R.id.btn_call_shouchang);

      btn_floatView3=(Button) myLayout.findViewById(R.id.btn_call_what);

     

      btn_floatView.setOnClickListener(new OnClickListener() {

        

         public void onClick(View v) {

            Toast.makeText(Floating_windowActivity.this, "你点击了拨打电话", Toast.LENGTH_SHORT).show();

            System.out.println("你点击了拨打电话");

           

         }

      });

      btn_floatView2.setOnClickListener(new OnClickListener() {

        

         public void onClick(View v) {

            Toast.makeText(Floating_windowActivity.this, "你点击了收藏", Toast.LENGTH_SHORT).show();

            System.out.println("你点击了收藏");

           

         }

      });

      btn_floatView3.setOnClickListener(new OnClickListener() {

        

         public void onClick(View v) {

            Toast.makeText(Floating_windowActivity.this, "你点击了什么", Toast.LENGTH_SHORT).show();

            System.out.println("你点击了什么");

           

         }

      });

     

     

 

      wm = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE);

      params = new WindowManager.LayoutParams();

 

      // 设置window type

      /*

       * 如果设置为params.type = WindowManager.LayoutParams.TYPE_PHONE; 那么优先级会降低一些,

       * 即拉下通知栏不可见

       */

      params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;

 

      params.format = PixelFormat.RGBX_8888; // 设置图片格式,效果为背景透明(RGBA_8888)

 

      // 设置Window flag

      /*

       * 下面的flags属性的效果形同“锁定”。 悬浮窗不可触摸,不接受任何事件,同时不影响后面的事件响应。

       * wmParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL |

       * LayoutParams.FLAG_NOT_FOCUSABLE | LayoutParams.FLAG_NOT_TOUCHABLE;

       */

      params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;

 

      // 设置悬浮窗的长得宽

      params.width = LayoutParams.WRAP_CONTENT;

      params.height = LayoutParams.WRAP_CONTENT;

      //设置悬浮窗的位置

      params.x=500;

 

      wm.addView(myLayout, params);

   }

 

 

我们可以看出悬浮窗的添加,使用的是addView()的方法,将一个view添加到WindowManager里面去,同时如果我们需要删除这个悬浮窗,那么就只需要调用removeView()的方法即可。

 

 

3、浮动窗口的xml文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:orientation="vertical" >

 

 

            <Button

                android:id="@+id/btn_win_call"

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:text="拨打电话" />

 

            <Button

                android:id="@+id/btn_call_shouchang"

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:text="点击收藏" />

            <Button

                android:id="@+id/btn_call_what"

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:text="还有什么" />

 

 

</LinearLayout>

 

 

 

4、注意事项

一定要在AndroidManifest.xml添加

 

    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

 

 

原创博文,转载请标明出处:http://www.cnblogs.com/jarvis2014/p/3670958.html

 

附上Demo源代码地址: 点击下载Demo


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM