Android的popupWindow遮罩穿透问题

文章目录


遇到的问题:
使用FrameLayout写组件,内部包含一个列表和列表上的遮罩层,在页面有popupWindow展示的时候,显示遮罩层;popupWindow消失的时候,隐藏遮罩层。
设置的popupWindow.setOutsideTouchable为true,点击到遮罩层,此时popupWindow消失,但是点击会穿透到列表,触发item的点击事件

例如:
在这里插入图片描述
解决方式:
1:view_mask为遮罩层,设置了clickable为true。
2:需要设置popupWindow.setFocusable(true)。

### Comfui 遮罩透视效果实现方法 在 Android 开发中,为了实现遮罩透视效果并处理 ScrollView 的滚动问题,可以采用多种方式来优化用户体验。当遮罩层的底层是 `ScrollView` 或其他可滚动视图时,使用 `TextView` 或者 `PopupWindow` 可能会遇到一些挑战[^1]。 #### 方法一:自定义 ViewGroup 实现局部遮罩 通过创建一个继承自 `FrameLayout` 的自定义控件,在该布局内放置需要显示的内容以及半透明背景作为遮罩部分。对于不需要被遮挡的部分可以通过设置不同的 Z 轴顺序或者调整子 view 的层次结构来达到预期的效果。 ```java public class MaskedView extends FrameLayout { private final Paint mPaint; public MaskedView(Context context, AttributeSet attrs) { super(context, attrs); mPaint = new Paint(); mPaint.setColor(Color.parseColor("#80000000")); // 半透明黑色 } @Override protected void dispatchDraw(Canvas canvas) { int saveCount = canvas.saveLayer(0, 0, getWidth(), getHeight(), null, Canvas.ALL_SAVE_FLAG); super.dispatchDraw(canvas); Path path = new Path(); RectF rectF = new RectF(/*指定不被遮盖区域*/); path.addRoundRect(rectF, /*圆角参数*/, Path.Direction.CW); canvas.clipPath(path, Region.Op.DIFFERENCE); canvas.drawRect(new RectF(0, 0, getWidth(), getHeight()), mPaint); canvas.restoreToCount(saveCount); } } ``` 此代码片段展示了如何利用 `Canvas` 和 `Path` 来绘制特定形状之外的阴影区。 #### 方法二:使用 PopupWindow 并禁用触摸事件传递给下方组件 另一种方案是在弹窗窗口 (`PopupWindow`) 中展示提示信息或其他交互元素,并且阻止点击事件穿透到下面的 `ScrollView` 上。这可以通过重写 `onTouchEvent()` 方法或调用 `setOutsideTouchable(false)` 来完成。 ```java final PopupWindow popupWindow = new PopupWindow(viewToShow, width, height); popupWindow.setTouchInterceptor((v, event) -> true); // 拦截所有触碰操作 popupWindow.showAtLocation(parentView, Gravity.CENTER, 0, 0); ``` 这种方法能够有效防止用户误操作影响底部列表项的选择状态。 #### 解决 ScrollView 滚动冲突的方法 针对原生存在的滚动冲突现象,可以在应用层面做出如下改进: - **手势识别器**:引入第三方库如 [GestureDetector](https://developer.android.com/reference/android/view/GestureDetector),用于区分上下滑动手势与单击动作之间的差异; - **动态计算高度**:根据屏幕尺寸自动调整顶部悬浮框的高度,从而减少对下拉刷新功能的影响; 以上措施有助于改善因遮罩而引发的各种异常情况,提供更加流畅自然的操作体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值