如何以编程方式获取android屏幕大小,一劳永逸?

如何以编程方式查找我的屏幕大小,触摸事件和视图测量/布局使用的单位? 换句话说,我需要触摸事件getRawX()/getRawY()View.getLocationOnScreen()所使用的坐标系中屏幕右下angular的坐标。

我很犹豫要调用所需的事件/视图单位的“像素”,因为显然在手机上有不同模式的“像素”的几个概念,而且他们没有添加到一致的故事。

我看到这已经被问及在stackoverflow和其他地方回答了很多,但没有答案实际上在我的手机(droid 4,android 4.1.2)在所有模式下工作:

  • 我可以在android应用程序中以编程方式找出屏幕的宽度吗?
  • 如何在android中以编程方式获取ScreenSize
  • Android设置根据屏幕大小以编程方式查看可见性
  • 如何获得Android屏幕的高度?
  • 在Android中获取屏幕高度
  • https://groups.google.com/forum/#!topic/android-developers/IpxnfvDFrpc
  • http://shuklaxyz.blogspot.com/2012/02/how-to-programmatically-figure-out.html
  • http://coderock.net/how-to-determine-screen-resolution-programmatically/
  • http://www.codeproject.com/Tips/313848/Get-actual-screen-size-for-the-application-layout
  • Android和以dp为单位编程设置宽度和高度
  • http://www.simplecodestuffs.com/how-to-get-screen-dimensions-programmatically-in-android/
  • http://www.androidsnippets.com/get-size-and-orientation-of-the-screen
  • http://grokbase.com/t/gg/android-developers/127aatfqb6/how-to-determine-screen-resolution-programmatically

(哇!)

这是针对无论应用程序是否处于“屏幕兼容模式”(即清单中的targetSdkVersion <= 10)都需要工作的库代码,我也不想对位置,大小,或状态栏或任何其他类似的屏幕装饰的存在。


这里是事实:

  1. 我的手机(一个运行android 4.1.2的droid 4)具有540×960的物理像素,即小彩色发光点。

  2. 当应用程序处于屏幕共享模式时,通过查看触摸事件和查看测量,所需单位的屏幕大小为360×640,当应用程序不处于屏幕共享模式时,屏幕大小为540×960。 这些是我需要find编号的数字,没有用触摸事件或视图来查找它们,但我很难find任何API将返回这些数字。

  3. 以各种方式获得的Display和DisplayMetrics对象都声称屏幕尺寸是540×960“像素”(不pipe是否在屏幕兼容模式下)。 具体而言,以下全部都是540×960:DisplayMetrics。{width,height}像素,Display.getSize(),Display.getRealSize(),Display.get {Width,Height}(),

  4. 以各种方式获得的configuration对象都表示屏幕{宽度,高度} Dp = 360×614(不pipe是否在屏幕兼容模式下)。 由于纵横比是错误的,我不相信这代表整个屏幕。 (我认为这是整个屏幕减去状态栏,我需要整个屏幕)。我认为可以说整个屏幕是360×640 dp是安全的,但我不知道任何API返回640。

  5. 以各种方式获得的DisplayMetrics说,在屏幕兼容模式下,“密度”是1.0f,当不在屏幕兼容模式时,是1.5f。

  6. 活动的getWindow().getAttributes().{width,height}没有帮助,因为它通常包含MATCH_PARENT而不是实际大小。 但我可以显然从一个活动的getWindow().getDecorView().getMeasured{Width,Height}() (这实际上是令人惊讶的,因为活动的窗口的decorView 看起来不像是占据整个屏幕;看起来像占用屏幕减去状态栏)。 但是我不想依赖这个,因为如果窗口被重新resize(软键盘出现?有人调用window.setAttributes()?或者我根本不在Activity中),这显然是所有的错误。

我知道下面的公式应该是这样的:pixels = dp * density当不在屏幕兼容模式时,似乎与所有报告的数字((3),(4),(5))一致:540×960 = 360×640 * 1.5但在屏幕兼容模式下,它不加起来:540×960!= 360×640 * 1所以,有些东西是错误的。

我认为最简单的解释是上面(3)中列出的方法只是在屏幕兼容模式下给出了“像素”的错误答案 – 也就是说,它们打算返回360×640“像素”,但是它们是错误的而是返回540×960。 但是可能有其他的方式来看待它。

在任何情况下,从上面的拼图中获得所需的数字,无论模式如何,当然是一个棘手的难题。 我发现了一种似乎在两种模式下都可以在手机上使用的方式,但是这种方式非常迂回,它依赖于两个似乎还不稳定的假设(如下面的代码注释所述)。

这是我的食谱:

 /** get screen size in "pixels", ie touchevent/view units. * on my droid 4, this is 360x640 or 540x960 * depending on whether the app is in screen compatibility mode * (ie targetSdkVersion<=10 in the manifest) or not. */ public void getScreenSizePixels(int widthHeightInPixels[/*2*/]) { Resources resources = getResources(); Configuration config = resources.getConfiguration(); DisplayMetrics dm = resources.getDisplayMetrics(); // Note, screenHeightDp isn't reliable // (it seems to be too small by the height of the status bar), // but we assume screenWidthDp is reliable. // Note also, dm.widthPixels,dm.heightPixels aren't reliably pixels // (they get confused when in screen compatibility mode, it seems), // but we assume their ratio is correct. double screenWidthInPixels = (double)config.screenWidthDp * dm.density; double screenHeightInPixels = screenWidthInPixels * dm.heightPixels / dm.widthPixels; widthHeightInPixels[0] = (int)(screenWidthInPixels + .5); widthHeightInPixels[1] = (int)(screenHeightInPixels + .5); } 

有没有更好的/更清洁的方式来find屏幕的大小?

 Display display = getWindowManager().getDefaultDisplay(); Point size = new Point(); display.getSize(size); int width = size.x; int height = size.y; 

现在,您可以以像素为单位来测量您的屏幕尺寸,因为所有button,文字浏览等都是以本机为单位进行测量的,因此这是比厘米更好的测量单位。 那是我正常使用的

通过使用DisplayMetrics,您可以获得任何设备的屏幕高度和宽度。 这里是代码。

 DisplayMetrics metrics; int width = 0, height = 0; 

在你的onCreate方法

  metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); height = metrics.heightPixels; width = metrics.widthPixels; 

尝试这个。

在你的#6中,你注意到DecorView似乎提供了你想要的东西,但你不认为这是可行的。 我相信你会尽可能地接近你。 根据Window.getDecorView的文档:

检索顶层窗口装饰视图(包含标准窗口框架/装饰以及其内部的客户端内容),可以将其作为窗口添加到窗口pipe理器中。

状态栏是这里提到的窗口装饰的一部分。 软件键盘和其他覆盖层将接收到自己的窗口,所以不应该干涉相关的值。 不正确的是显示指标,但是如果您的应用程序是全屏显示,则应始终是通过兼容性转换器过滤的全屏大小。 其他应用程序将无法访问您的应用程序的Window ,所以没有必要担心其他应用程序更改属性,而你没有看。

希望有所帮助。

如果您使用api级别17或更高版本,请检查显示中的 getRealMetrics和getRealSize

对于api级别14,15和16看这里

我应该把这个作为一个评论,但我没有这个代表。
这可能不是一个完全正确的答案,但是当我在DisplayMetrics方法中切换高度和宽度时,我得到了我的尺寸。

  DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); width = metrics.heightPixels; height = metrics.widthPixels; 

正如我所说这可能不正确,但我不知道为什么,但它为我工作。

我已经使用毕达哥拉斯定理来查找Android手机/平板电脑屏幕的对angular线大小,同样的主体可以应用到iPhone或黑莓屏幕。

 DisplayMetrics met = new DisplayMetrics(); this.getWindowManager().getDefaultDisplay().getMetrics(met);// get display metrics object String strSize = new DecimalFormat("##.##").format(Math.sqrt(((met.widthPixels / met.xdpi) * (met.widthPixels / met.xdpi)) + ((met.heightPixels / met.ydpi) * (met.heightPixels / met.ydpi)))); // using Dots per inches with width and height 

毕达哥拉斯一定是一个智者,他在很多年前就知道智能手机的编程:p

我使用下面的方法来获取设备的宽度:

 public static int getDeviceWidth(Context context){ WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); Display display = wm.getDefaultDisplay(); int width=display.getWidth(); return width; } 

我认为这个function将帮助你简单地得到你的Android屏幕大小的宽度和高度。 该函数以整数数组的forms返回宽度和高度,如下所示

 private int[] getScreenSIze(){ DisplayMetrics displaymetrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); int h = displaymetrics.heightPixels; int w = displaymetrics.widthPixels; int[] size={w,h}; return size; } 

并在您的创build方法输出您的宽度和高度如下所示

  int[] screenSize= getScreenSIze(); int width=screenSize[0]; int height=screenSize[1]; screenSizes.setText("Phone Screen sizes \n\n width = "+width+" \n Height = "+height); 

下载源代码并在你的android studio上进行testing