经常,我们看到在桌面上可移动的悬浮窗,这种场景还是很多的, 像流量统计,桌面歌词等,安全软件的清理小部件

这种小部件主要是通过 WindowManager ; WindowManager.LayoutParams 这两个类来实现

调用 WindowManager 的addView(view, params)方法来添加一个悬浮窗.updateViewLayout(view,params)来更新悬浮窗参数.removeView(view)用于移除悬浮窗

WindowManager.LayoutParams 主要是用来提供参数的

其中的参数有type: 悬浮窗的类型,通常设置为2002, 即在所有程序之上.状态栏之下

flags :用于确定悬浮窗的行为

gravity : 用于确定悬浮窗的对其方式

x: 悬浮窗的横向坐标

y: 悬浮窗的纵向坐标

width: 悬浮窗的宽度

height : 悬浮窗的高度

创建悬浮窗需要添加权限:

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

悬浮窗布局

<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/small_window_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/bg" > <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="拖拽移动.."
android:textSize="20sp" /> </LinearLayout>

新建一个类继承Application,Application就是应用的入口点,写在这里,就是程序一运行,就会出来

同时,需要在清单文件的Application结点上配置名称

package com.example.windowmanagerdemo;

import android.annotation.SuppressLint;
import android.app.Application;
import android.content.Context;
import android.graphics.PixelFormat;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
import android.widget.Toast; public class MAppliction extends Application {
WindowManager mWM; WindowManager.LayoutParams mParams; @Override
public void onCreate() {
super.onCreate();
mWM = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
mParams = new WindowManager.LayoutParams();
final View mwm = LayoutInflater.from(this).inflate(R.layout.mwm, null); mwm.setOnTouchListener(new OnTouchListener() {
float lastX, lastY; @SuppressLint("NewApi")
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
lastX = event.getX();
lastY = event.getY();
break;
case MotionEvent.ACTION_MOVE:
float moveX = event.getX();
float moveY = event.getY();
mParams.x += (int) (moveX - lastX);
mParams.y += (int) (moveY - lastY);
mWM.updateViewLayout(mwm, mParams);
break;
default:
break;
}
return true;
}
}); mParams.type = LayoutParams.TYPE_PHONE;
mParams.format = PixelFormat.RGBA_8888;
mParams.width = 50;
mParams.height = 30;
mWM.addView(mwm, mParams); mwm.setOnTouchListener(new onDoubleClick());
} public int count; class onDoubleClick implements View.OnTouchListener { private long firClick;
private long secClick; @Override
public boolean onTouch(View v, MotionEvent event) {
if (MotionEvent.ACTION_DOWN == event.getAction()) {
count++;
if (count == 1) {
firClick = System.currentTimeMillis(); } else if (count == 2) {
secClick = System.currentTimeMillis();
if (secClick - firClick < 1000) {
// 双击事件
mWM.removeView(v);
Toast.makeText(getApplicationContext(), "关闭悬浮窗",
Toast.LENGTH_SHORT).show();
}
count = 0;
firClick = 0;
secClick = 0;
}
}
return true;
}
}
}

Android WindowManager的使用的更多相关文章

  1. Android WindowManager悬浮窗:不需要申请权限实现悬浮

     Android WindowManager悬浮窗:不需要申请权限实现悬浮 附录文章1介绍了Android平台上的悬浮窗WindowManager,WindowManager悬浮窗可以悬浮在And ...

  2. 关于Android WindowManager显示悬浮窗的动画效果

    要实现WindowManager添加的窗口,实现动画显示,就需要添加如下红色的属性,其他的添加View只要设置其Animations属性也会实现动画,当然自己实现也可,但是能直接用系统的已经实现好的, ...

  3. Android WindowManager 监听返回键及home键

    一.监听home键盘,Android Home键系统负责监听,捕获后系统自动处理.有时候,我们需要监听home键处理自己的逻辑,监听方法如下: /** * 监听home键广播 */ private f ...

  4. Android WindowManager 小结

    Android---系统服务之 ---WindowManager WindowManager是Android中一个重要的服务(Service ).WindowManager Service 是全局的, ...

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

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

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

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

  7. Android添加系统级顶层窗口 和 WindowManager添加view的动画问题

    当Dialog有编辑框时如果选择会弹菜单窗口就不要用 Context applicationContext = mainActivity.getApplicationContext(); AlertD ...

  8. android 不能在子线程中更新ui的讨论和分析

    问题描写叙述 做过android开发基本都遇见过 ViewRootImpl$CalledFromWrongThreadException,上网一查,得到结果基本都是仅仅能在主线程中更改 ui.子线程要 ...

  9. Android 悬浮窗权限各机型各系统适配大全

    这篇博客主要介绍的是 Android 主流各种机型和各种版本的悬浮窗权限适配,但是由于碎片化的问题,所以在适配方面也无法做到完全的主流机型适配,这个需要大家的一起努力,这个博客的名字永远都是一个将来时 ...

随机推荐

  1. JS 导出图片,toDataURL

    //输出图片 function exportCanvasAsPNG(id, fileName) { //获取canvas元素 var canvasElement = document.getEleme ...

  2. php函数——『解析 xml数据』

    <?php //该文件是 //$raw_post_data = file_get_contents('php://input'); //file_put_contents('a.txt', $r ...

  3. windows 下PHP 和 nginx配置

    http://www.cnblogs.com/huayangmeng/archive/2011/06/15/2081337.html

  4. 设置android状态栏颜色和toolbar颜色一致

    使用:https://github.com/jgilfelt/SystemBarTint在Activity中:@Overrideprotected void onCreate(Bundle saved ...

  5. JavaScript Book Plan

    1. HTML5 2. Library & Framwork About Performance Tool and Process https://developers.google.com/ ...

  6. Ubiquitous Religions(并查集)

    Description There are so many different religions in the world today that it is difficult to keep tr ...

  7. Maven实战六

    转载:http://www.iteye.com/topic/1132509 一.简介 settings.xml对于maven来说相当于全局性的配置,用于所有的项目,当Maven运行过程中的各种配置,例 ...

  8. bzoj2789

    这种题目肯定是先把一个当做标准串根据标准串得出一个初始串是怎么排列的,然后求逆序对数就可以了但是因为有重复,我们不知道标准串中的一个数到底是由原来哪个字母交换来的但是我们可以猜,不难贪心得到对于标准串 ...

  9. spoj-694-Distinct Substrings(后缀数组)

    题意: 给定一个字符串,求不相同的子串的个数 分析: 每个子串一定是某个后缀的前缀,那么原问题等价于求所有后缀之间的不相同 的 前 缀 的 个 数 . 如 果 所 有 的 后 缀 按 照 suffix ...

  10. hdu-4612-Warm up(边双连通分量--有重边)

    题意:有N 个点,M条边,加一条边,求割边最少.(有重边) 分析:先求双连通分量,缩点形成一个生成树,然后求这个的直径,割边-直径即是答案 因为有的图上可能有重边,这样不好处理.我们记录每条边的标号( ...