C# 单机器人密度dpi到Int

C# 单机器人密度dpi到Int,c#,xamarin,xamarin.android,C#,Xamarin,Xamarin.android,我需要将DensityDpi转换为Int。我尝试如下: int dens = dm.DensityDpi; 当然,这是行不通的。完整的代码是: DisplayMetrics dm = new DisplayMetrics(); WindowManager.DefaultDisplay.GetMetrics(dm); int width = dm.WidthPixels; int height = dm.HeightPixels; int dens = dm.DensityDpi; double

我需要将DensityDpi转换为Int。我尝试如下:

int dens = dm.DensityDpi;
当然,这是行不通的。完整的代码是:

DisplayMetrics dm = new DisplayMetrics();
WindowManager.DefaultDisplay.GetMetrics(dm);
int width = dm.WidthPixels;
int height = dm.HeightPixels;
int dens = dm.DensityDpi;
double wi = (double)width / (double)dens;
double hi = (double)height/(double)dens;
double x = Math.Pow(wi,2);
double y = Math.Pow(hi,2);
double screenInches = Math.Sqrt(x+y);
我在努力寻找屏幕的那一寸

考虑到有证据表明常数是int,我不知道为什么它不起作用。 ( ) 我认为这是同样的事情。

对于Android:

var metrics = new DisplayMetrics();
this.WindowManager.DefaultDisplay.GetMetrics(metrics);

private const float INCH = 25.4f;

var ydpi = metrics.Ydpi; // dpi in vertical direction
var xdpi = metric.Xdpi; // dpi in horizontal direction
var pHeight = metrics.HeightPixels; // total pixels in vertical direction
var pWidth = metrics.WidthPixels; // total pixels in horizontal direction
var iHeight = (pHeight / ydpi); // screenheight in inches
var iWidth = (pWidth / xdpi); // screenwidth in inches
var mHeight = (pHeight / ydpi) * INCH; // screenheight in millimeters
var mWidth = (pWidth / xdpi) * INCH; // screenwidth in millimeters
抱歉,无法直接查询iOS设备的DPI

但是,您可以使用一些常量来计算它。iPhone的ppi是163,而iPhone视网膜的ppi是这一数字的两倍

private const float INCH = 25.4f;

var ppi = 163 * UIScreen.MainScreen.Scale; // pixels per inch for an iPhone or iPhone Retina
var ppmm = ppi / INCH;                // pixels per millimeter
var pHeight = UIScreen.MainScreen.ApplicationFrame.Height; // screen height in pixels
var pWidth =  UIScreen.MainScreen.ApplicationFrame.Width; // screen width in pixels
var iHeight =  (pHeight / ppi); // screen height in millimeters
var iWidth =   (pWidth / ppi); // screen height in millimeters
var mHeight = (pHeight / ppi) * INCH; // screen height in millimeters
var mWidth =  (pWidth / ppi) * INCH; // screen height in millimeters

我已经在Xamarin.Forms.Labs项目中实现了对显示属性的抽象。虽然它的目标是Xamarin.Forms,但也可以在没有它的情况下使用。对于Android和WP8,属性是计算出来的,但对于iOS,属性是由设备的硬件版本决定的。您可以从NuGet(Xamarin.Forms.Labs)为每个平台(iOS、Android、WP8)安装软件包,以获得功能齐全、经过测试且易于使用的类

以下是Android显示器完整源代码的链接:

根据显示密度,使用扩展方法计算物理尺寸(以便所有平台都可以重用):

以下是Android信息的屏幕截图:

也可用于iOS和WP8:

    public Display()
    {
        var dm = Metrics;
        this.Height = dm.HeightPixels;
        this.Width = dm.WidthPixels;
        this.Xdpi = dm.Xdpi;
        this.Ydpi = dm.Ydpi;

        this.FontManager = new FontManager(this);
    }

    public static Android.Util.DisplayMetrics Metrics
    {
        get
        {
            return Application.Context.Resources.DisplayMetrics;
        }
    }
    public static double ScreenSizeInches(this IDisplay screen)
    {
        return Math.Sqrt(Math.Pow(screen.ScreenWidthInches(), 2) + Math.Pow(screen.ScreenHeightInches(), 2));
    }

    public static double ScreenWidthInches(this IDisplay screen)
    {
        return screen.Width / screen.Xdpi;
    }

    public static double ScreenHeightInches(this IDisplay screen)
    {
        return screen.Height / screen.Ydpi;
    }