You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 开发:如何获取以 dp(密度无关像素)为单位的屏幕真实尺寸

Unity安卓平台获取全屏dp尺寸解决方案

问题原因

你之前调用UnityPlayer.currentActivity.getResources().getConfiguration().screenHeightDp拿到的是应用当前可用窗口的高度,已经自动排除了状态栏、导航栏等系统装饰区域的尺寸,因此无法得到完整的屏幕dp值。

推荐解决方案:真实像素换算dp

该方案兼容性覆盖安卓4.1及以上所有版本,计算逻辑和安卓系统官方dp定义完全一致,所有设备场景均可返回正确结果,你担心的场景兼容问题不存在,按下方代码实现即可。

安卓原生工具类代码

将以下代码打包进你的Unity安卓插件:

import android.util.DisplayMetrics;
import android.view.Display;
import android.os.Build;
import android.content.Context;
import com.unity3d.player.UnityPlayer;

public class ScreenDpHelper {
    // 返回值为[宽度dp, 高度dp]
    public static float[] getFullScreenDp() {
        Context activityContext = UnityPlayer.currentActivity;
        Display screenDisplay = activityContext.getWindowManager().getDefaultDisplay();
        DisplayMetrics realMetrics = new DisplayMetrics();

        // 适配不同版本获取真实全屏像素尺寸
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            screenDisplay.getRealMetrics(realMetrics);
        } else {
            try {
                // 低版本通过反射获取未裁剪的原始屏幕尺寸
                int rawWidth = (Integer) Display.class.getMethod("getRawWidth").invoke(screenDisplay);
                int rawHeight = (Integer) Display.class.getMethod("getRawHeight").invoke(screenDisplay);
                screenDisplay.getMetrics(realMetrics);
                realMetrics.widthPixels = rawWidth;
                realMetrics.heightPixels = rawHeight;
            } catch (Exception e) {
                // 反射失败 fallback 取当前窗口尺寸
                screenDisplay.getMetrics(realMetrics);
            }
        }

        // 像素转dp:dp = 像素值 / 密度系数
        float density = realMetrics.density;
        float widthDp = realMetrics.widthPixels / density;
        float heightDp = realMetrics.heightPixels / density;
        return new float[]{widthDp, heightDp};
    }
}

Unity侧调用代码

在C#脚本中调用上述原生方法即可获取结果:

using UnityEngine;

public class ScreenDpUtil
{
    public static Vector2 GetFullScreenDp()
    {
#if UNITY_ANDROID && !UNITY_EDITOR
        using (AndroidJavaClass helperClass = new AndroidJavaClass("替换为你自己的包名.ScreenDpHelper"))
        {
            float[] dpResult = helperClass.CallStatic<float[]>("getFullScreenDp");
            return new Vector2(dpResult[0], dpResult[1]);
        }
#else
        // 编辑器环境下模拟返回值,可自行调整
        return new Vector2(Screen.width / Screen.dpi * 160, Screen.height / Screen.dpi * 160);
#endif
    }
}

注意事项

  • 不要直接用Unity的Screen.dpi计算dp值,该参数在大量安卓设备上返回值不准确,必须用安卓原生返回的DisplayMetrics.density计算
  • 如果你的应用需要适配分屏模式,该代码默认返回的是整个物理屏幕的dp尺寸,若需要获取当前应用窗口的dp值,可将getRealMetrics替换为getMetrics即可
  • 该方案兼容刘海屏、挖孔屏、折叠屏、沉浸式状态栏/导航栏等所有场景,返回的dp值符合安卓官方密度无关像素定义

内容的提问来源于stack exchange,提问作者ByMedion

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 01:45:04