【问题标题】:Android and supporting multiple screens layoutsAndroid 并支持多屏布局
【发布时间】:2011-07-22 21:24:37
【问题描述】:

我正在完成一个 Android 应用程序,剩下的就是为多个设备调整 UI 布局和图形。我需要将特定元素放置在屏幕上的特定位置。

Android 文档解释了多种屏幕分辨率和尺寸是如何分类的,并解释了资源标记系统。

例如,WVGA800 (480x800)WVGA854 (480x854) 都被归类为普通高密度屏幕。为了满足这些需求,您需要创建一个名为“layout”(“normal”已经存在)和“drawable-hdpi”的文件夹。

问题在于,即使您使用“dp”单位,这也无法区分同一分类的两个设备。如何分别为 WGA800 和 WGA854 提供布局/drawable?

比率差异很大,用户很容易注意到缩放不良,而我需要诸如分数和计时器之类的东西出现在背景图像的特定位置,这加剧了这种情况。

同样的问题适用于 {WQVGA400 (240x400)、WQVGA432 (240x432)} 和 {WVGA800 (480x800)、WVGA854 (480x854)} 对。您如何为 WQVA400 和 WQGA432 提供布局/可绘制对象?

【问题讨论】:

  • 可能不是您要找的答案,但您可以获取屏幕宽度和高度,然后可以调整图像大小或将分数和计时器放在适当的位置。

标签: android screen-resolution screen-size


【解决方案1】:

我认为你正在通往地狱的路上。

Android 可以在种类繁多的设备上运行,而且每周都在增加,而且许多格式尚不存在,但会引入新的变量。所以即使你成功了,一台屏幕尺寸略有不同的新设备,你的应用也会失败。

使用特定的屏幕分辨率为 Android 进行设计是错误的,并且类似于您在网络上强制所有页面的大小完全相同时会发现的问题,它很少能正常工作(例如,即使是固定的-width 网站在移动设备上会惨遭失败)。

Android 旨在支持所有这些变化,但如果您尝试在每个屏幕尺寸上获得像素完美的绝对定位渲染,您就是在逆流而上。它可能会非常痛苦、非常耗时且成本高昂,并且最终可能会失败。即使你成功了,你将如何在所有这些屏幕变体上测试它?听起来也像是在试探地狱。

我强烈建议您接受您不能完全按照您的需要做所有事情,而是看看如何使用相对于彼此流畅地渲染对象的方式,以便应用程序在所有不同的变体中看起来都不错,使用为每组分辨率设置不同的布局,以改善在不同尺寸屏幕上的体验。

【讨论】:

  • 同样害怕。但我需要被骂!
  • 观察 - 给定分类的所有成员的宽度相等。是否有任何意图保持这种状态的声明?
  • @SK9 我认为最好假设 Android 可以在几乎任何尺寸、形状、方向以及存在或不存在任何功能(GPS、网络、键盘等)的设备上运行,并且显示如下为他们提供和定制的概念 - 肖像/土地、ldpi/mdpi/hdpi/xhdpi、屏幕尺寸等。这并不容易,但从长远来看,痛苦会减轻,而且该应用程序很有可能在大多数设备上都能正常工作
  • 我同意这一点,我担心缩放任何东西 - 即使是轻微的 - 在模拟器和我的设备上都表现不佳。这对我来说是一个沉重的权衡。在这方面可能会有一个不错的折衷……我不可能愿意跟上新设备的步伐,但是鉴于迄今为止只有三个设备,跟上宽度似乎是合理的。在那之前,这确实让我走得很远。这也会给我一些时间来想出一个更好的主意。
  • 再次感谢您的回复,它让我以正确的方式思考这个问题(嵌套相对布局和线性布局,仅在需要时使用常量进行填充)。 UI 现在在所有分辨率和屏幕尺寸下看起来都不错。将 Android 屏幕视为网页是一种非常有用的理念。
【解决方案2】:

在本页其他地方的答案/cmets 之外,我想对我自己的问题发布另一个答案,以提请注意可以引入的屏幕资源类型。我不相信 Android 文档中明确说明了这一点,但就可绘制对象而言,您可以将屏幕尺寸标签添加到 dpi 标签之上的可绘制文件。

例如,添加一个名为drawable-large-mdpi 的文件夹是有效的,大屏幕和中等分辨率的设备会尽可能从这里拉取资源。不过警告,切换标签的顺序很重要:声明 drawable-mdpi-large 是一个错误。

【讨论】:

    【解决方案3】:

    是的,这是可能的:

    首先你必须创建一个显示类的实例。 之后,您将获得显示器的宽度和高度。 然后您可以使用 if 运算符循环检查每个分辨率并设置您想要的图像。

    例子:

    ImageView iview=(ImageView)findViewById(R.id.imageView1);
    //here are the Bitmaps optimized for each screen resolution 
    Bitmap[] bitmaps={BitmapFactory.decodeResource(getResources(), R.drawable.icwvga800),BitmapFactory.decodeResource(getResources(), R.drawable.icwvga854),(...)};
    // In this list all supported screensizes are defined
    int[][] possibleScreenSolutions={{480,800},{480,854},{240,400},{240,432},{480,800},{480,854}};
    Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
    int[] ScreenSolution={display.getWidth(),display.getHeight()};
    // Compare the real screen solution with the all supported ones
    for(int i=0;i<possibleScreenSolutions.length;i++){
        if((ScreenSolution[0]==possibleScreenSolutions[i][0])&&(ScreenSolution[1]==possibleScreenSolutions[i][1])){
                iview.setImageBitmap(bitmaps[i]);// set the image
        }
    }
    

    我同意 Ollie C 的观点:检查所有分辨率太令人困惑,但至少是可能的。

    我已经测试过了:它有效。

    【讨论】:

      猜你喜欢
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      相关资源
      最近更新 更多