【问题标题】:How to support all the different resolutions of android products如何支持安卓产品的所有不同分辨率
【发布时间】:2011-06-19 16:27:44
【问题描述】:

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

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

我还购买了以下设备来测试我的 Android 应用: 三星银河欧洲 (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 sensatoin。

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

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

那么我应该读出分辨率并根据分辨率而不是密度来设置参数吗?这是明智的做法吗?或者您如何应对?

非常感谢您的信息!

【问题讨论】:

    标签: android layout drawable screen-resolution


    【解决方案1】:

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

    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 像素。
    • 是的...这里的问题是您将无法处理 100% 的屏幕尺寸。因此,例如...如果您希望文本视图准确地覆盖屏幕的宽度,即使您应用了所有可能的技术,也会有一些设备会包装文本或其他东西。我的观点是,你不能让你的应用在所有设备上看起来都像你想要的那样……你必须尽可能地让它看起来更好。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      看看dp。这基本上可以自动为任何设备完成您所做的所有事情。 (设备独立像素)

      【讨论】:

        【解决方案4】:

        不必担心分辨率的细微差别:540x960 仅比 480x800 稍大一点。额外的垂直空间很容易:它为您的列表提供了更多空间。对于水平空间,只要您正确处理布局,您只需在侧面有额外的填充(30pix ea)。

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

        【讨论】:

          【解决方案5】:

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

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

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

          【讨论】:

            猜你喜欢
            • 2013-05-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-04-07
            相关资源
            最近更新 更多