Android 悬浮窗

iPhone有个很好用的白色圆点,今天就来研究下Android中的悬浮框,这里主要是实现一个快捷键的功能,当然也可以在悬浮框中做想做的事!

悬浮窗的实现主要是通过WindowManager实现,当然WindowManager只是一个接口,想了解源码的同志们可以去看WindowManagerImpl,悬浮框主要是通过WindowManager中的addView,updateView,removeView实现

WindowManager.LayoutParams这个类用于提供悬浮窗所需的参数

WindowManager.LayoutParams参数说明:

  • type 用于确定悬浮窗的类型(window类型,window有三种类型,应用window,子window,系统window,其中悬浮窗中使用的是系统window),一般使用TYPE_PHONE,表示在所有应用程序之上,状态栏之下,当然这里还提供了很多类型,TYPE_STATUS_BAR(状态栏)TYPE_SEARCH_BAR(搜索框)TYPE_SYSTEM_ALERT(系统提示框,例如电量很低时提示)等等,有很多,根据需求去选择
  • flags 用于确定悬浮窗的行为,FLAG_NOT_FOCUSABLE(window不需要获得焦点,也不需要接收各种输入事件)FLAG_NOT_TOUCHABLE(不可点击)FLAG_NOT_TOUCH_MODAL(系统会通过当前window区域以外的单击事件传递给底层的window,当前window区域以内的单击事件则自己处理)FLAG_SHOW_WHEN_LOCKED(显示在锁屏的界面上)等等
  • gravity 用于确定悬浮窗的对齐方式
  • x 用于确定悬浮窗的横坐标
  • y 用于确定悬浮窗的纵坐标
  • width 值用于指定悬浮窗的宽度
  • height 值用于指定悬浮窗的高度

了解这些参数基本就能创建一个悬浮框了

private void createFloatView() {
        mWindowManager = (WindowManager) getApplication().getSystemService(getApplication().WINDOW_SERVICE);
        wmParams = new WindowManager.LayoutParams();
        wmParams.type = WindowManager.LayoutParams.TYPE_PHONE;
        wmParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
        wmParams.gravity = Gravity.LEFT | Gravity.TOP;
        wmParams.x = 100;
        wmParams.y = 100;

        wmParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
        wmParams.height = WindowManager.LayoutParams.WRAP_CONTENT;

        LayoutInflater inflater = LayoutInflater.from(getApplication());
        mFloatLayout = (LinearLayout) inflater.inflate(R.layout.layout_float_window, null);
        mWindowManager.addView(mFloatLayout, wmParams);
        mFloatView = (ImageView) mFloatLayout.findViewById(R.id.img_float_window);

        mFloatView.setOnTouchListener(new View.OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                wmParams.x = (int) event.getRawX() - mFloatView.getMeasuredWidth() / 2;
                wmParams.y = (int) event.getRawY() - mFloatView.getMeasuredHeight() / 2 - 25;
                mWindowManager.updateViewLayout(mFloatLayout, wmParams);
                return false;
            }
        });

        mFloatView.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent = new Intent(FloatWindowService.this, SearchActivity.class);
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                getApplication().startActivity(intent);
            }
        });
    }
if (mFloatLayout != null) {
            mWindowManager.removeView(mFloatLayout);
        }

以上就是悬浮框的过程,当然使用系统window必须要申请权限:

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

通过上面这个过程知道了如何通过WindowManager创建悬浮框

下面给你一个Demo,其中有两个悬浮窗,第一个悬浮窗就是普通的悬浮窗,第二个悬浮窗加了一些判断,可以直接在app中使用,这个悬浮窗在桌面和你自己的app中显示

地址:https://github.com/zimoguo/FloatWindow

时间: 2024-11-03 22:01:39

Android 悬浮窗的相关文章

Android 悬浮窗、悬浮球开发

原文:Android 悬浮窗.悬浮球开发 1.权限管理 直接看我另外一篇博客吧,传送门: https://my.oschina.net/u/1462828/blog/1933162 2.Base类BaseSuspend import android.content.Context; import android.graphics.PixelFormat; import android.os.Build; import android.view.Gravity; import android.vi

Android 悬浮窗权限校验

原文:Android 悬浮窗权限校验 悬浮窗权限: <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> 权限检验和请求: //检查是否已经授予权限,大于6.0的系统适用,小于6.0系统默认打开,无需理会 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M&&!Settings.canDrawOverlays(

Android 悬浮窗各机型各系统适配大全

这篇博客主要介绍的是 Android 主流各种机型和各种版本的悬浮窗权限适配,但是由于碎片化的问题,所以在适配方面也无法做到完全的主流机型适配,这个需要大家的一起努力,这个博客的名字永远都是一个将来时,感兴趣或者找到其他机型适配方法的请留言告诉我,或者加群544645972一起交流一下,非常感谢~ 相关权限请看我的另一篇博客:android permission权限与安全机制解析(下),或者关于权限的案例使用:android WindowManager解析与骗取QQ密码案例分析. 转载请注明出处

Android悬浮窗实现 使用WindowManager

本文转载自: http://blog.csdn.net/stevenhu_223/article/details/8504058 悬浮窗口的实现涉及到WindowManager(基于4.0源码分析),它是一个接口,实现类有WindowManagerImpl,CompatModeWrapper(WindowManagerImpl的内部类),LocalWindowManager(Window的内部类),它们之间的关系如下图的类图: WindowManagerImpl: 1.是WindowManage

android悬浮窗--获取内存显示当前内存使用量

原文地址:http://www.android100.org/html/201306/20/3224.html 运行效果: 其中, 这一块就是悬浮窗,可以随意拖动,动态显示当前内存使用量. 下面看一下代码是如何实现的: 悬浮窗的实现是用了一个service,为什么要用service呢?了解service特点的大体就会明白.下面看一下: public class FloatService extends Service { WindowManager wm = null; WindowManage

关于Android悬浮窗要获取按键响应的问题

要在Android中实现顶层的窗口弹出,一般都会用WindowsManager来实现,但是几乎所有的网站资源都是说弹出的悬浮窗不用接受任何按键响应. 而问题就是,我们有时候需要他响应按键,比如电视上的android,我们要它响应遥控器上的音量按键等等之类的.这时就必须要对添加的View进行LayoutParams的相关设置了. 主要的代码就两个地方. 第一,添加的view不可以设置layoutParams.flags=LayoutParams.FLAG_NOT_FOCUSABLE;//否则就完全

Android 悬浮窗的实现源码

转载请标明出处:http://blog.csdn.net/pcaxb/article/details/48048529 悬浮窗的实现用到了一个Service.自定义View.Activity 效果图 悬浮窗的实现用到的权限: <!-- 仿360浮动插件需要的权限 --> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <uses-permission and

Android悬浮窗原理解析(Window)[源码]

悬浮窗,在大多数应用中还是很少见的,目前我们接触到的悬浮窗,差不多都是一些系统级的应用软件,例如:360安全卫士,腾讯手机管家等:在某些服务行业如金融,餐饮等,也会在应用中添加悬浮窗,例如:美团的偷红包,博闻金融快捷联系等.但两种悬浮窗还是有区别的: 系统悬浮窗:所有界面都会展示,包括主屏.锁屏 应用悬浮窗:只在应用Activity中展示. 一.窗口Window 在了解悬浮窗之前,首先我们需要认识一下Android窗口Window.Android Framework将窗口分为三个类型: 应用窗口

实现Android悬浮窗仅在本APP的所有界面显示

> 用WindowManager实现的悬浮窗为系统的窗口,会在app后台时仍然显示在界面上. 在实现需求的悬浮窗功能之后: (一) 把 WindowManager对象的addView()方法中添加的myView 放在自定义的 application类中申明(static),并添加get() set()方法. (二)新建一个BaseActivity,在onCreate()通过application获得myView,并在其生命周期方法onResume()中添加myView.setVisibility