创建桌面悬浮窗

原理是 使用 WindowManager 来将一个View 添加到屏幕上,并控制它的移动和点击。

1. 自定义一个FloatView, 让它继承 ImageView。其中主要复写 OnTouchEvent,以使悬浮窗可以随着手指移动。

2. 定义一个 LayoutParams, 设置其属性后, 将其赋给 floatView 。 然后使用 WindowManager 添加 View 到屏幕。复制一段代码过来:

windowManagerParams.type = LayoutParams.TYPE_PHONE; // 设置window type 
windowManagerParams.format = PixelFormat.RGBA_8888; // 设置图片格式,效果为背景透明 
// 设置Window flag 
windowManagerParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL 
| LayoutParams.FLAG_NOT_FOCUSABLE; 
/* 
* 注意,flag的值可以为: 
* LayoutParams.FLAG_NOT_TOUCH_MODAL 不影响后面的事件 
* LayoutParams.FLAG_NOT_FOCUSABLE 不可聚焦 
* LayoutParams.FLAG_NOT_TOUCHABLE 不可触摸 
*/ 
// 调整悬浮窗口至左上角,便于调整坐标 
windowManagerParams.gravity = Gravity.LEFT | Gravity.TOP; 
// 以屏幕左上角为原点,设置x、y初始值 
windowManagerParams.x = 0; 
windowManagerParams.y = 0; 
// 设置悬浮窗口长宽数据 
windowManagerParams.width = LayoutParams.WRAP_CONTENT; 
windowManagerParams.height = LayoutParams.WRAP_CONTENT; 
// 显示myFloatView图像 
windowManager.addView(floatView, windowManagerParams);  

3. 注意要添加权限 

android.permission.SYSTEM_ALERT_WINDOW

4. 解释一个标识位

官方的翻译如下:
FLAG_NOT_TOUCH_MODAL:
当窗口可以获得焦点(没有设置 FLAG_NOT_FOCUSALBE 选项)时,仍然将窗口范围之外的点设备事件(鼠标、触摸屏)发送给后面的窗口处理。否则它将独占所有的点设备事件,而不管它们是不是发生在窗口范围内。

FLAG_WATCH_OUTSIDE_TOUCH:
如果你设置了FLAG_NOT_TOUCH_MODAL,那么当触屏事件发生在窗口之外事,可以通过设置此标志接收到一个MotionEvent.ACTION_OUTSIDE事件。注意,你不会收到完整的down/move/up事件,只有第一次down事件时可以收到ACTION_OUTSIDE。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值