Android 悬浮窗不拦截点击事件

Android 悬浮窗不拦截点击事件

悬浮窗基本设置代码如下:

windowManager = (WindowManager) getApplication().getSystemService(Context.WINDOW_SERVICE);
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;

添加 FLAG_NOT_TOUCH_MODAL 和 FLAG_NOT_FOCUSABLE 后,浮窗外的点击事件由浮窗外响应,但是浮窗内的点击事件,则浮窗给响应了。

如果要浮窗内的点击事件也由浮窗外即浮窗的下面的界面响应,则添加改 flag 标志即可。

layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                // 加上这句话悬浮窗不拦截事件
                | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;

FLAG_NOT_TOUCHABLE 的意思是

/** Window flag: this window can never receive touch events. */

这个窗口永远不能接收触摸事件。

对于只想叠加一层悬浮层的 UI 显示,但是又想底下的 Activity 响应点击事件等,可以这样处理。

顺便说一下,如果想让悬浮窗 UI 是透明的,不遮挡底下 Activity 的 UI,设置

// 这行配置是整体的透明度,全透明也会把布局中的内容给透明掉
//        layoutParams.alpha = 0.f;

这个属性是不合理的,它也会把浮窗的内容都给透明掉。

可以这样设置

// 这行配置 + 布局中的设置背景色为透明色有效果。
layoutParams.format = PixelFormat.RGBA_8888;

浮窗的 layout 根布局的背景添加透明色设置

 android:background="@android:color/transparent"

如果不加 format 的这行配置,只加 background 这个透明设置,会发现整个浮窗是黑色的。

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值