Android:获取目标方向的屏幕尺寸的正确方法?

时间:2012-06-19 10:32:39

标签: android layout screen

我的应用程序是位图密集型,具有像素精确布局(实际上,它是一种游戏,并且很难避免这种基于像素的坐标)。

我想要做的是在onCrete中执行一些布局计算和位图预缩放 - 我使用众所周知的API - getWindowManager().getDefaultDisplay().getSize() - 来检索屏幕大小并进行计算。< / p>

然而,我刚刚遇到了意想不到的问题。我的活动仅配置为横向,但如果我在模拟器上启动我的应用程序并且在模拟器被锁定时调用了onCreate(),则getSize()返回的屏幕尺寸表示纵向。解锁屏幕后,再次调用onCreate(),这次正确符合预期的横向模式尺寸。

我不知道如何处理这种情况。我看到以下选项:

  • 对于每个onCreate()调用,再次执行完整布局计算和资源缩放。这是逻辑上正确的解决方案,但我不想做同样的工作两次,只是为了丢掉第一个结果。
  • 如果为纵向模式调用onCreate(),则不做任何操作,并设置黑色背景(当我解锁屏幕时,我可以看到有一个愚蠢的旋转动画,所以这将成为一个淡入淡出的动画)

其实我更喜欢第二种选择,但我有点害怕任何副作用。有人遇到过这个问题吗?

更新(2012-07-08): 我可能已经为这个问题分配了一个略带误导性的标题(抱歉!),因为问题不在于检索尺寸本身,也不在于计算布局。它更多的是首先在纵向模式下创建的活动,然后再次以横向模式重新创建,尽管被声明为仅景观。我最初期望(合理地,是吧?)仅以横向方式创建的活动。

我最终决定在纵向模式下使用黑色填充活动,没有观察到任何副作用。在Android 4.0上,当我解锁屏幕时,我可以看到实际的旋转动画 - 有点奇怪,但我想它应该通知用户她应该旋转手机。鉴于在纵向模式下我只是用黑色填充屏幕,这个动画看起来有点像淡入和旋转组合 - 完全可以接受。

2 个答案:

答案 0 :(得分:0)

使用

DisplayMetrics dm=new DisplayMetrics(); 

this.getWindowManager().getDefaultDisplay().getMetrics(dm);

使用此代码(向下看代码)仅显示屏幕大小,如果您的视图具有静态大小,则在每个不同的屏幕上都会以不同的大小显示它们。

Display screen=getWindowManager().getDefaultDisplay().getSize();

使用方法: 每个屏幕都有不同的密度。所以使用:

float density=dm.density;

使用此密度,您可以设置您的视图大小:

(YOUR_ITEM_SIZE)*density;

另请参阅此处了解更多信息:

http://developer.android.com/reference/android/util/DisplayMetrics.html

答案 1 :(得分:0)

如果模拟器被锁定,你不能认为用户无论如何都不能运行任何东西,所以应用程序不需要处理这个案例吗?

无论如何,正如bmavus所写,使用getMetrics来获取屏幕尺寸。此外,如果您需要更改应用的屏幕方向,您可以在清单或代码中执行此操作。

对于游戏,我建议使用opengl解决方案,如果你没有太多时间挖掘它,你可以使用可以帮助你的第三方引擎,例如andenginelibgdx