2011-06-19 79 views
13

不同Android产品的所有不同分辨率都让我非常吃惊。如何支持Android产品的所有不同分辨率

我写的第一个android应用程序是为支持三种常用分辨率而设计的:240x320(LDPI),320x480(MDPI)和480x800(HDPI)。 480x854对布局没有任何损害,因为它与480x800的宽度相同。

我也购买了如下设备来测试我的Android应用: 三星Galaxy欧洲(LDPI) 的HTC Desire Z(华电国际)

幸运的是我的女朋友有一个HTC野火S(MDPI),所以我已经得到了大部分决议。

但今天,我的兄弟下载了我的应用程序在他的新的HTC Sensation,它还有另一个分辨率540x960(HDPI?)。哪些应用程序没有显示我的应用程序,可能大多数平板电脑也无法正确显示它。

我已经做了我的第一个应用程序被读出的密度,然后设置参数:

public void set_ui_parameters() { 
    DisplayMetrics metrics = new DisplayMetrics(); 
    getWindowManager().getDefaultDisplay().getMetrics(metrics); 

    if(metrics.densityDpi == DisplayMetrics.DENSITY_HIGH){ 
     textSize = 35;  
     timeWidth = 80; 
     dayWidth = 110; 
     moneyWidth = 50; 
    } else if(metrics.densityDpi == DisplayMetrics.DENSITY_MEDIUM){ 
     textSize = 35;  
     timeWidth = 53; 
     dayWidth = 73; 
     moneyWidth = 33; 
    } else if(metrics.densityDpi == DisplayMetrics.DENSITY_LOW){ 
     textSize = 28; 
     timeWidth = 40; 
     dayWidth = 55; 
     moneyWidth = 25; 
    } 
} 

而且我也创造了LDPI,MDPI和HDPI可绘制的参数。这适用于上述解决方案,但这取决于屏幕分辨率i.c.w.屏幕尺寸和失败,例如与540x960的HTC sensatoin。

我知道并非所有的决议都经常使用,但我想尽可能地支持。 Stats of Screen Sizes and Densities

我读了Supporting Multiple Screens多次,但没有找到明确的答案,这个“问题”。

所以我应该读出分辨率并根据分辨率而不是密度设置参数?这是一件明智的事情,或者你如何处理这件事?

非常感谢您的信息!

回答

27

您不必这样做以支持不同的密度。你要做的是创建不同的资源文件夹:

res/values-ldpi/dimens.xml 
res/values-mdpi/dimens.xml 
res/values-hdpi/dimens.xml 

然后Android会决定使用哪个文件。你可以有这样的事情:

<!-- in values-ldpi/dimens.xml --> 
<dimen name="textSize">25dip</dimen> 

和..

<!-- in values-mdpi/dimens.xml --> 
<dimen name="textSize">20dip</dimen> 

等等,你不应该在乎的分辨率......有很多不同的分辨率大小所以这将是一个地狱基于此做出决定。

此外,如果您使用dp而不是像素,则几乎不必为每个密度创建不同的尺寸文件。当然,有时你必须这样做,但这取决于应用程序。

+0

由于这些值非常有用,但这并不能解决540x960分辨率的问题,或者我错了。由于SQRT(540^2 + 960^2)/4.3=256,15(HTC Sensation)与SQRT(480^2 + 800^2)/3.7=252,15(HTC Desire Z)大致相同并且都将被索引为HDPI,其中Sensation的屏幕宽度为60px。 – patrick

+2

是啊...这里的问题是,你将无法处理100%的屏幕尺寸。所以,举例来说,如果你想要一个文本视图来精确覆盖屏幕的宽度,即使你应用了所有可能的技术,也会有一些设备将包装文本或其他东西。我的观点是,你不能让你的应用在所有设备上看起来完全一样,你必须遵守使它看起来更好。 – Cristian

0

现在,我就在这里猜测,因为没有显示的实施方案的休息,但我假设你正在使用这些导出的测量值作为px

看看dp。这基本上可以为所有设备自动执行所有这些操作。(设备独立像素)

0

不用担心分辨率的细微差别:540x960只比480x800略大。额外的垂直空间很简单:它为您的列表提供了更多空间。对于水平空间,只要你正确地处理你的布局,你就可以在边上添加额外的填充(30pix ea)。

不幸的是,全宽图像(480宽)是一个稍大的问题。如果你想像素完美的图像,你会想要使用scaleType =“中心”所以图像中心,但不缩放。如果要全宽,可以使用scaleType =“fitCenter”使其填充。它会有点模糊...但在Android上有这么多东西;-)

0

我遇到了这个问题,除了我的应用程序是一个游戏,其中有一个SurfaceView画布,我画背景图像和精灵(类似于LunarLander示例)。

您在这里处理的方式是将您的背景图像扩展为您愿意支持的最大尺寸(540x960),但您将所有重要的东西(如按钮,文本,信息等)保存在一个更小的矩形内为480x800。您可以扩展图像本身,或者只是添加边框。关键是没有什么重要的。

拥有480x800手机的人将会看到您的正常应用。使用540x960手机的人会看到一些额外的边框。

1

您唯一需要做的就是在清单文件中将android:minSdkVersion设置为7或更高。有可能某些视图会显示稍微不同,但应用程序是 适用,并在整个屏幕上。