LibGDX开发中模拟器与Android真机触摸坐标差异问题咨询
问题根因定位
- 手动覆盖了Viewport的视口配置:你代码中
Gdx.gl.glViewport(0, 0, 720, 1280);是完全错误的写法,FitViewport会根据设备实际分辨率和设定的720*1280虚拟分辨率自动计算视口的偏移和大小,手动写死固定值后,在非16:9比例的设备上渲染画面会发生偏移,触摸坐标自然无法对齐。 - 未适配Android全面屏系统栏:三星S20是全面屏设备,默认存在状态栏、手势提示条的占位区域,若你的Activity未开启沉浸式配置,LibGDX获取的屏幕高度会排除系统栏高度,正好对应你提到的50~100px的Y轴偏移误差。
- 坐标转换方式不正确:直接使用
camera.unproject转换坐标没有考虑视口的偏移值,正确做法是使用Viewport提供的unproject方法,会自动带入视口偏移参数计算。
修复步骤
1. 删除错误的手动视口配置
直接删掉Gdx.gl.glViewport(0, 0, 720, 1280);这行代码,FitViewport的update方法会自动完成视口配置。
2. 修正坐标转换逻辑
将render方法中的坐标转换代码替换为Viewport的unproject方法:
@Override public void render(float delta) { if(game.mTouchUp) { mTouchPoint.set(Gdx.input.getX(), Gdx.input.getY(), 0); // 替换原来的camera.unproject(mTouchPoint) mStage.getViewport().unproject(mTouchPoint); game.mTouchUp = false; Gdx.app.debug("TOUCH", "Touchpoint coordinates : " + mTouchPoint); } }
3. 适配Android全面屏沉浸式
在你的Android项目主Activity中添加沉浸式配置,让游戏画面占满整个物理屏幕,排除系统栏高度的干扰:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 适配挖孔屏,允许画面延伸到挖孔区域 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { WindowManager.LayoutParams lp = getWindow().getAttributes(); lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES; getWindow().setAttributes(lp); } // 隐藏系统栏开启沉浸式 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); } // 切回应用后保持沉浸式状态 @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if (hasFocus) { 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); } }
4. 可选适配调整
如果不需要FitViewport在非16:9设备上的上下黑边,可以将FitViewport替换为ExtendViewport,会自动扩展虚拟分辨率适配屏幕比例,不会拉伸画面也不会产生黑边。
验证方式
修复后在两台设备上分别触摸背景图的四个边角,打印的坐标应该和背景图的边角坐标完全对应,误差在1px以内说明适配正常。
内容的提问来源于stack exchange,提问作者indy.dk
相关产品推荐
相关产品推荐

