Android和支持多屏幕布局

Android和支持多屏幕布局,android,screen-resolution,screen-size,Android,Screen Resolution,Screen Size,我正在完成一个Android应用程序,剩下的就是调整多个设备的UI布局和图形。我需要在屏幕上的特定位置放置特定元素 Android文档解释了如何对多个屏幕分辨率和大小进行分类,并解释了资源标签系统 例如,WVGA800(480x800)和WVGA854(480x854)都被归类为普通高密度屏幕。为了满足这些需求,您需要创建一个名为“layout”(已存在“normal”)和“drawable hdpi”的文件夹 问题是,即使使用“dp”单元,这也无法区分相同分类的两个设备。如何分别为WGA800

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

Android文档解释了如何对多个屏幕分辨率和大小进行分类,并解释了资源标签系统

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

问题是,即使使用“dp”单元,这也无法区分相同分类的两个设备。如何分别为WGA800和WGA854提供布局/绘图

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


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

我认为您正在走向地狱

安卓系统运行在各种各样的设备上,每周都会有更多的设备,许多格式还不存在,但会引入新的变量。因此,即使你成功了,一个屏幕大小略有不同的新设备,你的应用程序也会失败

使用特定的屏幕分辨率为Android设计是一个错误,与你在网络上强制所有页面大小完全相同时会发现的问题类似,它很少能很好地工作(例如,即使是整洁的固定宽度网站也会在移动设备上惨败)

Android已经被设计为支持所有这些变化,但是如果你试图在每一个屏幕大小上获得像素完美的绝对定位渲染,你就要逆流而上了。这很可能是非常痛苦、非常耗时和昂贵的,并且可能最终失败。即使你成功了,你到底将如何在所有这些屏幕变体上测试它?听起来也像是在测试地狱


我强烈建议你接受你不能完全按照你的需要来做每件事,而是看看如何使用流畅地呈现对象的方式,相对于彼此,这样应用程序在所有不同的变化中看起来都很好,使用每组分辨率的不同布局来改善不同大小屏幕上的体验。

进一步了解本页其他地方的答案/评论,我想发布我自己问题的另一个答案,提请注意可以引入的屏幕资源类型。我不相信Android文档中已经明确了这一点,但就可绘制文件而言,您可以在dpi标记的顶部向可绘制文件添加屏幕大小标记

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

是的,这是可能的:

首先,必须创建display类的实例。 之后,您将获得显示器的宽度和高度。 然后,您可以使用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
    }
}
ImageView iview=(ImageView)findviewbyd(R.id.imageView1);
//以下是针对每个屏幕分辨率优化的位图
位图[]位图={BitmapFactory.decodeResource(getResources(),R.drawable.icwvga800),BitmapFactory.decodeResource(getResources(),R.drawable.icwvga854),(…)};
//在此列表中定义了所有支持的屏幕大小
int[]possibleScreenSolutions={{480800}、{480854}、{240400}、{240432}、{480800}、{480854};
显示=((WindowManager)getSystemService(窗口服务)).getDefaultDisplay();
int[]ScreenSolution={display.getWidth(),display.getHeight()};
//将真实屏幕解决方案与所有支持的解决方案进行比较

对于(int i=0;我也听到了。但我需要被叫喊!一个观察-给定分类的所有成员的宽度都是相等的。有没有任何声明打算保持这种状态?@SK9我认为最好假设Android可以在几乎任何大小、形状、方向和任何功能的设备上运行(GPS、网络、键盘等)显示器遵循提供的概念并为其定制——纵向/平面、ldpi/mdpi/hdpi/xhdpi、屏幕大小等。这并不容易,但从长远来看,痛苦会减轻,而且应用程序很有可能只在大多数设备上工作。我同意这一点,我担心的是,在模拟器和我的计算机上,任何东西的缩放效果都很差,即使是轻微的缩放设备。这对我来说是一个沉重的折衷。这可能是一个不错的折衷方案…我不可能愿意跟上新设备的发展,但跟上宽度似乎是合理的,因为目前只有三个。在那之前,这确实让我走了很长的路。这也会给我一些时间想出更好的主意。再次感谢您的回复nse,它让我正确地思考了这个问题(嵌套相对布局和线性布局,仅在需要时使用常量填充)。用户界面现在在所有分辨率和屏幕大小上都很好。将android屏幕视为网页是一种非常有用的理念。可能不是您想要的答案,但您可以获得屏幕宽度和高度,然后调整图像大小,或将分数和计时器放在适当的位置。