android悬浮窗气泡点击穿透事件

一个小众功能记录:新增气泡,拖动气泡,点击气泡事件传递到下层

文章底部附上demo

效果:

1、新建一个service,都在这里面实现

左侧悬浮窗:

private void setFloatWinow() {
    floatingView = LayoutInflater.from(this).inflate(R.layout.floating_window, null);
    windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            Build.VERSION.SDK_INT >= Build.VERSION_CODES.O
                    ? WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY
                    : WindowManager.LayoutParams.TYPE_PHONE,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                    | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
            PixelFormat.TRANSLUCENT);
    // 设置悬浮窗口的位置和大小
    params.gravity = Gravity.CENTER | Gravity.START;
    params.x = 0;
    params.y = 100;

    floatingView.setOnTouchListener(new FloatingOnTouchListener(params));

    floatingView.findViewById(R.id.img_float_add).setOnClickListener(new FloatingAddOnClickListener());
    floatingView.findViewById(R.id.img_float_lose).setOnClickListener(new FloatingLoseOnClickListener());
    floatingView.findViewById(R.id.img_float_set).setOnClickListener(new FloatingSetOnClickListener());
    mLayout_hidden = floatingView.findViewById(R.id.layout_hidden);
    mImgFloatPlayOrStop = floatingView.findViewById(R.id.img_floatPlayOr_stop);

    windowManager.addView(floatingView, params);
    isViewSigleOrMulti();

}

气泡悬浮窗:

private void setAnchorPointWindow(int mCode) {
    WindowManager mSystemService = (WindowManager) getSystemService(WINDOW_SERVICE);
    WindowManager.LayoutParams params = new WindowManager.LayoutParams();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        params.type = WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY;
    } else {
        params.type = WindowManager.LayoutParams.TYPE_PHONE;
    }
    params.alpha = 1.0f;
    params.gravity = Gravity.CENTER;
    params.format = PixelFormat.RGBA_8888;
    params.width = WindowManager.LayoutParams.WRAP_CONTENT;
    params.height = WindowManager.LayoutParams.WRAP_CONTENT;
    params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
    mView = View.inflate(getApplicationContext(), R.layout.service_anchor_point, null);
    TextView anchorPoint = mView.findViewById(R.id.tv_anchor_point);

    anchorPoint.setText(mCode + 1 + "");
    mSystemService.addView(mView, params);

    ClickViewBean clickViewBean = new ClickViewBean();
    clickViewBean.manager = mSystemService;
    clickViewBean.view = mView;
    clickViewBean.x = 0;
    clickViewBean.y = 0;
    clickViewBeanList.add(clickViewBean);


    mView.setOnTouchListener(new View.OnTouchListener() {
        private int initialX;
        private int initialY;
        private float initialTouchX;
        private float initialTouchY;

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (isPlay) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        initialX = params.x;
                        initialY = params.y;
                        initialTouchX = event.getRawX();
                        initialTouchY = event.getRawY();
                        return true;
                    case MotionEvent.ACTION_UP:
                        int newX = initialX + (int) (event.getRawX() - initialTouchX);
                        int newY = initialY + (int) (event.getRawY() - initialTouchY);
                        params.x = newX;
                        params.y = newY;
                        SPUtil.putCooreinate_x(newX);
                       SPUtil.putputCooreinate_y(newY);

                        mSystemService.updateViewLayout(mView, params);
                        return true;
                    case MotionEvent.ACTION_MOVE:
                        int newX1 = initialX + (int) (event.getRawX() - initialTouchX);
                        int newY1 = initialY + (int) (event.getRawY() - initialTouchY);
                        params.x = newX1;
                        params.y = newY1;
                        mSystemService.updateViewLayout(mView, params);
                        return true;
                }
            }
            return false;
        }
    });

}

2、其他相关资源文件与全部代码,可下载完整demo查看

3、在activity中启动

Intent i = new Intent(TestActivity.this, AutoClickService.class);
startService(i);

由于代码格式问题,暂不加更多代码,不然看起来很乱。

demo下载

搜索:csdn generallizhong

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
对于Android悬浮的部分区域不拦截点击事件的问题,你可以通过以下步骤来实现: 1. 首先,在创建悬浮的布局文件中,将需要拦截点击事件的区域设置为可点击,即添加点击事件监听器。 2. 在悬浮的代码中,可以通过重写悬浮的触摸事件处理方法来判断点击事件的位置。 3. 如果点击事件的位置在需要拦截的区域内,可以返回true,表示事件已经被处理,不再继续传递。 4. 如果点击事件的位置在不需要拦截的区域内,可以返回false,表示事件需要继续传递给下一层的触摸事件处理方法。 以下是一个示例代码: ```java // 在创建悬浮的布局文件中,将需要拦截点击事件的区域设置为可点击,并添加点击事件监听器 View interceptView = findViewById(R.id.intercept_view); interceptView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 处理需要拦截的区域的点击事件 } }); // 在悬浮的代码中,重写触摸事件处理方法 @Override public boolean onTouchEvent(MotionEvent event) { int x = (int) event.getRawX(); int y = (int) event.getRawY(); // 判断点击事件的位置 if (isInInterceptArea(x, y)) { // 如果点击事件的位置在需要拦截的区域内,则返回true,表示事件已经被处理 return true; } else { // 如果点击事件的位置在不需要拦截的区域内,则返回false,表示事件需要继续传递给下一层的触摸事件处理方法 return false; } } // 判断点击事件的位置是否在需要拦截的区域内 private boolean isInInterceptArea(int x, int y) { // 在这里判断点击事件的位置是否在需要拦截的区域内,并返回结果 // 如果在需要拦截的区域内,返回true;否则返回false return false; } ``` 通过以上步骤,你可以实现Android悬浮部分区域不拦截点击事件的需求。请根据你的实际情况进行相应的修改和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

generallizhong

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值