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
相关产品推荐
相关产品推荐

