WindowManager 实现悬浮窗 详解

本文详细介绍如何使用WindowManager在Android中创建悬浮窗,并针对不同API级别调整权限设置。文中还介绍了OnTouch事件处理、LayoutParams属性应用及如何通过Handler更新UI。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(转载)http://www.cnblogs.com/didikee/p/5687757.html

WindowManager 实现悬浮窗 详解

一:对于想直接看效果的,可以看看我的demo app.

链接:http://sj.qq.com/myapp/detail.htm?apkName=com.inno.backdot

源码:https://github.com/didikee/BackDot

二: Android 6.0 关于SYSTEM_ALERT_WINDOW权限申明直接报错

// 设置window type 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        mWinParams.type = WindowManager.LayoutParams.TYPE_TOAST;
    } else {
        mWinParams.type = WindowManager.LayoutParams.TYPE_PHONE;
    }
//原因1:type为"TYPE_TOAST"在sdk19之前不接收事件,之后可以.
//原因12:type为"TYPE_PHONE"需要"SYSTEM_ALERT_WINDOW"权限.在sdk19之前不可以直接申明使用,之后不能直接申明使用.

三:用到的技术知识点:

1. OnTouch()的事件处理
2. WindowManager类及其LayoutParams的常见属性的理解
3. Handler更新UI
4. 定时器(Timer + TimerTask)

1. OnTouch事件处理

这个网上的资料很多,这里说一些注意点:

1.获取坐标

  • event.getRawX():获取相对屏幕的坐标X(获取Y的坐标同理)
  • event.getX():获取相对于容器的坐标X(获取Y的坐标同理)

2.返回值

  • return true:表示事件不往下传递了
  • return false:表示继续传递事件

2. WindowManager类

获取方式:

mWmManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);

WindowManager.LayoutParams类

this.mWinParams = new WindowManager.LayoutParams();
    // 设置图片格式,效果为背景透明
    mWinParams.format = PixelFormat.RGBA_8888;
    // 设置浮动窗口不可聚焦(实现操作除浮动窗口外的其他可见窗口的操作)
    mWinParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
    // 参考系为左上
    mWinParams.gravity= Gravity.LEFT | Gravity.TOP;
    mScreenHeight = mWmManager.getDefaultDisplay().getHeight();

    // 以屏幕左上角为原点,设置x、y初始值,相对于gravity
    mWinParams.x = mScreenWidth/4;
    mWinParams.y = mScreenHeight/4;

    // 设置悬浮窗口长宽数据
    mWinParams.width = FrameLayout.LayoutParams.WRAP_CONTENT;
    mWinParams.height = FrameLayout.LayoutParams.WRAP_CONTENT;

其中需要注意的是其Gravity属性:

注意:Gravity不是说你添加到WindowManager中的View相对屏幕的几种放置,而是说你可以设置你的 参 考 系 !

例如:mWinParams.gravity= Gravity.LEFT | Gravity.TOP;意思是以屏幕左上角为参考系,那么屏幕左上角的坐标就是(0,0),这是你后面摆放View位置的唯一依据.当你设置为mWinParams.gravity = Gravity.CENTER;那么你的屏幕中心为参考系,坐标(0,0).一般我们用屏幕左上角为参考系.

设置WindowManager中的View的透明度

使用:LayoutParams.alpha属性(0.0f ~ 1.0f),1.0f不透明,0.0f全透明,源码如下:

    /**
     * An alpha value to apply to this entire window.
     * An alpha of 1.0 means fully opaque and 0.0 means fully transparent
     */
    public float alpha = 1.0f;
Handler更新UI(略)
定时器
TimerTask timerTask = new TimerTask(){其实就是一个Runnable};
看他的类:
public abstract class TimerTask implements Runnable{...}

Timer mtimer=new Timer();

使用的时候:
mtimer.schedule(timerTask,0,3);//参数1:执行的任务;参数2:延迟0毫米执行;参数3:每隔3毫秒执行一次任务;
作者: didikee
本博客文章大多为原创,转载请请在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
分类:  Android

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值