简易的可拖动的桌面悬浮窗效果Demo
首先,我们需要知道,悬浮窗分为两种:Activity级别的悬浮窗,系统级别的悬浮窗
Activity级别的悬浮窗跟随所属Activity的生命周期而变化,而系统级别的悬浮窗则可以脱离Activity而存在。
由此可知,要实现360手机卫士那样的悬浮窗效果,就需要使用系统级别的悬浮窗
下面学习实现桌面悬浮窗效果的代码步骤:
Demo描述,悬浮窗为一个ImageView ,可以在桌面 ,任意应用,锁屏上方任意移动
1、配置清单文件AndroidManifest.xml 中 添加系统悬浮窗的权限
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
2、开始Activity代码的编写
先看成员变量:
private WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
private static WindowManager windowManager;
private static ImageView imageView;
onCreate()方法:
获取WindwoManager对象,该对象是系统级别的
windowManager = (WindowManager) getApplication().getSystemService(WINDOW_SERVICE);
使用WindowManager可以显示在其他应用最上层,甚至手机桌面最上层显示窗口。
3、添加一个UI空间,作为悬浮窗的内容 ,当然Demo是一个ImageView作为悬浮窗内容,实际项目中就需要用复杂View,ViewGroup来扩展功能了
//注意,悬浮窗只有一个,而当打开应用的时候才会产生悬浮窗,所以要判断悬浮窗是否已经存在,
if (imageView != null){
windowManager.removeView(imageView);
}
// 使用Application context 创建UI控件,避免Activity销毁导致上下文出现问题,因为现在的悬浮窗是系统级别的,不依赖与Activity存在
imageView = new ImageView(getApplicationContext());
imageView.setImageResource(R.mipmap.normal);
4、设置系统级别的悬浮窗的参数,保证悬浮窗悬在手机桌面上
lp.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT
|WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY; lp.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
|WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
//TYPE_SYSTEM_ALERT 系统提示,它总是出现在应用程序窗口之上
//TYPE_SYSTEM_OVERLAY 系统顶层窗口。显示在其他一切内容之上。此窗口不能获得输入焦点,否则影响锁屏
// FLAG_NOT_FOCUSABLE 悬浮窗口较小时,后面的应用图标由不可长按变为可长按,不设置这个flag的话,home页的划屏会有问题
// FLAG_NOT_TOUCH_MODAL不阻塞事件传递到后面的窗口
关于 WindowManager.LayoutParams 的详解 请参考:Android中WindowManager.LayoutParams类详解
5、悬浮窗默认显示的位置
lp.gravity = Gravity.LEFT|Gravity.TOP; //显示在屏幕左上角
6、悬浮窗相对5默认位置的位置差和悬浮窗宽高设置
//显示位置与指定位置的相对位置差
lp.x = ;
lp.y = ;
//悬浮窗的宽高
lp.width = WindowManager.LayoutParams.WRAP_CONTENT;
lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
7、设置悬浮窗背景透明
lp.format = PixelFormat.TRANSPARENT;
8、将悬浮窗添加到WindowManager对象中
windowManager.addView(imageView,lp);
9.设置悬浮窗的响应事件
这里为移动悬浮窗操作,可以自己扩展添加点击等响应事件
imageView.setOnTouchListener(new View.OnTouchListener() {
private float lastX; //上一次位置的X.Y坐标
private float lastY;
private float nowX; //当前移动位置的X.Y坐标
private float nowY;
private float tranX; //悬浮窗移动位置的相对值
private float tranY; @Override
public boolean onTouch(View v, MotionEvent event) {
boolean ret = false;
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
// 获取按下时的X,Y坐标
lastX = event.getRawX();
lastY = event.getRawY();
ret = true;
break;
case MotionEvent.ACTION_MOVE:
// 获取移动时的X,Y坐标
nowX = event.getRawX();
nowY = event.getRawY();
// 计算XY坐标偏移量
tranX = nowX - lastX;
tranY = nowY - lastY;
// 移动悬浮窗
lp.x += tranX;
lp.y += tranY;
//更新悬浮窗位置
windowManager.updateViewLayout(imageView,lp);
//记录当前坐标作为下一次计算的上一次移动的位置坐标
lastX = nowX;
lastY = nowY;
break;
case MotionEvent.ACTION_UP:
break;
}
return ret;
}
});
10、扩展移除悬浮窗功能 11、效果图:完整代码:
注意添加权限!!!
package com.xqx.window.app; import android.app.Activity;
import android.graphics.PixelFormat;
import android.os.Bundle;
import android.view.*;
import android.widget.ImageView; /**
* 系统级别悬浮窗,可以在手机桌面上显示的悬浮窗
*/
public class FloatWindowActivity extends Activity { private WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
private static WindowManager windowManager;
private static ImageView imageView; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_float_window); // 1、获取系统级别的WindowManager
windowManager = (WindowManager) getApplication().getSystemService(WINDOW_SERVICE); // 判断UI控件是否存在,存在则移除,确保开启任意次应用都只有一个悬浮窗
if (imageView != null){
windowManager.removeView(imageView);
}
// 2、使用Application context 创建UI控件,避免Activity销毁导致上下文出现问题
imageView = new ImageView(getApplicationContext());
imageView.setImageResource(R.mipmap.normal); // 3、设置系统级别的悬浮窗的参数,保证悬浮窗悬在手机桌面上
// 系统级别需要指定type 属性
// TYPE_SYSTEM_ALERT 允许接收事件
// TYPE_SYSTEM_OVERLAY 悬浮在系统上
// 注意清单文件添加权限 //系统提示。它总是出现在应用程序窗口之上。
lp.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT
|WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY; // FLAG_NOT_TOUCH_MODAL不阻塞事件传递到后面的窗口
// FLAG_NOT_FOCUSABLE 悬浮窗口较小时,后面的应用图标由不可长按变为可长按,不设置这个flag的话,home页的划屏会有问题
lp.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
|WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; //悬浮窗默认显示的位置
lp.gravity = Gravity.LEFT|Gravity.TOP;
//显示位置与指定位置的相对位置差
lp.x = ;
lp.y = ;
//悬浮窗的宽高
lp.width = WindowManager.LayoutParams.WRAP_CONTENT;
lp.height = WindowManager.LayoutParams.WRAP_CONTENT; lp.format = PixelFormat.TRANSPARENT;
windowManager.addView(imageView,lp); //设置悬浮窗监听事件
imageView.setOnTouchListener(new View.OnTouchListener() {
private float lastX; //上一次位置的X.Y坐标
private float lastY;
private float nowX; //当前移动位置的X.Y坐标
private float nowY;
private float tranX; //悬浮窗移动位置的相对值
private float tranY; @Override
public boolean onTouch(View v, MotionEvent event) {
boolean ret = false;
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
// 获取按下时的X,Y坐标
lastX = event.getRawX();
lastY = event.getRawY();
ret = true;
break;
case MotionEvent.ACTION_MOVE:
// 获取移动时的X,Y坐标
nowX = event.getRawX();
nowY = event.getRawY();
// 计算XY坐标偏移量
tranX = nowX - lastX;
tranY = nowY - lastY;
// 移动悬浮窗
lp.x += tranX;
lp.y += tranY;
//更新悬浮窗位置
windowManager.updateViewLayout(imageView,lp);
//记录当前坐标作为下一次计算的上一次移动的位置坐标
lastX = nowX;
lastY = nowY;
break;
case MotionEvent.ACTION_UP:
break;
}
return ret;
}
});
} }
FloatWindowActivity.java
简易的可拖动的桌面悬浮窗效果Demo的更多相关文章
- Android桌面悬浮窗效果实现,仿360手机卫士悬浮窗效果
大家好,今天给大家带来一个仿360手机卫士悬浮窗效果的教程,在开始之前请允许我说几句不相干的废话. 不知不觉我发现自己接触Android已有近三个年头了,期间各种的成长少不了各位高手的帮助,总是有很多 ...
- Android 桌面悬浮窗效果实现,仿360手机卫士悬浮窗效果
首先是一个小的悬浮窗显示的是当前使用了百分之多少的内存,点击一下小悬浮窗,就会弹出一个大的悬浮窗,可以一键加速.好,我们现在就来模拟实现一下类似的效果. 先谈一下基本的实现原理,这种桌面悬浮窗的效果很 ...
- Android仿腾讯手机管家实现桌面悬浮窗小火箭发射的动画效果
功能分析: 1.小火箭游离在activity之外,不依附于任何activity,不管activity是否开启,不影响小火箭的代码逻辑,所以小火箭的代码逻辑是要写在服务中: 2.小火箭挂载在手机窗体之上 ...
- Android仿360手机卫士悬浮窗效果
请看下图: 首先是一个小的悬浮窗显示的是当前使用了百分之多少的内存,点击一下小悬浮窗,就会弹出一个大的悬浮窗,可以一键加速.好,我们现在就来模拟实现一下 ...
- C# WPF QQ新消息托盘悬浮窗效果实现
原文:C# WPF QQ新消息托盘悬浮窗效果实现 今天在做一个项目的时候需要这么一个效果,但是网上找了一会发现并没有现成的给我参考(复制),但是呢,我千(到)辛(处)万(抄)苦(袭)想(复)破(制)头 ...
- android桌面悬浮窗仿QQ手机管家加速效果
主要还是用到了WindowManager对桌面悬浮进行管理. 需要一个火箭的悬浮窗 一个发射台悬浮窗 ,判断火箭是否放到了发射台,如果放上了,则使用AsyTask 慢慢将火箭的图片往上移.结束后., ...
- android桌面悬浮窗实现
首先是一个小的悬浮窗显示的是当前使用了百分之多少的内存,点击一下小悬浮窗,就会弹出一个大的悬浮窗,可以一键加速.好,我们现在就来模拟实现一下类似的效果. ...
- android添加桌面悬浮窗
1. 添加权限 <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> 2. ...
- Android WindowManager实现悬浮窗效果 (一)——与当前Activity绑定
最近有学生做毕业设计,想使用悬浮窗这种效果,其实很简单,我们可以通过系统服务WindowManager来实现此功能,本章我们来试验一下在当前Activity之上创建一个悬浮的view. 第一步:认识W ...
随机推荐
- C#简易播放器(基于开源VLC)
可见光通信技术(Visible Light Communication,VLC)是指利用可见光波段的光作为信息载体,不使用光纤等有线信道的传输介质,而在空气中直接传输光信号的通信方式.LED可见光通信 ...
- SSH: 本地.ssh目录下的公钥文件最好删掉
这次ssh amazon ec2的instance,在家里电脑登录OK,到了公司电脑登录失败(只支持公钥机制).私钥已经拷贝到公司的ubuntu上了,奇怪. 后来发现是.ssh目录下存在一些公钥文件导 ...
- 解决 -ERR Plaintext authentication disallowed on non-secure (SSL/TLS) connections 方案[sendmail, dovecot]
在linux下安装sendmail比较容易, 但是在配置sendmail时却是比较麻烦的, 特别是对于一些新手来说, 配置过程必须十分小心谨慎, 要知道, 错误是千奇百怪, 但是成功的结果就只有一个, ...
- Web压力测试 ApacheBench(ab)
ApacheBench命令原理 ab命令会创建很多的并发访问线程,模拟多个访问者同时对某一URL地址进行访问.它的测试目标是基于URL的,因此,既可以用来测试Apache的负载压力,也可以测试ngin ...
- ECMAScript 6中的数组操作方法
本文介绍ECMAScript 6即将带给我们新的数组操作方法,以及在怎样在现有浏览器应用这些新的数组特性. Note: 我将使用交替使用构造器(constructor)和类(class)两个术语. 类 ...
- [SLAM] 01 "Simultaneous Localization and Mapping" basic knowledge
发信人: leecty (Terry), 信区: ParttimeJobPost标 题: 创业公司招SLAM 算法工程师发信站: 水木社区 (Thu Jun 16 19:18:24 2016), 站内 ...
- 初用DataGrip,连接后看不到自己创建的数据库的问题
1.首先,成功连接数据库服务 2.可以看到默认连接到名为"larins_qr_db"的数据库 3.这时,我想看其它的数据库怎么办? 4.OK,想要的出现了!
- 更加优雅地配置Spring Securiy(使用Java配置和注解)
Spring Security 借助一系列Servlet Filter 来提供安全性功能,但是借助Spring的小技巧,我们只需要配置一个Filer就可以了,DelegatingFilterProxy ...
- 移动端前端常见的触摸相关事件touch、tap、swipe等整理
前端的很多事件在PC端和浏览器端可公用,但有些事件却只在移动端产生,如触摸相关的事件 本文整理了移动端常见的一些事件,包括原生支持的click.touch.tap.swipe事件,也有定义型的gest ...
- 创业型互联网公司应该选择PHP, JavaEE还是.NET技术路线?
通常JavaEE和.NET被定义为构建大型在线系统,因为其支持面向对象设计,异步通讯,MVC等都相对比较完善,而PHP通常用于构建比较轻量的业务,例如SNS服务. 因为实施速度快,工程师社区规模大,开 ...