博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 悬浮窗 Demo
阅读量:4147 次
发布时间:2019-05-25

本文共 2739 字,大约阅读时间需要 9 分钟。

1.创建悬浮窗和显示

private void showFloatWindow() {        mResultTv = new TextView(mContext);        mResultTv.setBackgroundColor(mContext.getColor(R.color.float_bg));        mResultTv.setTextColor(mContext.getColor(R.color.white));        mResultTv.setOnTouchListener(new View.OnTouchListener() {            int lastX = 0;            int lastY = 0;            int paramX = 0;            int paramY = 0;            @Override            public boolean onTouch(View view, MotionEvent motionEvent) {                switch (motionEvent.getAction()) {                    case MotionEvent.ACTION_DOWN:                        lastX = (int) motionEvent.getRawX();                        lastY = (int) motionEvent.getRawY();                        paramX = mParams.x;                        paramY = mParams.y;                        break;                    case MotionEvent.ACTION_MOVE:                        int dx = (int) motionEvent.getRawX() - lastX;                        int dy = (int) motionEvent.getRawY() - lastY;                        mParams.x = paramX + dx;                        mParams.y = paramY + dy;                        // update float window                        mWm.updateViewLayout(mResultTv, mParams);                        break;                }                return true;            }        });        mParams = new WindowManager.LayoutParams();        mParams.width = WindowManager.LayoutParams.WRAP_CONTENT;        mParams.height = WindowManager.LayoutParams.WRAP_CONTENT;        // 悬浮窗的核心        mParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;        // 设置浮动窗口不可聚焦(实现操作除浮动窗口外的其他可见窗口的操作)        mParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL                | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;        mParams.format = PixelFormat.TRANSPARENT;        mWm.addView(mResultTv, mParams);    }

2.隐藏悬浮窗

private void hideFloatWindow() {        mWm.removeView(mResultTv);    }

3.权限判断和添加

AndroidManifest.xml

//判断权限    private boolean isCanDrawOverlays(Context context) {        Boolean result = true;        if (Build.VERSION.SDK_INT >= 23) {            try {                Class clazz = Settings.class;                Method canDrawOverlays = clazz.getDeclaredMethod("canDrawOverlays", Context.class);                result = (Boolean) canDrawOverlays.invoke(null, context);            } catch (Exception e) {                e.printStackTrace();            }        }        return result;    }    //申请权限    private void requestAlertWindowPermission() {        Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);        intent.setData(Uri.parse("package:" + mContext.getPackageName()));        startActivityForResult(intent, REQUEST_CODE);    }

4.UI 效果

悬浮窗

5.完整源码下载

你可能感兴趣的文章
《融入动画技术的交互应用》主题博文推荐
查看>>
链睿和家乐福合作推出下一代零售业隐私保护技术
查看>>
Unifrax宣布新建SiFAB™生产线
查看>>
艾默生纪念谷轮™在空调和制冷领域的百年创新成就
查看>>
NEXO代币持有者获得20,428,359.89美元股息
查看>>
Piper Sandler为EverArc收购Perimeter Solutions提供咨询服务
查看>>
RMRK筹集600万美元,用于在Polkadot上建立先进的NFT系统标准
查看>>
JavaSE_day14 集合中的Map集合_键值映射关系
查看>>
异常 Java学习Day_15
查看>>
Mysql初始化的命令
查看>>
MySQL关键字的些许问题
查看>>
浅谈HTML
查看>>
css基础
查看>>
Servlet进阶和JSP基础
查看>>
servlet中的cookie和session
查看>>
过滤器及JSP九大隐式对象
查看>>
软件(项目)的分层
查看>>
菜单树
查看>>
【Python】学习笔记——-6.2、使用第三方模块
查看>>
【Python】学习笔记——-7.0、面向对象编程
查看>>