浮窗---创建系统浮窗(可拖动)

目录​​​​​​​

一、效果展示

二、代码实现

1、添加权限,动态申请权限

2、创建windowManager服务、windowManager Params配置项

3、动态加载view,添加到windowManager中


一、效果展示

创建系统浮窗可拖动

二、代码实现

1、添加权限,动态申请权限

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
/**
     * 判断当前是否有悬浮窗权限,有则显示浮窗,否则动态申请权限
     */
    private void buildSystemFloating() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (!Settings.canDrawOverlays(this)) {
                startActivityForResult(new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION
                        , Uri.parse("package:" + getPackageName())), OVERLAY_PERMISSION_REQUEST_CODE);
            } else {
                SystemFloatingManager.buildSystemFloatingWindow(getApplicationContext(), TEST_SYSTEM_FLOATING);
            }
        }
    }

2、创建windowManager服务、windowManager Params配置项

   权限申请成功后创建系统浮窗(创建及其显示隐藏的控制放在一个单独的manager里面),获取WindowManager的实例,创建WindowManager.LayoutParams的实例并配置其参数

   WindowManager参数详情https://developer.android.com/reference/android/view/WindowManager.LayoutParams

WindowManager windowManager = (WindowManager) applicationContext.getSystemService(Context.WINDOW_SERVICE);
        if (windowManager == null) {
            Log.e(TAG, "buildSystemFloatingWindow but windowManager is null");
            return;
        }
        WindowManager.LayoutParams 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 = 300;
        layoutParams.height = 300;
        layoutParams.x = 150;
        layoutParams.y = 150;

3、动态加载view,添加到windowManager中

View view = LayoutInflater.from(applicationContext).inflate(R.layout.layout_simple_floating, null);
        if (view == null) {
            Log.e(TAG, "buildSystemFloatingWindow but view is null");
            return;
        }
        view.setOnTouchListener(new FloatingTouchListener(windowManager, layoutParams, new FloatingTouchListener.IFloatingDragListener() {
            @Override
            public void onFloatingClick() {
                Toast.makeText(applicationContext, "系统浮窗触发了点击事件", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onFloatingDrag() {
                Toast.makeText(applicationContext, "系统浮窗触发了滑动事件", Toast.LENGTH_SHORT).show();
            }
        }, true));

        windowManager.addView(view, layoutParams);

附上demo地址:SystemFloatingWinowDemo.zip_format=PixelFormat.TRANSPARENT-Android文档类资源-CSDN下载

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值