如何支持Android产品的所有不同分辨率

时间:2011-06-19 16:27:44

标签: android layout drawable screen-resolution

不同Android产品的所有不同分辨率让我疯狂。

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

我还购买了以下设备来测试我的Android应用: 三星Galaxy Europe(LDPI) HTC Desire Z(HDPI)

幸运的是,我的女朋友有一个HTC Wildfire 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创建了drawable。这适用于上述分辨率,但这取决于屏幕分辨率i.c.w.屏幕尺寸和失败,例如HTC sensatoin 540x960。

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

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

那么我应该读出分辨率并根据分辨率而不是密度设置参数吗?这是一个聪明的事情或你如何处理这个?

非常感谢您提供的信息!

5 个答案:

答案 0 :(得分:30)

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

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而不是像素,则几乎不必为每个密度创建不同的尺寸文件。当然,有时你必须这样做,但这取决于应用程序。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

现在,我只是在猜测,因为其余的实现没有显示,但我假设您正在使用这些派生的测量值px

看看dp。这基本上完成了你为任何设备自动完成的所有事情。 (设备无关像素)

答案 3 :(得分:0)

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

不幸的是,全宽图像(480宽)是一个稍大的问题。如果你想要像素完美的图像,你会想要使用 scaleType =“center”,所以图像居中而不是尺度。如果您想要全宽,可以使用 scaleType =“fitCenter”来填充。它会有点模糊......但Android上有很多东西; - )

答案 4 :(得分:0)

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

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

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