Android如何在屏幕指定Rect区域显示指定大小的Overlay覆盖视图
问题根源
设置x/y/width/height参数无效、overlay始终全屏,由两个问题共同导致:
- overlay布局文件中,根
RelativeLayout和内部的半透明View宽高都设置为match_parent,会强制撑满WindowManager分配的整个窗口空间,无视传入的尺寸参数。 WindowManager.LayoutParams配置错误:- 使用了
FLAG_LAYOUT_IN_SCREEN标记,该标记会让视图忽略位置偏移,强制占满整个屏幕可用空间 - 未设置
gravity属性,默认值为Gravity.CENTER,此时x/y参数是相对于屏幕中心点的偏移,不是绝对左上角坐标 - 宽高初始值设为
WRAP_CONTENT,配合布局的match_parent属性会直接撑满全屏
- 使用了
修复方案
按以下步骤修改代码即可让overlay显示在指定矩形区域内:
- 修改overlay布局文件,将根布局宽高改为
wrap_content,避免布局本身强制撑满:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content"> <View android:layout_width="match_parent" android:layout_height="match_parent" android:background="#50018786"/> </RelativeLayout>
内部View宽高设为match_parent即可,此时根布局尺寸由WindowManager参数固定,内部View会刚好填满指定大小的矩形区域
- 修正
WindowManager.LayoutParams的配置,移除错误标记、设置正确的gravity、明确指定位置和尺寸:
final WindowManager.LayoutParams params = new WindowManager.LayoutParams( // 矩形宽度:右边界减左边界 200-30=170 170, // 矩形高度:下边界减上边界 400-60=340 340, WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY, // 移除FLAG_LAYOUT_IN_SCREEN,添加FLAG_NOT_FOCUSABLE避免overlay拦截下层触摸事件,可按需调整 WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT ); // 设置锚点为屏幕左上角,此时x/y就是相对于屏幕左上角的绝对偏移 params.gravity = Gravity.TOP | Gravity.START; // 指定矩形左上角坐标 params.x = 30; params.y = 60;
- 其余加载overlay的逻辑不需要修改,传入修正后的params调用
addView即可让半透明覆盖层精准显示在Rect(30,60,200,400)对应的区域。
补充说明:如果需要动态调整overlay的位置或大小,不需要重新addView,调用
windowManager.updateViewLayout(mTopView, newParams)传入更新后的参数即可实时生效。
内容的提问来源于stack exchange,提问作者rachelbrl
相关产品推荐
相关产品推荐

