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

14
所有不同的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创建了可绘制对象。这对于上述分辨率来说效果很好,但这取决于屏幕分辨率i.c.w.屏幕尺寸,并且在例如具有540x960的HTC感觉器中失败。

我知道并非所有分辨率都经常使用,但我希望尽可能支持更多分辨率。 屏幕尺寸和密度统计数据

我已经多次阅读支持多个屏幕,但没有找到清晰的答案来解决这个“问题”。

那么,我应该读出分辨率并根据分辨率设置参数,而不是密度吗?这样做是否明智,或者您如何处理此问题?

非常感谢您的信息!

5个回答

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


感谢这些数值非常有用,但这并不能解决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的屏幕宽度却多60像素。 - patrick
2
是的...问题在于你无法处理所有屏幕尺寸的100%。例如,如果您想要一个文本视图恰好覆盖屏幕的宽度,即使您应用了所有可能的技术,仍然会有一些设备会换行文本或其他情况。我的观点是,您无法使您的应用程序在所有设备上看起来完全符合您的要求...您必须遵循尽可能使其看起来更好的原则。 - Cristian

1

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


0
不用担心分辨率的轻微差异:540x960 只比 480x800 大一点点。额外的垂直空间很容易解决:它为列表提供了更多的空间。对于水平空间,只要正确处理布局,你将在两侧简单地有额外的填充(每侧30像素)。
不幸的是,全宽图像(480 宽)是一个稍微棘手的问题。如果您想要像素完美的图像,您需要使用 scaleType="center",以便图像居中但不缩放。如果您想要全宽,您可以使用 scaleType="fitCenter" 来填充它。它会有点模糊... 但是在 Android 上有很多东西也是这样的 ;-)


0

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

看一下dp。它本质上自动地为任何设备执行你所做的所有这些事情。(设备无关像素)


0

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接