Android 在Xamarin窗体应用程序中计算屏幕大小
这是我创建的一个示例应用程序的图像,用于计算屏幕大小 我试图完成的是确定屏幕的实际(可用)区域(图像中屏幕的白色部分)。我正在使用的应用程序要求在按下某个键时能够滚动屏幕(我们部署的设备连接了物理键盘)。此外,我们将部署的设备将具有Android操作系统 在示例应用程序中,我使用Xamarin Essentials包获取高度、宽度和密度值。我使用以下代码获取导航栏高度值,这些代码是我在web上的几个地方(Android项目中)找到的: 问题是:Android 在Xamarin窗体应用程序中计算屏幕大小,android,xamarin.forms,Android,Xamarin.forms,这是我创建的一个示例应用程序的图像,用于计算屏幕大小 我试图完成的是确定屏幕的实际(可用)区域(图像中屏幕的白色部分)。我正在使用的应用程序要求在按下某个键时能够滚动屏幕(我们部署的设备连接了物理键盘)。此外,我们将部署的设备将具有Android操作系统 在示例应用程序中,我使用Xamarin Essentials包获取高度、宽度和密度值。我使用以下代码获取导航栏高度值,这些代码是我在web上的几个地方(Android项目中)找到的: 问题是: 使用这些值,如何计算 屏幕 导航栏高度是否为屏
- 使用这些值,如何计算 屏幕
- 导航栏高度是否为屏幕上
蓝色导航栏是或是位于
返回和主页按钮的底部位置 - 屏幕尺寸中是否包含底部栏?如果是这样的话,看起来 就像我丢失了一个值。如果是,从何处/如何获得该值
另外,阅读另一个文档页面(),我应该能够获得我所称的导航栏(原始图像中的蓝色栏)的高度。但是我不知道该在哪里打这个电话。我尝试将其放置在自定义导航页面渲染器的
OnElementChanged
覆盖中。放置在此处时,值始终为0。我猜这是因为该条实际上尚未渲染。如果这是真的,那么对该方法的调用应该放在哪里?您可以获取特定平台中的屏幕大小,并在共享项目中获取值
在共享项目App.xaml.cs中
在Android MainActivity.cs中
在iOS中
在代码隐藏或视图模型中
xamarin提供了一个覆盖方法。您可以在PageXaml.cs文件中编写下面的表单
protected override void OnSizeAllocated(double width, double height)
{
base.OnSizeAllocated(width, height);
}
Xamarin.Essentials.DeviceDisplay.MainDisplayInfo.Height
Xamarin.Essentials.DeviceDisplay.MainDisplayInfo.Width
晚会迟到了,但这是我的贡献。从其他答案中可以看出,有几种方法可以获得屏幕大小,但实际屏幕大小与我所称的有效屏幕大小之间存在差异。例如,在Android上,如果调整缩放设置,则会更改有效屏幕大小。以下是Xamarin格式的示例: 如果您将以下代码放在查看代码后面,您将看到实际屏幕大小和有效屏幕大小之间的差异。OnSizeAllocated参数似乎包含有效屏幕大小,而DeviceDisplay.MainDisplayInfo.Width&Height似乎包含实际显示大小。输出在代码段下面
protected override void OnSizeAllocated(double width, double height)
{
base.OnSizeAllocated(width, height);
var mainDisplayInfo = DeviceDisplay.MainDisplayInfo;
var orientation = mainDisplayInfo.Orientation;
var rotation = mainDisplayInfo.Rotation;
var widthx = mainDisplayInfo.Width;
var heightx = mainDisplayInfo.Height;
var densityx = mainDisplayInfo.Density;
Log($"STATS: Orientation={orientation}
Rotation={rotation}
Effective Width={width}
Effective Height={height}
Width={widthx}
Height={heightx}
Density={densityx}");
}
输出:
请注意,使用“正常”缩放级别时,有效屏幕大小与实际屏幕大小相同,密度为1
放大:统计:方向=横向旋转=旋转90有效宽度=853.333有效高度=533.333宽度=1280高度=800密度=1.5
放大缩放:统计信息:方向=横向旋转=旋转90有效宽度=975.238095238095有效高度=609.52380952381宽度=1280高度=800
密度=1.3125
缩放中间:统计信息:方向=横向旋转=旋转90有效宽度=1137.778有效高度=711.111111111宽度=1280高度=800密度=1.125
缩放法线:统计信息:方向=横向旋转=旋转90有效宽度=1280有效高度=800宽度=1280高度=800密度=1
小缩放:统计信息:方向=横向旋转=旋转90有效宽度=1462.85714285714有效高度=914.285714285714宽度=1280高度=800密度=0.875也不要忘了考虑缺口因素
protected override void OnCreate(Bundle savedInstanceState)
{
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
base.OnCreate(savedInstanceState);
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
Forms.SetFlags("CollectionView_Experimental");
global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
App.ScreenWidth = Resources.DisplayMetrics.WidthPixels/Resources.DisplayMetrics.Density;
App.ScreenHeight =Resources.DisplayMetrics.HeightPixels/Resources.DisplayMetrics.Density;
LoadApplication(new App());
}
public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
//...
App.ScreenWidth = UIScreen.MainScreen.Bounds.Width;
App.ScreenHeight = UIScreen.MainScreen.Bounds.Height;
//...
}
// do something you want
var height = App.ScreenHeight;
var width = App.ScreenWidth;
protected override void OnSizeAllocated(double width, double height)
{
base.OnSizeAllocated(width, height);
}
protected override void OnSizeAllocated(double width, double height)
{
base.OnSizeAllocated(width, height);
var mainDisplayInfo = DeviceDisplay.MainDisplayInfo;
var orientation = mainDisplayInfo.Orientation;
var rotation = mainDisplayInfo.Rotation;
var widthx = mainDisplayInfo.Width;
var heightx = mainDisplayInfo.Height;
var densityx = mainDisplayInfo.Density;
Log($"STATS: Orientation={orientation}
Rotation={rotation}
Effective Width={width}
Effective Height={height}
Width={widthx}
Height={heightx}
Density={densityx}");
}