【问题标题】:How to determine android device resolution is small, medium, or large如何判断android设备分辨率是小、中还是大
【发布时间】:2019-03-26 07:25:01
【问题描述】:

我正在开发 Xamarin.Forms 应用程序,我需要确定 android 屏幕/分辨率是小、中还是大,以使用可用空间调整某些内容。例如,一些标签(单行)在较小的设备中被截断。因此,如果分辨率更小,我可以进行一些调整。

在 iOS 中,当 iPhone 屏幕变大时,分辨率也会越来越高,因此在 iOS 中很容易识别分辨率较小的设备。但在 android 中,这似乎很难。

Android 设备分辨率可取自

var resolutionH = Resources.DisplayMetrics.HeightPixels;
var resolutionW = Resources.DisplayMetrics.WidthPixels;

为了测试,我创建了以下模拟器并在其中运行应用程序。无论标签是否被截断,这都是我的结果。

Resolution  Density  Result
---------------------------
2560x1440   560      OK
1920x1080   400      OK

1280x720    320      Truncated
1280x720    280      OK
1280x720    240      OK
800x480     240      Truncated
800x480     160      OK

这里的问题是分辨率较高且 DPI 较低的设备不会造成任何问题。就像具有 1280x720 分辨率和 240 DPI(或 280 DPI)的设备。由于有大量具有不同分辨率和密度的 Android 设备可用,因此这个问题似乎更难解决。

有没有更好的方法来对 Android 设备(小型、中型和大型)进行分类?

【问题讨论】:

    标签: android xamarin.forms xamarin.android


    【解决方案1】:

    标签的文本被截断(在我的情况下)或元素在特定设备中没有获得足够空间的原因是,使用密度 (dpi/ppi) 和密度桶计算元素的实际像素那画面落入。本文提供了一个关于计算不同显示密度的元素物理尺寸的好方法。

    经过一番艰苦的研究,我能够通过结合屏幕宽度像素和密度来对设备屏幕进行分类。 (我从Android开发者网站Distribution dashboardSupport different screen sizes得到数据)

    我将屏幕宽度像素分为 4 类,然后使用以下公式计算每种显示密度的屏幕尺寸:

    sqrt((widthPixels x widthPixels) + (heightPixels x heightPixels)) / density
    

    然后我在GSMArena中搜索找到了具有上表屏幕配置的设备。屏幕尺寸小于 3 英寸的主要是智能手表,大于 8 英寸的可能是 Tabs 和智能电视。所以我将屏幕尺寸在 3 - 8 英寸之间的设备作为移动设备(智能手机)。

    【讨论】:

      【解决方案2】:

      您正在寻找的东西很容易在原生 android 中完成,您可以创建一个方法并检查 DensityMetricsDensity 如下所示:

      private string GetDeviceDensity()
          {
              var density = Resources.DisplayMetrics.DensityDpi;
              switch (density)
              {
                  case DisplayMetricsDensity.Medium:
                      return "MDPI";
                  case DisplayMetricsDensity.High:
                      return "HDPI";
                  case DisplayMetricsDensity.Low:
                      return "LDPI";
                  case DisplayMetricsDensity.Xhigh:
                      return "XHDPI";
                  case DisplayMetricsDensity.Tv:
                      return "TV";
                  case DisplayMetricsDensity.Xxhigh:
                      return "XXHDPI";
                  case DisplayMetricsDensity.Xxxhigh:
                      return "XXXHDPI";
                  default:
                      return "Unknown";
              }
          }
      

      【讨论】:

      • 你看,在被测试的模拟器列表中,240dpi 和 280dpi 的设备会落入 HDPI 桶。分辨率为 1280x720 的设备不会导致问题,因为它具有更高的分辨率,但 800x480 的分辨率会。
      • 800 x 400 这个设备是横向还是纵向?
      • 所有提到的设备都是纵向的。
      • 为什么不只检查显示指标,如果是 800x400,请根据情况做一些不同的事情
      • 其实我在寻找更通用的解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-12
      • 1970-01-01
      • 2017-05-11
      相关资源
      最近更新 更多