You need to enable JavaScript to run this app. LibGDX开发中模拟器与Android真机触摸坐标差异问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 13:15:04