全屏模式(无状态栏/导航栏)下无法在屏幕底角绘制矩形问题
解决全屏模式下无法在屏幕底角绘制矩形的问题
我来帮你拆解这个问题的根源,然后给出具体的解决方案:
问题核心原因
你当前使用的getDefaultDisplay().getSize()方法,返回的是应用窗口的可用区域尺寸——也就是系统状态栏/导航栏被隐藏后,留给应用的显示区域大小,并非屏幕的真实物理全尺寸。哪怕你设置了全屏模式,部分设备仍会在底层保留虚拟导航栏的预留空间,导致你用maxY计算的位置始终停留在这个预留区上方,无法触达真正的屏幕底角。
解决方案1:获取屏幕真实物理尺寸
改用getRealSize()(API 17+)或getRealMetrics()方法获取屏幕的完整尺寸,这样就能拿到真正的屏幕高度,精准定位到底角:
代码示例(API 17+)
Display mdisp = getWindowManager().getDefaultDisplay(); Point realDisplaySize = new Point(); // 获取屏幕真实全尺寸 mdisp.getRealSize(realDisplaySize); int realMaxX = realDisplaySize.x; int realMaxY = realDisplaySize.y; @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 使用真实屏幕高度计算矩形位置 canvas.drawRect(0, realMaxY - pixel, pixel, realMaxY); }
兼容低版本(API <17)
如果需要兼容更早的Android版本,可以用DisplayMetrics:
DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getRealMetrics(metrics); int realMaxX = metrics.widthPixels; int realMaxY = metrics.heightPixels;
解决方案2:确保Activity完全进入沉浸式全屏
有时候全屏设置未完全生效,系统仍会预留导航栏空间。可以在onCreate()中添加以下配置,让窗口完全延伸到屏幕所有区域:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 开启沉浸式全屏,隐藏状态栏和导航栏 getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY ); // 允许窗口布局延伸到系统栏所在区域 getWindow().setFlags( WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS ); setContentView(R.layout.your_activity_layout); }
结合这两个方案,你就能让矩形精准显示在屏幕的底部角落了。
内容的提问来源于stack exchange,提问作者Deepanshu Namdeo
相关产品推荐
相关产品推荐

