问题描述
您如何检测设备是小型还是大型? 我不需要检测是否是平板电脑。
此概念取自https://devblogs.microsoft.com/xamarin/styling-for-multiple-device-resolutions/
我们使用下面的方法并相应地加载适当的样式,但是因为我没有考虑到密度,所以它是不准确的。
如何改进或重写此方法,以便为我提供更好的结果并更准确地检测设备大小。
当前
const int smallWightResolution = 768;
const int smallHeightResolution = 1280;
public static bool IsASmallDevice()
{
// Get Metrics
var maindisplayInfo = Xamarin.Essentials.Devicedisplay.MaindisplayInfo;
// Width (in pixels)
var width = maindisplayInfo.Width;
// Height (in pixels)
var height = maindisplayInfo.Height;
return (width <= smallWightResolution && height <= smallHeightResolution);
}
尝试使用密度,但不知道公式是什么
public static bool IsSmallDevice()
{
//we don't support tablet so tablet don't apply.
int smallWidthResolution = 768;
int smallHeightResolution = 1280;
double screenWidth;
double screenHeight;
bool isSmallDevice;
var metrics = Xamarin.Essentials.Devicedisplay.MaindisplayInfo;
switch (Xamarin.Forms.Device.RuntimePlatform)
{
case Xamarin.Forms.Device.Android:
//Android not sure how to sort of correctly detect if is a small device
screenWidth = (metrics.Width - 0.5f) / metrics.Density;
screenHeight = (metrics.Height - 0.5f) / metrics.Density;
isSmallDevice = "???????";
break;
case Xamarin.Forms.Device.iOS:
//ios no changes
isSmallDevice = metrics.Width <= smallWidthResolution
&& metrics.Height <= smallHeightResolution;
break;
}
return isSmallDevice;
}
已更新
Huawei P9 Android 7.0
Density=2.5
Width=1080
Height=2160
ScreenHeight(Calculated)=864
ScreenWidth(Calculated)=432
Samsung A20 Android (new phone)
Density=2
Width=720
Height=1560
ScreenHeight(Calculated)=780
ScreenWidth(Calculated)=360
有什么建议吗?
解决方法
答案
我建议使用Xamarin.Essentials NuGet Package来检索屏幕的宽度,高度和密度,然后使用以下公式:
- ScreenWidth =宽度/密度
- ScreenHeight =高度/密度
代码
using Xamarin.Essentials;
// **** Example Screen Sizes ****
// iPhone SE 2nd Gen (aka iPhone 8),Width 750,Density 2,Width/Density 375
// iPhone 11,Width 828,Width/Density 414
// Pixel 3,Width 1080,Density 2.75,Width/Density 392.7
// Galaxy S5,Density 3,Width/Density 360
// Galaxy Nexus,Width 720,Width/Density 360
public static double ScreenWidth { get; } = DeviceDisplay.MainDisplayInfo.Width / DeviceDisplay.MainDisplayInfo.Density;
public static double ScreenHeight { get; } = DeviceDisplay.MainDisplayInfo.Height / DeviceDisplay.MainDisplayInfo.Density;
public static bool IsSmallScreen { get; } = ScreenWidth <= 360;
示例应用
这是我在GitTrends应用中使用以上代码的方式: https://github.com/brminnick/GitTrends/blob/aa0c0a2d53dab7306514287533330b4a3bfbf609/GitTrends/Services/XamarinFormsService.cs#L11-L18
,您可以使用Xamarin Forms内置的成语来检测设备的类型:
-
台式机
-
电话
-
平板电脑
-
电视
-
观看
如果(Device.Idiom == TargetIdiom.Phone) { //您的代码在这里 }