IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 通过WindowManager添加可移动的全局悬浮窗 -> 正文阅读

[移动开发]通过WindowManager添加可移动的全局悬浮窗

一、获取悬浮窗权限。

? ? ? ? 1.在android6.0之前想要用WindowManager是不需要动态申请权限的,只需要静态写入清单文件:android.permission.SYSTEM_ALTER_WINDOW 即可。
? ? ? ? 2.动态跳转到系统权限申请页面:

if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){
? ? ? ? ? ? if(!Settings.canDrawOverlays(this)){
? ? ? ? ? ? ? ? Intent permission = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
? ? ? ? ? ? ? ? permission.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
? ? ? ? ? ? ? ? startActivityForResult(permission,1);
? ? ? ? ? ? }
?}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    //此处加入权限的相关判断...
}

二、设置相关Flag并添加悬浮的View。

   WindowManager windowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
   windowParams = new WindowManager.LayoutParams(WRAP_CONTENT, WRAP_CONTENT);
   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        windowParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
   } else {
        windowParams.type = WindowManager.LayoutParams.TYPE_PHONE;
   }
   windowParams.flags = WindowManager.LayoutParams.FLAG_FULLSCREEN
                | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                | WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS
                | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                | View.SYSTEM_UI_FLAG_FULLSCREEN
                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
   windowParams.format = PixelFormat.RGBA_8888;
   windowParams.x = point.x;
   windowParams.y = point.y;
   windowManager.addView(view, windowParams);

?三、设置View的onTouch。

//设置可以拖拽的区域(也可以设置整个屏幕区域)
Rect rect = new Rect();
rect.left = 0;
rect.right = 1280;
rect.top = 0;
rect.bottom = 720;
//如果想要沉浸式,那么需要获取状态栏的高度
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
int statusBarHeight = getResources().getDimensionPixelSize(resourceId);
因为windowParams的x和y值指的是悬浮窗中心的位置,所以View也要按照控件中心点进行计算。
int viewWidth = view.getWidth() / 2;
int viewHeight = view.getHeight() / 2;
//对WindowManeger里面的view进行设置OnTouch监听。
view.setOnTouchListener(new View.OnTouchListener() {

	@Override
	public boolean onTouch(View v, MotionEvent event) {
		float lastX = 0;
		float lastY = 0;
		switch (event.getAction() & MotionEvent.ACTION_MASK) {
			case MotionEvent.ACTION_DOWN:
				lastX = event.getRawX();
				lastY = event.getRawY();
				break;
			case MotionEvent.ACTION_MOVE:
				float rawX = event.getRawX();
				float rawY = event.getRawY();
                //进行横向边缘检测,以防止越界
				if (rawX < rect.left + width) {
					rawX = rect.left + width;
				} else if (rawX > rect.right - width) {
					rawX = rect.right - width;
				}
                //进行纵向边缘检测,以防止越界
				if (rawY < rect.top + height) {
					rawY = rect.top + height - statusBarHeight;
				} else if (rawY > rect.bottom - height) {
					rawY = rect.bottom - height;
				}
				windowParams.x = (int) (rawX - lastX) - width;
                //如果需要沉浸式则需要减去状态栏的高度
                //windowParams.y = (int) (rawY - lastY) - height - statusBarHeight;
				windowParams.y = (int) (rawY - lastY) - height;
				windowManager.updateViewLayout(view, windowParams);
				break;
		}
		return false;
	}
   });

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-11-25 08:13:48  更:2021-11-25 08:16:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:59:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码