Android利用WindowManager实现悬浮窗

Android利用WindowManager实现悬浮窗,第1张

概述不废话,四步走:1、首先要声明悬浮窗口权限:<uses-permissionandroid:name="android.permission.SYSTEM_ALERT_WINDOW"/><uses-permissionandroid:name="android.permission.SYSTEM_OVERLAY_WINDOW"/>2、引导用户打开悬浮窗权限:if(Build.VERSION.SDK_INT>=B

不废话,四步走:

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/c91448e1c7d1
 4、显示和隐藏悬浮窗:
//显示悬浮窗(添加悬浮窗控件)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实现悬浮窗所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1105042.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-28
下一篇2022-05-28

发表评论

登录后才能评论

评论列表(0条)

    保存