Android 在Xamarin窗体应用程序中计算屏幕大小

Android 在Xamarin窗体应用程序中计算屏幕大小,android,xamarin.forms,Android,Xamarin.forms,这是我创建的一个示例应用程序的图像,用于计算屏幕大小 我试图完成的是确定屏幕的实际(可用)区域(图像中屏幕的白色部分)。我正在使用的应用程序要求在按下某个键时能够滚动屏幕(我们部署的设备连接了物理键盘)。此外,我们将部署的设备将具有Android操作系统 在示例应用程序中,我使用Xamarin Essentials包获取高度、宽度和密度值。我使用以下代码获取导航栏高度值,这些代码是我在web上的几个地方(Android项目中)找到的: 问题是: 使用这些值,如何计算 屏幕 导航栏高度是否为屏

这是我创建的一个示例应用程序的图像,用于计算屏幕大小

我试图完成的是确定屏幕的实际(可用)区域(图像中屏幕的白色部分)。我正在使用的应用程序要求在按下某个键时能够滚动屏幕(我们部署的设备连接了物理键盘)。此外,我们将部署的设备将具有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}");
        }