1. 添加权限

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

2. 自定义悬浮窗控件

@SuppressLint("ViewConstructor")
public class OEdOverLayView extends FrameLayout { public static OEdOverLayView create(Context context) {
return new OEdOverLayView(context);
} public static WindowManager.LayoutParams createLayoutParams() { final WindowManager.LayoutParams params =
new WindowManager.LayoutParams(WRAP_CONTENT, WRAP_CONTENT, TYPE_TOAST, FLAG_NOT_FOCUSABLE
| FLAG_NOT_TOUCH_MODAL
| FLAG_LAYOUT_NO_LIMITS
| FLAG_LAYOUT_INSET_DECOR
| FLAG_LAYOUT_IN_SCREEN, TRANSLUCENT);
params.gravity = Gravity.TOP | Gravity.LEFT;
return params;
} private OEdOverLayView(@NonNull Context context) {
super(context);
inflate(context, R.layout.widget_oed_overlay, this);
init();
}

3. 加载控件到桌面

 private void addOverLayView() {
if (oEdOverLayView == null) {
oEdOverLayView = OEdOverLayView.create(getApplicationContext());
WindowManager windowManager = (WindowManager) getApplicationContext().getSystemService(WINDOW_SERVICE);
windowManager.addView(oEdOverLayView, OEdOverLayView.createLayoutParams());
oEdOverLayView.getRootLayout().setOnTouchListener(new OEdOverLayMoveListener(windowManager, oEdOverLayView));
}
}

4. 添加移动事件

public class OEdOverLayMoveListener implements View.OnTouchListener {
private final WindowManager windowManager;
private final View view;
private WindowManager.LayoutParams params;
private int initialX;
private int initialY;
private float initialTouchX;
private float initialTouchY; public OEdOverLayMoveListener(WindowManager windowManager, View view) {
this.windowManager = windowManager;
this.view = view;
this.params = (WindowManager.LayoutParams) view.getLayoutParams();
} @Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
//remember the initial position.
initialX = params.x;
initialY = params.y;
//get the touch location
initialTouchX = event.getRawX();
initialTouchY = event.getRawY();
return true;
case MotionEvent.ACTION_MOVE:
//Calculate the X and Y coordinates of the view.
params.x = initialX + (int) (event.getRawX() - initialTouchX);
params.y = initialY + (int) (event.getRawY() - initialTouchY);
//Update the layout with new X & Y coordinate
windowManager.updateViewLayout(view, params);
return true;
}
return true;
}
}
// return ture 会消费掉touch事件,导致onclick无法获取事件

5. 小细节

    public static WindowManager.LayoutParams createLayoutParams() {

        final WindowManager.LayoutParams params =
new WindowManager.LayoutParams(WRAP_CONTENT, WRAP_CONTENT, TYPE_TOAST, FLAG_NOT_FOCUSABLE
| FLAG_NOT_TOUCH_MODAL
| FLAG_LAYOUT_NO_LIMITS
| FLAG_LAYOUT_INSET_DECOR
| FLAG_LAYOUT_IN_SCREEN, TRANSLUCENT);
params.gravity = Gravity.TOP | Gravity.LEFT;
return params;
}

  TYPE_TOAST 和 android.permission.SYSTEM_ALERT_WINDOW 可以在用户一旦取消悬浮窗权限时,添加悬浮窗

android添加桌面悬浮窗的更多相关文章

  1. Android仿腾讯手机管家实现桌面悬浮窗小火箭发射的动画效果

    功能分析: 1.小火箭游离在activity之外,不依附于任何activity,不管activity是否开启,不影响小火箭的代码逻辑,所以小火箭的代码逻辑是要写在服务中: 2.小火箭挂载在手机窗体之上 ...

  2. android桌面悬浮窗仿QQ手机管家加速效果

    主要还是用到了WindowManager对桌面悬浮进行管理. 需要一个火箭的悬浮窗 一个发射台悬浮窗  ,判断火箭是否放到了发射台,如果放上了,则使用AsyTask 慢慢将火箭的图片往上移.结束后., ...

  3. Android 桌面悬浮窗效果实现,仿360手机卫士悬浮窗效果

    首先是一个小的悬浮窗显示的是当前使用了百分之多少的内存,点击一下小悬浮窗,就会弹出一个大的悬浮窗,可以一键加速.好,我们现在就来模拟实现一下类似的效果. 先谈一下基本的实现原理,这种桌面悬浮窗的效果很 ...

  4. Android桌面悬浮窗效果实现,仿360手机卫士悬浮窗效果

    大家好,今天给大家带来一个仿360手机卫士悬浮窗效果的教程,在开始之前请允许我说几句不相干的废话. 不知不觉我发现自己接触Android已有近三个年头了,期间各种的成长少不了各位高手的帮助,总是有很多 ...

  5. 简易的可拖动的桌面悬浮窗效果Demo

    首先,我们需要知道,悬浮窗分为两种:Activity级别的悬浮窗,系统级别的悬浮窗 Activity级别的悬浮窗跟随所属Activity的生命周期而变化,而系统级别的悬浮窗则可以脱离Activity而 ...

  6. android桌面悬浮窗实现

                            首先是一个小的悬浮窗显示的是当前使用了百分之多少的内存,点击一下小悬浮窗,就会弹出一个大的悬浮窗,可以一键加速.好,我们现在就来模拟实现一下类似的效果. ...

  7. Android WindowManager实现悬浮窗效果 (一)——与当前Activity绑定

    最近有学生做毕业设计,想使用悬浮窗这种效果,其实很简单,我们可以通过系统服务WindowManager来实现此功能,本章我们来试验一下在当前Activity之上创建一个悬浮的view. 第一步:认识W ...

  8. Android Widget和悬浮窗 原理

    1.简单介绍 Android widget是桌面插件,在android系统应用开发层面有特殊用途. AppWidget是把一个进程的控件嵌入到别外一个进程的窗口里的一种方法.悬浮窗的效果与Widget ...

  9. android 8.0 悬浮窗 最简demo

    MainActivity.java文件 package com.example.performance; import android.app.Activity; import android.con ...

随机推荐

  1. JAVA基础篇—基本数据类型

    Java8种基本数据类型:4个整型byte 1字节 8bit 范围-128~127 short 2字节 16bit 范围-2^15 -1~2^15 -1 int 4字节 32bit 范围-2^31-1 ...

  2. hdu 6312

    Problem Description Alice and Bob are playing a game.The game is played on a set of positive integer ...

  3. centos配置jdk

    ########## config jdk ########## export JAVA_HOME=/usr/local/java/jdk1.7.0_79 export CLASSPATH=.:${J ...

  4. bs4--官文--搜索文档树

    搜索文档树 Beautiful Soup定义了很多搜索方法,这里着重介绍2个: find() 和 find_all() .其它方法的参数和用法类似,请读者举一反三. 再以“爱丽丝”文档作为例子: ht ...

  5. windows基本DOS命令

    基本命令 dir : 列出当前目录下的文件以及文件夹,后面可以接其他路径 md : 创建目录(mkdir),一次创建多级目录,mkdir a\b\c rd : 删除目录,删除非空目录rd /s(删除最 ...

  6. Notepad++ WebEdit插件

    虽然PHP的IDE有很多,但是,我还是比较喜欢用Notepad++这款编辑器,因为比较轻量级,而且用起来比较顺手. 但是最近在改别人写的代码的时候,经常要在选定的php前后插入<?php  ?& ...

  7. C++ STL 的初步认知

    学无止境!!!    尊重他人劳动,尊重出处:http://www.cnblogs.com/shiyangxt/archive/2008/09/11/1289493.html 我已经做了4年的MFC ...

  8. 聊聊、Spring 第二篇

    之前写了一篇<Spring环境搭建一>,感觉写的很烂,也许是时间有限,写的很急.今天我想再写写 Spring 的环境搭建,因为 Spring 的模块是可以单独拿出来用的,所以有很多的模块不 ...

  9. [python学习篇][廖雪峰][1]高级特性--列表生成式

    >>> import os >>> [d for d in os.listdir(r"d:\temp")] ['0.png', '0.xml', ...

  10. [持续集成学习篇]【1】[jenkins安装与配置]

    Guided Tour This guided tour will use the "standalone" Jenkins distribution which requires ...