ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Android利用WindowManager实现悬浮窗

2019-09-05 12:40:22  阅读:263  来源: 互联网

标签:控件 悬浮 WindowManager layoutParams int Android LayoutParams


不废话,四步走:

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;
            }
        });

但是这样实现的却是整屏控制悬浮窗的移动,并不能很好的实现在悬浮窗上面拖动的效果,这个我还得再研究研究,也望各位大佬指点指点。

 

完。

 

标签:控件,悬浮,WindowManager,layoutParams,int,Android,LayoutParams
来源: https://blog.csdn.net/qq_35584878/article/details/100554542

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有