.NET MAUI跨平台获取DPI/PPI方法咨询
在.NET MAUI中跨平台获取设备DPI/PPI的解决方案
由于DeviceDisplay.MainDisplayInfo仅提供缩放系数和像素尺寸,无法直接获取物理英寸信息,我们需要通过平台特定实现来获取真实DPI/PPI,进而实现SkiaSharp元素与厘米单位的转换。以下是分平台的具体方案:
1. 定义共享接口
在MAUI共享项目中创建统一接口,用于跨平台调用:
public interface IDpiService { double GetHorizontalDpi(); double GetVerticalDpi(); double GetAverageDpi(); }
2. 各平台实现
Android平台
利用Android原生DisplayMetrics获取系统提供的真实物理DPI:
[assembly: Dependency(typeof(DpiServiceAndroid))] namespace YourAppNamespace.Platforms.Android { public class DpiServiceAndroid : IDpiService { public double GetHorizontalDpi() { var metrics = Android.App.Application.Context.Resources.DisplayMetrics; return metrics.Xdpi; } public double GetVerticalDpi() { var metrics = Android.App.Application.Context.Resources.DisplayMetrics; return metrics.Ydpi; } public double GetAverageDpi() { return (GetHorizontalDpi() + GetVerticalDpi()) / 2; } } }
iOS平台
通过UIScreen的物理尺寸(英寸)与像素尺寸计算PPI:
[assembly: Dependency(typeof(DpiServiceIos))] namespace YourAppNamespace.Platforms.iOS { public class DpiServiceIos : IDpiService { public double GetHorizontalDpi() { var screen = UIScreen.MainScreen; return screen.NativeBounds.Width / screen.Bounds.Width; } public double GetVerticalDpi() { var screen = UIScreen.MainScreen; return screen.NativeBounds.Height / screen.Bounds.Height; } public double GetAverageDpi() { return (GetHorizontalDpi() + GetVerticalDpi()) / 2; } } }
Windows平台
使用DisplayInformation获取系统DPI,如需物理DPI可结合屏幕物理尺寸计算:
[assembly: Dependency(typeof(DpiServiceWindows))] namespace YourAppNamespace.Platforms.Windows { public class DpiServiceWindows : IDpiService { public double GetHorizontalDpi() { var displayInfo = Windows.Graphics.Display.DisplayInformation.GetForCurrentView(); // 如需物理DPI,替换为以下代码: // var screenSize = displayInfo.ScreenSizeInInches; // var pixelWidth = displayInfo.ScreenWidthInRawPixels; // return pixelWidth / screenSize.Width; return displayInfo.LogicalDpi; } public double GetVerticalDpi() { var displayInfo = Windows.Graphics.Display.DisplayInformation.GetForCurrentView(); return displayInfo.LogicalDpi; } public double GetAverageDpi() { return GetHorizontalDpi(); } } }
3. 在共享代码中使用
通过依赖服务获取实例,并实现厘米与像素的转换:
var dpiService = DependencyService.Get<IDpiService>(); var averageDpi = dpiService.GetAverageDpi(); // 厘米转像素(1厘米 = 0.3937英寸) double CmToPixel(double cm) { return cm * 0.3937 * averageDpi; } // 像素转厘米 double PixelToCm(double pixel) { return pixel / averageDpi / 0.3937; }
注意事项
- Android的
Xdpi/Ydpi为系统提供的物理DPI,大部分设备准确,少数定制ROM可能存在偏差。 - iOS的计算逻辑基于系统公开的物理尺寸,精度可靠。
- Windows的
LogicalDpi是系统缩放后的DPI,若需物理真实值,使用注释中的代码结合屏幕物理尺寸计算。
内容的提问来源于stack exchange,提问作者macaroni
相关产品推荐
相关产品推荐

