WindowManager 实现悬浮窗 详解
WindowManager 实现悬浮窗 详解
一:对于想直接看效果的,可以看看我的demo app.
链接:http://sj.qq.com/myapp/detail.htm?apkName=com.inno.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毫秒执行一次任务;
WindowManager 实现悬浮窗 详解的更多相关文章
- Android WindowManager实现悬浮窗效果 (一)——与当前Activity绑定
最近有学生做毕业设计,想使用悬浮窗这种效果,其实很简单,我们可以通过系统服务WindowManager来实现此功能,本章我们来试验一下在当前Activity之上创建一个悬浮的view. 第一步:认识W ...
- 关于Android WindowManager显示悬浮窗的动画效果
要实现WindowManager添加的窗口,实现动画显示,就需要添加如下红色的属性,其他的添加View只要设置其Animations属性也会实现动画,当然自己实现也可,但是能直接用系统的已经实现好的, ...
- Android悬浮窗实现 使用WindowManager
Android悬浮窗实现 使用WindowManager WindowManager介绍 通过Context.getSystemService(Context.WINDOW_SERVICE)可以获得 ...
- Android 使用WindowManager实现Android悬浮窗
WindowManager介绍 通过Context.getSystemService(Context.WINDOW_SERVICE)可以获得 WindowManager对象. 每一个WindowMan ...
- Android PopupWindow Dialog 关于 is your activity running 崩溃详解
Android PopupWindow Dialog 关于 is your activity running 崩溃详解 [TOC] 起因 对于 PopupWindow Dialog 需要 Activi ...
- Android仿360手机卫士悬浮窗效果
请看下图: 首先是一个小的悬浮窗显示的是当前使用了百分之多少的内存,点击一下小悬浮窗,就会弹出一个大的悬浮窗,可以一键加速.好,我们现在就来模拟实现一下 ...
- android桌面悬浮窗实现
首先是一个小的悬浮窗显示的是当前使用了百分之多少的内存,点击一下小悬浮窗,就会弹出一个大的悬浮窗,可以一键加速.好,我们现在就来模拟实现一下类似的效果. ...
- Android桌面悬浮窗效果实现,仿360手机卫士悬浮窗效果
大家好,今天给大家带来一个仿360手机卫士悬浮窗效果的教程,在开始之前请允许我说几句不相干的废话. 不知不觉我发现自己接触Android已有近三个年头了,期间各种的成长少不了各位高手的帮助,总是有很多 ...
- Android 摄像头预览悬浮窗,可拖动,可显示在其他app上方
市面上常见的摄像头悬浮窗,如微信.手机QQ的视频通话功能,有如下特点: 整屏页面能切换到一个小的悬浮窗 悬浮窗能运行在其他app上方 悬浮窗能跳回整屏页面,并且悬浮窗消失 我们探讨过用CameraX打 ...
随机推荐
- OpenResty(nginx_lua_module)做ES代理以及备份ES数据
#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #erro ...
- 关于libsvm工具箱在64位matlab下的安装说明
LIBSVM工具箱的安装 基本方法: 1.在网上下载LIBSVM工具箱. http://www.csie.ntu.edu.tw/~cjlin/libsvm/ 2.将LIBSVM工具箱所在目录添加到MA ...
- 用eclipse搭建SSH(struts+spring+hibernate)框架
声明: 本文是个人对ssh框架的学习.理解而编辑出来的,可能有不足之处,请大家谅解,但希望能帮助到大家,一起探讨,一起学习! Struts + Spring + Hibernate三者各自的特点都是什 ...
- gruntJs篇之connect+watch自动刷新
grunt很强大,可以帮我我们解决很多繁琐的操作,虽然刚接触不久,但依然感受到其强大之处,这篇记录一下通过grunt.js实现事实刷新页面, 省去了编码 -> 保存 -> F5..F5.. ...
- 「2014-3-17」C pointer again …
记录一个比较基础的东东-- C 语言的指针,一直让人又爱又恨,爱它的人觉得它既灵活又强大,恨它的人觉得它太过于灵活太过于强大以至于容易将人绕晕.最早接触 C 语言,还是在刚进入大学的时候,算起来有好些 ...
- PYTHON学习之路_PYTHON基础(8)
学习内容: Python模块介绍 1.经典类 or 新式类 2.抽象接口 3.静态方法.类方法.属性方法 4.反射 5.异常处理 6.socket编程初识 7.用socket实现get.put文件等功 ...
- alfresco install in linux, and integrated with tesseract ocr
本文描述在Linux系统上安装Alfresco的步骤: 1. 下载安装文件:alfresco-community-5.0.d-installer-linux-x64.bin 2. 增加执行权限并执行: ...
- 【转】【Linux】 临界区,互斥量,信号量,事件的区别
原文地址:http://blog.itpub.net/10697500/viewspace-612045/ Linux中 四种进程或线程同步互斥的控制方法1.临界区:通过对多线程的串行化来访问公共资源 ...
- AndroidStudio学习笔记-第一个安卓程序
要带一个本科生做一部分跟安卓有点关系的项目,于是趁着机会学习一下编写安卓程序. 第一篇材料来自谷歌官方,传送门:https://developer.android.com/training/basic ...
- asp.net导出dbf报错“未在本地计算机上注册“VFPOLEDB”提供程序。”
导出dbf文件报错,提示“未在本地计算机上注册“VFPOLEDB”提供程序.” 可以尝试一下方法: 方法一:下载VFPOLEDBSetup.msi 安装 如果方法一不行:继续方法二:下载vfp9.0 ...