下面的App程序代码实现通过主Activity的启动按钮,启动一个Service,然后在Service中创建添加悬浮窗口:(话不多说,直接上代码) 在这里我们先看一下需要创建的类和布局和需要添加的权限

在使用要获取CompatModeWrapper,首先得在应用程序的AndroidManifest.xml文件中添加权限

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

需要创建的类有:

   FloatWindowTest(Activity)
    FxService(class)(不用创建也可以,这里供参考使用,在本类中没有用到此类)
需要创建的布局有:

layout_item.xml

test_window_float.xml

在DrawAble下创建的xml有:

shape_background_dark.xml

效果:点击一个按钮  弹出一个悬浮框   并且悬浮框可以实现拖动效果

FloatWindowTest的代码如下:
import android.app.Activity;
import android.graphics.PixelFormat;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;import activity.main.qixin.com.xinqingofqian.R;public class FloatWindowTest extends Activity implements View.OnClickListener {/*** Called when the activity is first created.*/WindowManager mWindowManager;WindowManager.LayoutParams wmParams;LinearLayout mFloatLayout;TextView mFloatView;private Button start_Btn;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.test_window_float);//初始化控件initView();}private void createFloatView() {//获取LayoutParams对象wmParams = new WindowManager.LayoutParams();//获取的是LocalWindowManager对象mWindowManager = this.getWindowManager();//设置window typewmParams.type = WindowManager.LayoutParams.TYPE_PHONE;//设置图片格式,效果为背景透明wmParams.format = PixelFormat.RGBA_8888;//设置浮动窗口不可聚焦(实现操作除浮动窗口外的其他可见窗口的操作)wmParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;//调整悬浮窗显示的停靠位置为左侧置顶wmParams.gravity = Gravity.LEFT | Gravity.TOP;// 以屏幕左上角为原点,设置x、y初始值,相对于gravitywmParams.x = 0;wmParams.y = 0;//设置悬浮窗口长宽数据wmParams.width = WindowManager.LayoutParams.WRAP_CONTENT;wmParams.height = WindowManager.LayoutParams.WRAP_CONTENT;/*// 设置悬浮窗口长宽数据wmParams.width = 200;wmParams.height = 80;*/LayoutInflater inflater = this.getLayoutInflater();//获取浮动窗口视图所在布局mFloatLayout = (LinearLayout) inflater.inflate(R.layout.layout_item, null);//浮动窗口按钮mFloatView = mFloatLayout.findViewById(R.id.float_id);//添加mFloatLayoutmWindowManager.addView(mFloatLayout, wmParams);//绑定触摸移动监听mFloatView.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {// TODO Auto-generated method stubwmParams.x = (int) event.getRawX() - mFloatLayout.getWidth() / 2;//25为状态栏高度wmParams.y = (int) event.getRawY() - mFloatLayout.getHeight() / 2 - 40;mWindowManager.updateViewLayout(mFloatLayout, wmParams);return false;}});//悬浮框设置点击监听mFloatView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubToast.makeText(FloatWindowTest.this, "我是悬浮框", Toast.LENGTH_SHORT).show();}});}private void initView() {start_Btn = (Button) findViewById(R.id.start_id);start_Btn.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.start_id:if (null == mWindowManager) {createFloatView();}break;}}@Overridepublic void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();if (mFloatLayout != null) {//移除悬浮窗口mWindowManager.removeView(mFloatLayout);}}
}
FxService的代码如下:
import android.app.Service;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.Toast;import activity.main.qixin.com.xinqingofqian.R;public class FxService extends Service {//定义浮动窗口布局LinearLayout mFloatLayout;WindowManager.LayoutParams wmParams;//创建浮动窗口设置布局参数的对象WindowManager mWindowManager;Button mFloatView;private static final String TAG = "FxService";@Overridepublic void onCreate() {// TODO Auto-generated method stubsuper.onCreate();Log.i(TAG, "oncreat");createFloatView();}@Nullable@Overridepublic IBinder onBind(Intent intent) {return null;}private void createFloatView() {wmParams = new WindowManager.LayoutParams();//获取的是WindowManagerImpl.CompatModeWrappermWindowManager = (WindowManager) getApplication().getSystemService(getApplication().WINDOW_SERVICE);Log.i(TAG, "mWindowManager--->" + mWindowManager);//设置window typewmParams.type = WindowManager.LayoutParams.TYPE_PHONE;//设置图片格式,效果为背景透明wmParams.format = PixelFormat.RGBA_8888;//设置浮动窗口不可聚焦(实现操作除浮动窗口外的其他可见窗口的操作)wmParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;//调整悬浮窗显示的停靠位置为左侧置顶wmParams.gravity = Gravity.CENTER;// 以屏幕左上角为原点,设置x、y初始值,相对于gravitywmParams.x = 0;wmParams.y = 0;//设置悬浮窗口长宽数据wmParams.width = WindowManager.LayoutParams.WRAP_CONTENT;wmParams.height = WindowManager.LayoutParams.WRAP_CONTENT;/*// 设置悬浮窗口长宽数据wmParams.width = 200;wmParams.height = 80;*/LayoutInflater inflater = LayoutInflater.from(getApplication());//获取浮动窗口视图所在布局mFloatLayout = (LinearLayout) inflater.inflate(R.layout.layout_item, null);//添加mFloatLayoutmWindowManager.addView(mFloatLayout, wmParams);//浮动窗口按钮mFloatView = (Button) mFloatLayout.findViewById(R.id.float_id);mFloatLayout.measure(View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));Log.i(TAG, "Width/2--->" + mFloatView.getMeasuredWidth() / 2);Log.i(TAG, "Height/2--->" + mFloatView.getMeasuredHeight() / 2);//设置监听浮动窗口的触摸移动mFloatView.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {// TODO Auto-generated method stub//getRawX是触摸位置相对于屏幕的坐标,getX是相对于按钮的坐标wmParams.x = (int) event.getRawX() - mFloatView.getMeasuredWidth() / 2;Log.i(TAG, "RawX" + event.getRawX());Log.i(TAG, "X" + event.getX());//减25为状态栏的高度wmParams.y = (int) event.getRawY() - mFloatView.getMeasuredHeight() / 2 - 25;Log.i(TAG, "RawY" + event.getRawY());Log.i(TAG, "Y" + event.getY());//刷新mWindowManager.updateViewLayout(mFloatLayout, wmParams);return false;  //此处必须返回false,否则OnClickListener获取不到监听}});mFloatView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubToast.makeText(FxService.this, "onClick", Toast.LENGTH_SHORT).show();}});}@Overridepublic void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();if (mFloatLayout != null) {//移除悬浮窗口mWindowManager.removeView(mFloatLayout);}}}

layout_item.xml的代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:id="@+id/float_id"android:layout_width="wrap_content"android:layout_height="50dp"android:layout_margin="10dp"android:padding="10dp"android:background="@drawable/shape_background_dark"android:gravity="center"android:text="你好,再见!"android:textColor="#ffffff"android:textSize="20sp" />
</LinearLayout>

test_window_float.xml的代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><Buttonandroid:id="@+id/start_id"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="添加悬浮框" />
</LinearLayout>

shape_background_dark.xml的代码如下:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"><solid android:color="#666666" /><corners android:radius="40dp" />
</shape>

这里的悬浮框是可以随便拖动的

May everyone be happy every day and everything go well!

本文相关的完整代码下载链接: http://download.csdn.net/detail/stevenhu_223/4996970

用WindowManager实现Android悬浮框以及拖动事件相关推荐

  1. WindowManager解析(二)Android悬浮框无法弹出输入法的原因和无需权限显示悬浮窗

    Android悬浮框无法弹出输入法 最近要研究悬浮窗方面的东西,遇到一个问题,我的悬浮窗里面有一个输入框,但是不弹出输入法,后来找到一个方法: 在WindowManager的实例获取方式不对,之前是这 ...

  2. Android悬浮框实践

    1.常见悬浮框显示样式示例及应用场景 现在很多的应用都在使用悬浮框,例如微信视频,点击Home键以后,微信视频窗口一直停留在桌面上,小米手机屏幕上的快捷键(Home,锁屏...)等,那么我们今天将实现 ...

  3. Android 悬浮框按钮

    示例: 悬浮框的xml代码:(layout_float.xml) <?xml version="1.0" encoding="utf-8"?> &l ...

  4. android悬浮框横竖屏切换,Activity如何管理对话框(横竖屏切换保持对话框的最佳办法)...

    在Activity中我们要保持横竖屏切换时用户的数据一般是用onSaveinstancestate的方式,dialog也是可以的,但是有更好的方法,Activity专门对dialog提供了自己的管理机 ...

  5. android 浮动文字提示,怎么在Android中实现一个自由拖动并显示文字的悬浮框

    怎么在Android中实现一个自由拖动并显示文字的悬浮框 发布时间:2021-01-27 15:34:05 来源:亿速云 阅读:107 作者:Leah 今天就跟大家聊聊有关怎么在Android中实现一 ...

  6. mouseleave mouseout时候悬浮框不应该消失的时候消失了 css 解决办法

    要实现的效果和代码思路 简单来说就是 用一个div包着喇叭和悬浮框 悬浮事件写在这个div上 鼠标悬浮到div上的时候 悬浮框出现 最终要做成鼠标从小喇叭移动到下面的框上的时候 下面框是不会消失的. ...

  7. Android中的Window、WindowManager以及悬浮框视频播放的实现

    摘要:近日看公司直播项目,其中有一个功能就是退出某房间之后,直播界面会以悬浮窗的形式出现,并且可以拖动悬浮窗到界面中任意位置,点击悬浮框之后,又可以回到房间中继续观看直播.现在这个功能在主流的直播或者 ...

  8. android之桌面悬浮框

    类似360 的那个小球,一直悬浮在手机桌面上,点击时跳转其他界面 APK:http://fir.im/uraq 先说一下这个APK,为什么要说呢,因为安装完看不见图标,然后你会发现什么都没有,先去应用 ...

  9. Android UI开发第十四篇——可以移动的悬浮框

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

最新文章

  1. BindingException异常第一种解决办法
  2. 基于Jquery+Ajax+Json+高效分页
  3. MATLAB实战系列(二十九)-头脑风暴优化(BSO)算法求解旅行商问题(TSP)-交叉算子
  4. ios::sync_with_stdio();
  5. React-navigation之StackNavigator
  6. 缓存行cache line概述
  7. 【渝粤教育】电大中专消费者行为学30分钟交卷作业 题库
  8. python xml
  9. 媒体播放器的状态 winform
  10. Js/Jquery获取input file的文件名
  11. python pos函数_从0入门Python — 4. 函数
  12. Linux开发板烧录实验
  13. 小程序30分钟倒计时
  14. python平均分及格率优秀率_跪求:请问怎样统计均分、优秀率、及格率、低分率的问题...
  15. 串口协议和RS-232标准,RS232电平与TTL电平的区别,以及USB/TTL转232“模块(CH340芯片为例)的工作原理
  16. Android 自定义控件浅谈
  17. VMware 8安装Mac OS X 10.7 Lion
  18. sql的null对求和的影响
  19. Anaconda3+python3.7成功安装dlib-19.19.0库(稀里糊涂)
  20. 抖音浏览量的作用是什么?

热门文章

  1. tensorflow量化感知训练_tensorflow模型量化实例
  2. java执行python路径_java调用其它语言脚本(python、js)
  3. QuartusII联合modelsim仿真时调用两个模块如何设置
  4. dex运行linux,随着三星最新的DeX更新,更多的手机可以使用Linux
  5. 返回值被忽略_《Jenkins Tips 001》 忽略 Shell 步骤中的故障
  6. modbus报文解析实例_云原生、全栈可编程的下一代SDN解析与实践 (一)丨传统SDN架构演进...
  7. vb6 设计模式 mscomm该部件的许可证信息没有找到_廊坊人脸识别系统报价,塔机黑匣子,供求信息...
  8. 选择题微型计算机系统包括,全国计算机一级选择题专项训练及答案2016
  9. react 动态修改路由_reactjs – 如何动态添加重定向到反应路由器?
  10. python实现矢量分级渲染_OpenLayer3实现分级渲染(初级版本)