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

第一步:认识WindowManager

l  这个接口用于与 window manager (窗口管理器, 应用框架层) 进行交互。

l  通过getSystemService(Context.WINDOW_SERVICE)可以获取到WM的实例.

l  继承关系

public interface WindowManager implements ViewManager

l  所属包

android.view.WindowManager

l  重要方法

addView()             添加view

removeView()          删除view

updateViewLayout ()     改变view的参数

  Window Manager Service 是全局的,是唯一的。 它将用户的操作,翻译成为指令,发送给呈现在界面上的各个Window。Activity会将顶级的控件注册到 Window Manager 中,当用户真是触碰屏幕或键盘的时候,Window Manager就会通知到,而当控件有一些请求产生,也会经由ViewParent送回到Window Manager中。从而完成整个通信流程

第二步:重写ImageView 的onTouchEvent方法

上一步我们知道了 WindowManager可以添加,删除,改变view,那么想要实现悬浮窗的拖动效果我们就要获取ImageView的坐标位置。

l  获取相对屏幕的坐标,即以屏幕左上角为原点

float  x = event.getRawX();

float  y = event.getRawY()-25;   //25是系统状态栏的高度

l  通过WindowManager.LayoutParams wmParams 设置 x ,y

  wmParams.x=(int)( x-mTouchStartX);

wmParams.y=(int) (y-mTouchStartY);

l  再通过updateViewLayout()方法设置悬浮窗的当前位置

第三步:加入权限

  在AndroidManifest.xml中加入如下的权限:

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

  效果如下:

  重要代码 :   创建 MyApplication

import android.app.Application;
import android.view.WindowManager;public class MyApplication extends Application {/*** 创建全局变量* 注意在AndroidManifest.xml中的Application节点添加android:name=".MyApplication"属性**/private WindowManager.LayoutParams wmParams=new WindowManager.LayoutParams();public WindowManager.LayoutParams getMywmParams(){return wmParams;}
}

  创建自定义View 继承ImageView

import android.content.Context;
import android.util.Log;
import android.view.MotionEvent;
import android.view.WindowManager;
import android.widget.ImageView;public class MyFloatView extends ImageView {private float mTouchStartX;private float mTouchStartY;private float x;private float y;private WindowManager wm=(WindowManager)getContext().getApplicationContext().getSystemService(Context.WINDOW_SERVICE);//此wmParams为获取的全局变量,用以保存悬浮窗口的属性private WindowManager.LayoutParams wmParams = ((MyApplication)getContext().getApplicationContext()).getMywmParams();public MyFloatView(Context context) {super(context);// TODO Auto-generated constructor stub
    }@Overridepublic boolean onTouchEvent(MotionEvent event) {//获取相对屏幕的坐标,即以屏幕左上角为原点x = event.getRawX();y = event.getRawY()-25;   //25是系统状态栏的高度Log.i("currP", "currX"+x+"====currY"+y);switch (event.getAction()) {case MotionEvent.ACTION_DOWN://获取相对View的坐标,即以此View左上角为原点mTouchStartX =  event.getX();mTouchStartY =  event.getY();break;case MotionEvent.ACTION_MOVE:updateViewPosition();break;case MotionEvent.ACTION_UP:updateViewPosition();mTouchStartX=mTouchStartY=0;break;}return true;}private void updateViewPosition(){//更新浮动窗口位置参数wmParams.x=(int)( x-mTouchStartX);wmParams.y=(int) (y-mTouchStartY);wm.updateViewLayout(this, wmParams);}}

  创建Activity

import android.app.Activity;import android.content.Context;
import android.graphics.PixelFormat;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.view.WindowManager.LayoutParams;public class MyFloatViewActivity extends Activity{private WindowManager wm=null;private WindowManager.LayoutParams wmParams=null;private MyFloatView myFV=null;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);//创建悬浮窗口
        createView();}private void createView(){myFV=new MyFloatView(getApplicationContext());myFV.setImageResource(R.drawable.angry_birds);//获取WindowManagerwm=(WindowManager)getApplicationContext().getSystemService(Context.WINDOW_SERVICE);//设置LayoutParams(全局变量)相关参数wmParams = ((MyApplication)getApplication()).getMywmParams();wmParams.type=LayoutParams.TYPE_PHONE;   //设置window typewmParams.format=PixelFormat.RGBA_8888;   //设置图片格式,效果为背景透明//设置Window flagwmParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL| LayoutParams.FLAG_NOT_FOCUSABLE;wmParams.gravity=Gravity.LEFT|Gravity.TOP;   //调整悬浮窗口至左上角//以屏幕左上角为原点,设置x、y初始值wmParams.x=0;wmParams.y=0;//设置悬浮窗口长宽数据wmParams.width=40;wmParams.height=40;//显示myFloatView图像
        wm.addView(myFV, wmParams);}@Overridepublic void onDestroy(){super.onDestroy();//在程序退出(Activity销毁)时销毁悬浮窗口
        wm.removeView(myFV);}
}

  l  最后在程序安装时修改手机里的程序权限-》悬浮窗可用

作者:杰瑞教育
出处:http://www.cnblogs.com/jerehedu/ 
版权声明:本文版权归烟台杰瑞教育科技有限公司和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
技术咨询:

转载于:https://www.cnblogs.com/jerehedu/p/4981188.html

Android WindowManager实现悬浮窗效果 (一)——与当前Activity绑定相关推荐

  1. Android开发之仿360手机卫士悬浮窗效果

    基本的实现原理,这种桌面悬浮窗的效果很类似与Widget,但是它比Widget要灵活的多.主要是通过WindowManager这个类来实现的,调用这个类的addView方法用于添加一个悬浮窗,upda ...

  2. Android 悬浮窗功能实现(微信语音通话悬浮窗效果实现)

    目录 1.基本介绍 2.代码示例 3.实现效果及便捷工具类 4.仿微信语音通话悬浮窗效果实现 4.1 需求分析及效果展示 4.2 实现 5.最后 1.基本介绍 Android 界面绘制都是通过 Win ...

  3. Android全屏悬浮窗画布,使用WindowManager实现Android悬浮窗

    WindowManager介绍 通过Context.getSystemService(Context.WINDOW_SERVICE)可以获得 WindowManager对象. 每一个WindowMan ...

  4. android 微信缩小通话界面_Android 悬浮窗功能实现(微信语音通话悬浮窗效果实现)...

    1.基本介绍 Android 界面绘制都是通过 WindowManager 对象可通过获取 WINDOW_SERVICE 系统服务得到,并因为 WindowManager 继承于 ViewManage ...

  5. android 微信浮窗实现_Android仿微信视屏悬浮窗效果

    在项目中需要对接入的腾讯云音视频,可以悬浮窗显示,悬浮窗可拖拽,并且在悬浮窗不影响其他的activity的焦点. 这个大神的文章Android基于腾讯云实时音视频仿微信视频通话最小化悬浮,他讲的是视频 ...

  6. android仿照360壁纸照片显示特效,Android仿360桌面手机卫士悬浮窗效果

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

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

    转载自:http://blog.csdn.net/guolin_blog/article/details/8689140 大家好,今天给大家带来一个仿360手机卫士悬浮窗效果的教程,在开始之前请允许我 ...

  8. android 仿微信来电_Android 悬浮窗功能实现(微信语音通话悬浮窗效果实现)

    目录 1.基本介绍 2.代码示例 3.实现效果及便捷工具类 4.仿微信语音通话悬浮窗效果实现 4.1 需求分析及效果展示 4.2 实现 5.最后 1.基本介绍 Android 界面绘制都是通过 Win ...

  9. Android开发之仿手机卫士悬浮窗效果

    基本的实现原理,这种桌面悬浮窗的效果很类似与Widget,但是它比Widget要灵活的多.主要是通过WindowManager这个类来实现的,调用这个类的addView方法用于添加一个悬浮窗,upda ...

最新文章

  1. 科普大V河森堡:用科学的方法回答哲学问题
  2. 【Python】 linecache模块读取文件
  3. Windows:利用各种小工具查看自己电脑上的CPUGPU型号、个数、详细参数等不同方法的详细攻略
  4. [转] 更新Flash CS6发布设置的目标播放器版本
  5. Leetcode--169. 求众数
  6. 我的学习网址(未完)
  7. Halcon 找圆测量工具
  8. 项目管理之WBS工作分解结构法
  9. 计算机硬盘驱动器可以存软件吗,如何从计算机硬盘驱动器恢复数据
  10. 用计算机绘制机械图样,机械制图教程—1-5绘图方法和步骤
  11. 【重要通知】结构设计新班开课——本轮主讲电动牙刷产品结构设计
  12. 最新的省市区三级地区MySQL数据库,附带获取方法
  13. android文件管理器——文件检索
  14. 小米平板刷机shell怎么退_小米平板2win10版刷miui出现shell怎么办
  15. Python之禅——个人翻译
  16. 21.BOM的理解,常见的BOM对象你了解哪些?
  17. sql语句,sql文件加注释
  18. window10鼠标加速怎么关_鼠标加速怎么关闭_电脑鼠标加速如何关闭
  19. 大数据平台下的数据治理
  20. c罗说什么语言,C罗会说几种语言? 揭金球奖给梅西内马尔当翻译趣事

热门文章

  1. 高通最强芯片855发布!AI性能比华为苹果翻倍,商用5G,标配屏下指纹
  2. 斯坦福DAWNBench最新训练排名!华为云ModelArts用时10分28秒获全球最快
  3. Waymo无人车,每天能绕地球一圈
  4. 1亿中国人已被AI批改过作业
  5. 两日公开课:伯克利深度强化学习训练营 | 视频+PPT
  6. 使用idea导入文件夹作为项目时,在项目中的文件夹可能会被隐藏
  7. Oracle迁移到MySQL性能下降的注意点
  8. linux 基础学习之常用命令
  9. bash快捷键(防忘)
  10. 湖南卫视小年夜春晚-2013湖南卫视小年夜直播【直播视频现场高清完整版____