1

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

我想做的是在我的onCrete- 我使用众所周知的 API -中执行一些布局计算和位图预缩放getWindowManager().getDefaultDisplay().getSize()- 以检索屏幕尺寸并进行计算。

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

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

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

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

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

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

4

2 回答 2

0

如果模拟器被锁定,你不能假设用户无论如何都不能运行任何东西,所以应用程序不需要处理这种最终情况吗?

无论如何,bmavus如前所述,getMetrics用于获取屏幕尺寸。此外,如果您需要更改应用程序的屏幕方向,可以在清单或代码中进行。

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

于 2012-07-07T09:26:08.117 回答
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

于 2012-07-07T06:50:43.017 回答