用过手机360和QQ手机管家等一些软件的朋友,会发现,在这些应用中,会出现一个悬浮窗体,例如QQ手机管家中打电话的场景:

这种窗体除了会显示外,还可以移动它的位置,并且一直显示。除了关闭当前程序外,窗口不会主动消失。其实,它的使用原理也很简单,就是借用了WindowManager这个管理类来实现的。
注意:要在AndroidManifest.xml中添加使用权限:

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

这里,我采用代码布局的方式,模仿了一下QQ这个界面效果:

import android.content.Context;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;public class DesktopLayout extends LinearLayout {public DesktopLayout(Context context) {super(context);setOrientation(LinearLayout.HORIZONTAL);LayoutParams mLayoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);setLayoutParams(mLayoutParams);// 显示的ICONImageView mImageView = new ImageView(context);mImageView.setImageResource(R.drawable.icon);addView(mImageView, mLayoutParams);// 显示的文字TextView mTextView = new TextView(context);mTextView.setText("Hello");mTextView.setTextSize(30);addView(mTextView, mLayoutParams);}
}

接下来,在activity中让它显示出来。首先要设置一下WindowManager.LayoutParams:

     // 取得系统窗体mWindowManager = (WindowManager) getApplicationContext().getSystemService("window");// 窗体的布局样式mLayoutParams = new WindowManager.LayoutParams();// 设置窗体显示类型——TYPE_SYSTEM_ALERT(系统提示)mLayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;// 设置窗体焦点及触摸:// FLAG_NOT_FOCUSABLE(不能获得按键输入焦点)mLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;// 设置显示的模式mLayoutParams.format = PixelFormat.RGBA_8888;// 设置对齐的方法mLayoutParams.gravity = Gravity.TOP | Gravity.LEFT;// 设置窗体宽度和高度mLayoutParams.width = WindowManager.LayoutParams.WRAP_CONTENT;mLayoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT;// 设置窗体显示的位置,否则在屏幕中心显示mLayoutParams.x = 50;mLayoutParams.y = 50;

显示窗体与关闭窗体的方法:

mWindowManager.addView(mDesktopLayout, mLayoutParams);mWindowManager.removeView(mDesktopLayout);

以下是activity的原代码,这里设计了一个双击关闭窗体的效果:

import android.app.Activity;
import android.graphics.PixelFormat;
import android.os.Bundle;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.WindowManager;
import android.widget.Button;public class DeskTip extends Activity {private WindowManager mWindowManager;private WindowManager.LayoutParams mLayoutParams;private DesktopLayout mDesktopLayout;private long starttime;/*** 创建悬浮窗体*/private void createDesktopLayout() {mDesktopLayout = new DesktopLayout(this);mDesktopLayout.setOnTouchListener(new OnTouchListener() {public boolean onTouch(View v, MotionEvent event) {onActionMove(event);return true;}});}/*** 设置WindowManager*/private void createWindowManager() {// 取得系统窗体mWindowManager = (WindowManager) getApplicationContext().getSystemService("window");// 窗体的布局样式mLayoutParams = new WindowManager.LayoutParams();// 设置窗体显示类型——TYPE_SYSTEM_ALERT(系统提示)mLayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;// 设置窗体焦点及触摸:// FLAG_NOT_FOCUSABLE(不能获得按键输入焦点)mLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;// 设置显示的模式mLayoutParams.format = PixelFormat.RGBA_8888;// 设置对齐的方法mLayoutParams.gravity = Gravity.TOP | Gravity.LEFT;// 设置窗体宽度和高度mLayoutParams.width = WindowManager.LayoutParams.WRAP_CONTENT;mLayoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT;// 设置窗体显示的位置,否则在屏幕中心显示mLayoutParams.x = 50;mLayoutParams.y = 50;}private void onActionMove(MotionEvent event) {if (event.getAction() == MotionEvent.ACTION_DOWN) {long end = System.currentTimeMillis() - starttime;// 双击的间隔在 200ms 到 500ms 之间if (end > 200 && end < 500) {closeDesk();return;}starttime = System.currentTimeMillis();}mLayoutParams.x = (int) (event.getRawX() - (mDesktopLayout.getWidth()));mLayoutParams.y = (int) (event.getRawY() - (mDesktopLayout.getHeight()));mWindowManager.updateViewLayout(mDesktopLayout, mLayoutParams);}/*** 显示DesktopLayout*/private void showDesk() {mWindowManager.addView(mDesktopLayout, mLayoutParams);finish();}/*** 关闭DesktopLayout*/private void closeDesk() {mWindowManager.removeView(mDesktopLayout);finish();}public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);createWindowManager();createDesktopLayout();Button btn = (Button) findViewById(R.id.btn);btn.setOnClickListener(new OnClickListener() {public void onClick(View v) {showDesk();}});}
}

显示的效果:

悬浮窗体例子

android编程之悬浮窗体相关推荐

  1. android 窗口监听按键,Android编程实现Dialog窗体监听的方法

    本文实例讲述了Android编程实现Dialog窗体监听的方法.分享给大家供大家参考,具体如下: 今天做了一个Dialong窗体监听包括窗体内的xml监听. 效果图: test.class代码 pac ...

  2. Android开发动态圆形浮动菜单按钮,Android编程:悬浮菜单按钮FloatingActionButton实例...

    Android编程:悬浮菜单按钮FloatingActionButton实例 环境: 主机:WIN10 开发环境:Android Studio 2.2 Preview 3 说明: 用第三方库Float ...

  3. 【Android Demo】悬浮窗体实现

    突然对悬浮窗体感兴趣,查资料做了个小Demo,效果是点击按钮后,关闭当前Activity,显示悬浮窗口,窗口可以拖动,双击后消失.效果图如下: 它的使用原理很简单,就是借用了WindowManager ...

  4. android 扇形菜单动画,Android编程:扇形展开的悬浮菜单按钮CircularFloatingActionMenu实例...

    Android编程:扇形展开的悬浮菜单按钮CircularFloatingActionMenu实例 环境: 主机:WIN10 开发环境:Android Studio 2.2 Preview 3 说明: ...

  5. android 自定义多tab悬浮控件,Android编程实现自定义Tab选项卡功能示例

    本文实例讲述了Android编程实现自定义Tab选项卡功能.分享给大家供大家参考,具体如下: import android.app.TabActivity; import android.conten ...

  6. android 初学者实现 popupwindow的自动弹出,Android popupWindow弹出窗体实现方法分析

    本文实例讲述了Android popupWindow弹出窗体实现方法.分享给大家供大家参考,具体如下: 1. 建立popupwindow显示的布局页面(普通的view任意布局) android:lay ...

  7. Android 编程实用代码大全

    转载:Android 编程实用代码大全 http://www.juapk.com/forum.php?mod=viewthread&tid=325&fromuid=263 1. 查看是 ...

  8. android 全局浮动球,Android仿360悬浮小球自定义view实现

    图片.png 图片.png 实现当前这种类似的效果 (360小球 悬浮桌面差不错类似).第一次接触到的童鞋就像我一样懵逼(研究过得童鞋,就知道,实现这种悬浮窗体,是需要添加悬浮窗 设置权限的,我会在下 ...

  9. android 名册源代码,Android编程中黑名单的实现方法

    本文实例讲述了Android编程中黑名单的实现方法.分享给大家供大家参考,具体如下: 说明:由于挂断电话android   api不是对外开放的,所以需要使用反射的方法得到拨打电话的服务. 1.将an ...

最新文章

  1. python自学流程-python 学习之 基础篇三 流程控制
  2. LVS(12)——sh
  3. 视觉注意力机制(上)
  4. 如何接触到最新的前端动态、最前沿的前端技术
  5. 团队项目讨论及计划修订版
  6. Spring入门系列之Spring概述
  7. Django实战1-权限管理功能实现-10:用户管理
  8. visio作图的一系列坑
  9. javascript手册安卓版_javascript手册
  10. nginx配置实现代理多个内网地址
  11. javac: 无效的标记
  12. 迪赛智慧数——其他图表(盒须图):员工离职率分析
  13. 实现企业战略目标从做好项目管理开始
  14. 美林投资时钟策略如何运用?
  15. 对于开发软件的NABCD分析
  16. 北斗星历星钟性能总结
  17. 六月,授你以鱼,再授你以渔
  18. ADVPT-C++复习准备
  19. dede获取上级栏目名称
  20. 孟岩:什么是通证(token),通证可以干什么?

热门文章

  1. 遗传算法中的BLX-α交叉操作
  2. Python 中ln(x)的表示
  3. 【线性模型引论】王松桂著 课后习题3.9参考答案
  4. 2023年清华大学-中国人民银行金融研究所联合培养项目招收公开招考博士研究生拟录取名单公示
  5. 如何自己制作CHM文件
  6. 【考研计算机操作系统】 强化笔记
  7. python编写ai电话_用Python编写一个国际象棋AI程序
  8. 加快ASP。NET Core WEB API应用程序。第3部分
  9. 应届毕业生、公务员面试题面试技巧
  10. 科大讯飞--C++开发工程师一面