WindowManager 实现悬浮窗 详解
来源:互联网 发布:unix网络编程卷2 编辑:程序博客网 时间:2024/05/21 22:38
(转载)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更新UI4. 定时器(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
出处:http://www.cnblogs.com/didikee/
GitHub:https://github.com/didikee
本博客文章大多为原创,转载请请在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
分类: Android
阅读全文
0 0
- WindowManager 实现悬浮窗 详解
- WindowManager实现悬浮窗
- 使用WindowManager实现悬浮窗
- 利用WindowManager实现悬浮窗
- 使用WindowManager实现悬浮窗
- Android悬浮窗实现 使用WindowManager
- Android悬浮窗实现 使用WindowManager
- Android悬浮窗实现 使用WindowManager
- Android悬浮窗实现 使用WindowManager
- Android悬浮窗实现 使用WindowManager
- Android悬浮窗实现 使用WindowManager
- Android悬浮窗实现 使用WindowManager
- 使用WindowManager实现Android悬浮窗
- Android悬浮窗实现 使用WindowManager
- Android使用WindowManager实现悬浮窗
- Android 利用WindowManager实现悬浮窗
- WindowManager实现悬浮窗口
- Android WindowManager悬浮窗:不需要申请权限实现悬浮
- lintcode&九章算法——No.3 统计数字 ? 待解决
- x264_param_default分析
- tomcat安装Https证书
- Guava Lists.transform 使用及问题
- 上帝不是掷骰子,上帝只是两种形态
- WindowManager 实现悬浮窗 详解
- android实现软键盘弹出,editText随键盘上移,背景不动
- 某一个标签如button,之前通过jQuery添加过一个click事件,然后我想给这个button再添加一个click事件,但是我又不想让之前那个click事件触发,怎么办?
- $.ajax()方法详解
- PCA——python实现
- 【十八掌●武功篇】第十六掌:Spark之Scala安装和HelloWorld
- Android NDK开发日志(一)
- 欢迎使用CSDN-markdown编辑器
- java运算符优先级