1. 创建并设置  WindowManager  类

		WindowManager mWindowManager;
// 取得系统窗体
mWindowManager = (WindowManager) getApplicationContext()
.getSystemService("window"); // 窗体的布局样式
mLayout = new WindowManager.LayoutParams(); // 设置窗体显示类型——TYPE_SYSTEM_ALERT(系统提示)需要添加权限
/*
* AndroidManifest.xml 文件
* <!-- 添加权限-->
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
* */
//mLayout.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; //设置窗体显示类型——TYPE_SYSTEM_ALERT(系统提示) 不需要添加权限
mLayout.type = WindowManager.LayoutParams.TYPE_TOAST; // 设置窗体焦点及触摸:
// FLAG_NOT_FOCUSABLE(不能获得按键输入焦点)
mLayout.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; // 设置显示的模式
mLayout.format = PixelFormat.RGBA_8888; // 设置对齐的方法
mLayout.gravity = Gravity.TOP | Gravity.LEFT; // 设置窗体宽度和高度
mLayout.width = WindowManager.LayoutParams.WRAP_CONTENT;
mLayout.height = WindowManager.LayoutParams.WRAP_CONTENT;

  2. 创建并设置view 类 (TextView  为例, 主要是显示的view, 监听了两个事件, 一个为拖动事件另一个为双击移除悬浮)

TextView mDesktopLayout = new TextView(this);

		mDesktopLayout.setOnTouchListener(new OnTouchListener() {
float mTouchStartX;
float mTouchStartY; @Override
public boolean onTouch(View v, MotionEvent event) {
// 获取相对屏幕的坐标,即以屏幕左上角为原点
x = event.getRawX();
y = event.getRawY() - top; // 25是系统状态栏的高度
Log.i("startP", "startX" + mTouchStartX + "====startY"
+ mTouchStartY);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
// 获取相对View的坐标,即以此View左上角为原点
mTouchStartX = event.getX();
mTouchStartY = event.getY();
Log.i("startP", "startX" + mTouchStartX + "====startY"
+ mTouchStartY);
long end = System.currentTimeMillis() - startTime;
// 双击的间隔在 300ms以下
if (end < 300) {
closeDesk();
}
startTime = System.currentTimeMillis();
break;
case MotionEvent.ACTION_MOVE:
// 更新浮动窗口位置参数
mLayout.x = (int) (x - mTouchStartX);
mLayout.y = (int) (y - mTouchStartY);
mWindowManager.updateViewLayout(v, mLayout);
break;
case MotionEvent.ACTION_UP: // 更新浮动窗口位置参数
mLayout.x = (int) (x - mTouchStartX);
mLayout.y = (int) (y - mTouchStartY);
mWindowManager.updateViewLayout(v, mLayout); // 可以在此记录最后一次的位置 mTouchStartX = mTouchStartY = 0;
break;
}
return true;
}
});

  3. 添加和移除悬浮

	/**
* 显示DesktopLayout
*/
private void showDesk() { mDesktopLayout.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
mDesktopLayout.setText("test0000001");
mWindowManager.addView(mDesktopLayout, mLayout);
//finish();
} /**
* 关闭DesktopLayout
*/
private void closeDesk() {
mWindowManager.removeView(mDesktopLayout);
//finish();
}

  思路总结: 利用系统弹窗口置顶的原理实现悬浮, 系统弹出窗口使用了WindowManager类, 然后利用该类的addView方法把view视图类添加进去, 利用removeView方法把添加进去的类移除, 利用updateViewLayout方法更新窗口数据如位置等.

附加:

1.变量声明

	private WindowManager mWindowManager;
private WindowManager.LayoutParams mLayout;
private TextView mDesktopLayout;
//private DesktopLayout mDesktopLayout;
private long startTime;
// 声明屏幕的宽高
float x, y;
int top;

2.WindowManager  的  type属性取值情况

a.  WindowManager.LayoutParams.TYPE_SYSTEM_ERROR; 系统错误提示窗口, 需要权限, 视图显示在所有窗口前面, 包括锁屏.

b. WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; 系统对话框窗口, 需要权限, 视图显示在窗口前面, 不包括锁屏, 状态栏下拉面板.

c. WindowManager.LayoutParams.TYPE_TOAST; 提示窗口, 不需要权限, 和TYPE_SYSTEM_ALERT显示范围一样.

Android 之 悬浮窗口的更多相关文章

  1. Android中悬浮窗口

    调用WindowManager,并设置WindowManager.LayoutParams的相关属性,通过WindowManager的addView方法创建View,这样产生出来的View根据Wind ...

  2. Android中悬浮窗口的实现原理和示例代码

    用了我一个周末的时间,个中愤懑就不说了,就这个问题,我翻遍全球网络没有一篇像样的资料,现在将实现原理简单叙述如下: 调用WindowManager,并设置WindowManager.LayoutPar ...

  3. Android之悬浮窗口实现(WindowManager)

    工作中遇到一些项目需要把窗体显示在最上层,像来电弹窗显示电话号码等信息.拦截短信信息显示给用户或者游戏中实现声音的调节,我们想这些数据放在最上层,activity就满足不了我们的需求了,有些开发者使用 ...

  4. Android视频悬浮窗口实现

    前言 本文例子实现了点击显示悬浮窗口,同时窗口可播放视频,拖动位置,点击关闭及返回APP页面,通过例子来讲述悬浮窗口实现原理及细节处理,效果图如下所示: 原理 WindowManager对View视图 ...

  5. Android悬浮窗口的实现

    效果图:(悬浮框可拖动) 在项目开发中有一个需求:弹出悬浮窗后,响应悬浮窗的事件再弹出对话框,但是对话框怎么也不显示.也就是说在弹出悬浮框的同时,不能再弹出对话框,可能的原因: 1.悬浮框的焦点在最前 ...

  6. Android 悬浮窗口

    Android 悬浮窗口 一.创建悬浮窗口步骤    1.实现一个ViewGroup类,作为悬浮窗口的界面类,以便在里面重写onInterceptTouchEvent和onTouchEvent方法,实 ...

  7. Android 类似360悬浮窗口实现源码

    当我们在手机上安装360安全卫士时,手机屏幕上时刻都会出现一个小浮动窗口,点击该浮动窗口可跳转到安全卫士的操作界面,而且该浮动窗口不受其他activity的覆盖影响仍然可见(多米音乐也有相关的和主界面 ...

  8. android悬浮窗口的一些说明

    1.xml文件里的权限申请 <uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" ...

  9. Android WindowManager和WindowManager.LayoutParams的使用以及实现悬浮窗口的方法

    1.理清概念 我们使用过Dialog和PopupWindow,还有Toast,它们都显示在Activity之上.那么我们首先需要理解的是android中是如何去绘制这些UI的呢?这里我只讲我所理解的, ...

随机推荐

  1. Android_(游戏)打飞机03:控制玩家飞机

    (游戏)打飞机01:前言 传送门 (游戏)打飞机02:游戏背景滚动 传送门 (游戏)打飞机03:控制玩家飞机 传送门 (游戏)打飞机04:绘画敌机.添加子弹   传送门 (游戏)打飞机05:处理子弹, ...

  2. 机器学习模型解释工具-Lime

    本篇文章转载于LIME:一种解释机器学习模型的方法 该文章介绍了一种模型对单个样本解释分类结果的方法,区别于对整体测试样本的评价指标准确率.召回率等,Lime为具体某个样本的分类结果做出解释,直观地表 ...

  3. spark中使用的内存文件系统-Tachyon FS 简介

    转自:http://blog.csdn.net/u014252240/article/details/41810849  发布人:南京大学PASA大数据实验室顾荣 1. Tachyon是什么 Tach ...

  4. Dubbo HA 高可用

    一.zookeeper 宕机 现象:zookeeper 注册中心宕机,还可以消费 dubbo 暴露的服务 健壮性  监控中心宕掉不影响使用,只是丢失部分采样数据  数据库宕掉后,注册中心仍能通过缓 ...

  5. virtualbox安装xp虚拟机缺少驱动

    下载驱动精灵完全版,自带万能驱动

  6. nodejs之express路由与动态路由

    1.快速创建express项目步骤 /** * 1.cd 到项目里面 * 2.npm init --yes 创建package.json文件 * 3.安装express * npm install e ...

  7. hash模块MD5加密

    MD5加密:获取32位加密字符串: 示例(MD5加密'123456')import hashlibhashObject=hashlib.md5(b'123456') #实例化,加密字符串不能直接加密, ...

  8. Python_序列对象内置方法详解_String

    目录 目录 前言 软件环境 序列类型 序列的操作方法 索引调用 切片运算符 扩展切片运算符 序列元素的反转 连接操作符 重复运算符 成员关系符 序列内置方法 len 获取序列对象的长度 zip 混合两 ...

  9. caffe-----silence layer 作用

    最近看到prototxt里面有silence这个层,好奇是干什么用的,而且看源码也出奇的简单: #include <vector> #include "caffe/layers/ ...

  10. flum到kafka 收集数据 存储到redis 案例 (ip.txt)

    ip.scala package ip import org.apache.kafka.clients.consumer.ConsumerRecord import org.apache.kafka. ...