
不废话,四步走:
1、首先要声明悬浮窗口权限:<uses-permission androID:name="androID.permission.SYstem_ALERT_WINDOW" /><uses-permission androID:name="androID.permission.SYstem_OVERLAY_WINDOW"/>2、引导用户打开悬浮窗权限:if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (!Settings.canDrawOverlays(this)) { showTip("请先打开悬浮窗权限"); startActivityForResult(new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackagename())), 0); } else { //有权限了,可以用service或者直接用第三步开启悬浮窗 }}3、初始化悬浮窗:private voID initfloatingWindow() { if (Settings.canDrawOverlays(this)) { // 获取WindowManager服务 windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); //floatVIEw为自定义的悬浮窗控件,亦可使用button、ImageVIEw之类的控件 floatVIEw = new floatVIEw(getApplicationContext()); // 设置LayoutParam layoutParams = new WindowManager.LayoutParams(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { layoutParams.type = WindowManager.LayoutParams.TYPE_APPliCATION_OVERLAY; } else { layoutParams.type = WindowManager.LayoutParams.TYPE_PHONE; } // 实现悬浮窗可以移动的属性(把这个值改成其他值可以 *** 作悬浮窗底下的内容) layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_touch_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; layoutParams.format = PixelFormat.transparent; layoutParams.wIDth = WindowManager.LayoutParams.WRAP_CONTENT; layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT; layoutParams.gravity = Gravity.CENTER; layoutParams.x = 0; layoutParams.y = 0; //todo //对你的悬浮窗做一些点击或移动事件的处理 }}layoutParams.flags的值选择参考:https://www.jianshu.com/p/c91448e1c7d14、显示和隐藏悬浮窗:
//显示悬浮窗(添加悬浮窗控件)windowManager.addVIEw(floatVIEw, layoutParams);//隐藏悬浮窗(移除悬浮窗控件)windowManager.removeVIEw(floatVIEw);//更新悬浮窗控件布局(对悬浮窗做修改之后调用)windowManager.updateVIEwLayout(floatVIEw, layoutParams); 至于悬浮控件的移动,悬浮窗控件设置一个OntouchListener事件:floatVIEw.setontouchListener(new VIEw.OntouchListener() { private int x; private int y; @OverrIDe public boolean ontouch(VIEw vIEw, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: x = (int) event.getRawX(); y = (int) event.getRawY(); break; case MotionEvent.ACTION_MOVE: int NowX = (int) event.getRawX(); int NowY = (int) event.getRawY(); int movedX = NowX - x; int movedY = NowY - y; x = NowX; y = NowY; layoutParams.x = layoutParams.x + movedX; layoutParams.y = layoutParams.y + movedY; // 更新悬浮窗控件布局 windowManager.updateVIEwLayout(floatVIEw, layoutParams); break; default: break; } return false; } });但是这样实现的却是整屏控制悬浮窗的移动,并不能很好的实现在悬浮窗上面拖动的效果,这个我还得再研究研究,也望各位大佬指点指点。 完。总结
以上是内存溢出为你收集整理的Android利用WindowManager实现悬浮窗全部内容,希望文章能够帮你解决Android利用WindowManager实现悬浮窗所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)