当前位置: 首页 > news >正文

【Android】创建一个可以在屏幕上拖动的悬浮窗

项目需求

在界面上创建一个悬浮窗,可以自由的移动这个悬浮窗

需求解决

1.添加权限

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

2.请求权限
从 Android 6.0 (API 23) 开始,应用需要动态请求显示悬浮窗的权限。例如,可以在 MainActivity 中请求权限:

public class MainActivity extends AppCompatActivity {private static final int OVERLAY_PERMISSION_REQUEST_CODE = 1234;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {if (!Settings.canDrawOverlays(this)) {Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,Uri.parse("package:" + getPackageName()));startActivityForResult(intent, OVERLAY_PERMISSION_REQUEST_CODE);} else {// 权限已经授予,启动悬浮窗服务startFloatingWindowService();}} else {// 系统版本低于6.0,不需要请求权限,直接启动悬浮窗服务startFloatingWindowService();}}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == OVERLAY_PERMISSION_REQUEST_CODE) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {if (Settings.canDrawOverlays(this)) {// 权限授予,启动悬浮窗服务startFloatingWindowService();} else {// 权限未授予,提示用户// TODO: 处理权限未授予情况}}}}private void startFloatingWindowService() {Intent intent = new Intent(MainActivity.this, FloatingWindowService.class);startService(intent);}
}
  1. 创建悬浮窗服务
    实现一个服务(FloatingWindowService),它将负责创建和管理悬浮窗视图。
public class FloatingWindowService extends Service {private WindowManager windowManager;private View floatingView;public FloatingWindowService() {}@Nullable@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onCreate() {super.onCreate();windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);floatingView = inflater.inflate(R.layout.floating_window, null);final WindowManager.LayoutParams params = new WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT,WindowManager.LayoutParams.WRAP_CONTENT,WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,PixelFormat.TRANSLUCENT);// 初始位置params.x = 0;params.y = 0;windowManager.addView(floatingView, params);// 使悬浮窗可拖动floatingView.setOnTouchListener(new View.OnTouchListener() {private int initialX;private int initialY;private float initialTouchX;private float initialTouchY;@Overridepublic boolean onTouch(View v, MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:initialX = params.x;initialY = params.y;initialTouchX = event.getRawX();initialTouchY = event.getRawY();return true;case MotionEvent.ACTION_MOVE:params.x = initialX + (int) (event.getRawX() - initialTouchX);params.y = initialY + (int) (event.getRawY() - initialTouchY);windowManager.updateViewLayout(floatingView, params);return true;}return false;}});}@Overridepublic void onDestroy() {super.onDestroy();if (floatingView != null) windowManager.removeView(floatingView);}
}
  1. 创建悬浮窗布局
    在 res/layout 目录下创建一个名为 floating_window.xml 的布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="#80000000"android:orientation="vertical"android:padding="10dp"><TextViewandroid:id="@+id/textView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="CSDN -> 我又来搬代码了"android:textColor="#FFFFFF" /></LinearLayout>

注意:要记得在注册清单文件注册服务

        <serviceandroid:name=".service.FloatingWindowService"android:enabled="true"android:exported="true" />

实现效果
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
这个可以随意拖动。

http://www.lryc.cn/news/389136.html

相关文章:

  • SPI NAND、SD NAND和eMMC对比—MK米客方德
  • “深入解析:YUM仓库、RPM包与源码编译——Linux软件安装方式全面对比“
  • 中电金信:银行业私有云何去何从
  • Adobe Acrobat Pro或者Adobe Acrobat Reader取消多标签页显示,设置打开一个pdf文件对应一个窗口。
  • 从0开始学习pyspark--pyspark的数据读取[第4节]
  • 极速升级:MacOS系统中Pip源的切换指南
  • 服务器的分类,主流服务器的应用场景
  • Objects and Classes (对象和类)
  • 从单点到全景:视频汇聚/安防监控EasyCVR全景视频监控技术的演进之路
  • Java学习 -Golang开发环境+目录结构+编译+部署
  • Redis 典型应用——缓存(缓存预热,穿透,雪崩,击穿)
  • Sharding-JDBC分库分表的基本使用
  • 7月信用卡新规下:信用卡欠的钱不用还了?
  • 坑——python的redis库的decode_responses设置
  • 从项目中学习Bus-Off的快慢恢复
  • 视频参考帧和重构帧复用
  • js修改scss变量
  • 【中霖教育怎么样】报考注册会计师有年龄限制吗?
  • PHP验证日本手机电话号码
  • Qt 配置ASan
  • MySQL常用操作命令大全
  • 有人物联的串口服务器USR-TCP232-410S基本测试通信和使用方案(485串口和232串口)
  • 二维码登录的原理
  • 归并排序详解(递归与非递归)
  • 计算机系统基础(二)
  • vue根据文字长短展示跑马灯效果
  • leetcode-21-回溯-全排列及其去重
  • 如何根据两个关键字查询报错日志的位置
  • 短视频预算表:成都柏煜文化传媒有限公司
  • 【Llama 2的使用方法】