如何处理android屏幕碎片?

如何处理android屏幕碎片?,android,screen,scale,resolution,Android,Screen,Scale,Resolution,我希望只编写一次布局和代码,这样在所有设备上都会很好看。 我尝试了很多方法(是的,包括谷歌建议的,使用DP并添加多个布局文件),但没有一种方法真正解决了每次出现分辨率和密度随机的新设备时必须处理新情况的问题。 DP的使用只是一个XML技巧,它让维度在所有屏幕上保持不变,就像一把尺子一样(例如,在所有屏幕上1cm保持1cm),因此它实际上不是一个解决方案 我还使用了权重和代码技巧来设置正确的大小和位置,但对于这样一个简单的任务来说,这实在是太多的工作了 我听说谷歌正在为这件事制定解决方案,同时也在

我希望只编写一次布局和代码,这样在所有设备上都会很好看。 我尝试了很多方法(是的,包括谷歌建议的,使用DP并添加多个布局文件),但没有一种方法真正解决了每次出现分辨率和密度随机的新设备时必须处理新情况的问题。 DP的使用只是一个XML技巧,它让维度在所有屏幕上保持不变,就像一把尺子一样(例如,在所有屏幕上1cm保持1cm),因此它实际上不是一个解决方案

我还使用了权重和代码技巧来设置正确的大小和位置,但对于这样一个简单的任务来说,这实在是太多的工作了

我听说谷歌正在为这件事制定解决方案,同时也在为新的冰激凌三明治版本制定版本碎片,但我没有听说/读到任何关于这件事的新消息。 不仅如此,android需要支持的多密度和分辨率图表也越来越大:

遗憾的是,这么多其他技术已经有了解决这个问题的方法:苹果有(自动将应用程序从iPhone3G扩展到iPhone4)、adobe有(flash),甚至微软也有(使用viewbox、silverlight、wpf和WP)。即使是电视也必须处理这个问题,而且他们做得很好

我不是在要求魔法,只是想找到一种可以扩展一切的方法。如果视图的大小为屏幕的W%,H%,并且位于屏幕的X%,Y%位置,那么它应该在所有屏幕上保持这种方式,并且如果它对我们足够重要,还允许我们保持纵横比。 为什么我们需要为分辨率和密度而烦恼?我们和图形团队都很困惑

总之,我想,也希望很多人都像我一样思考,也许有人制作了一个很好的sdk来解决所有问题


@查伯德:DP不太好用,因为它会让所有屏幕上的东西都像尺子一样保持不变。如果某个东西在屏幕的3/4部分,那么在另一个屏幕上就不会这样了(它甚至可能在屏幕之外,或者发生了其他奇怪的事情,这取决于您选择的布局)。DP是一个固定值,仅根据密度将其转换为每个设备上的像素。因此,对于wvga800(hdpi-480x800)和wvga854(hdpi-480x854)之间的差异,DP不会改变任何东西,您会得到54个像素,您不知道如何处理它们。如果您想为wvga854添加一些内容,则不会为wvga800显示这些内容。更糟糕的是,当谈到android布局时,这两个屏幕之间没有区别——它们都属于同一类普通hdpi

此外,如果您使用DP,在一个屏幕上,图像/按钮看起来不错,但在其他屏幕上,与屏幕的其他部分相比,它们看起来太小了,所以这真的不是一个好的解决方案。 我也不明白为什么我们有多个可绘制文件夹通常设置为取决于密度。这只会给图形团队带来更多的工作,并使应用程序的尺寸比实际尺寸大得多,因此,市场可能不会接受它(因为尺寸太大),甚至更糟——设备将无法下载应用程序(例如,galaxy S上的旧操作系统版本无法下载并安装大于30MB的应用程序)

@阿丹普:我没说什么绝对布局。它确实有我希望克服的坏行为,就像其他布局一样。唯一允许缩放的布局是linearLayout(使用权重),但要完成一项简单的任务,需要大量的标记和文字。 关于我想要什么,我已经写过了:我希望一切都能按比例发展。在互联网上有很多例子,你可以看到它工作得很好,即使是在flash上。只需打开一个完整的flash/silverlight窗口内容并调整窗口大小。如果程序员设置正确,其中的所有内容都将根据与原始大小相比的新大小进行缩放。 顺便说一句,谢谢你对gridlayout的关注。我不知道。然而,它似乎也不能扩展任何东西

@安德烈亚斯格:现在这很有趣。你是如何处理图像的?你能试试下一个“谜语”吗?
假设你有一张适合屏幕的人脸(或安卓:)图像(并保持其纵横比),而你有另一张眼睛的图像以不同的颜色着色,你会如何将它们一个放在另一个上面(可能使用framelayout),以便在所有设备上看起来相同(缩放),无论您使用的是横向模式还是纵向模式?

我为每个屏幕大小绘制具有正确比例的自定义视图的方法是获得实际屏幕密度:

float density = context.getResources().getDisplayMetrics().density;
例如,为具有16个密度无关像素的自定义视图设置字体大小

paint.setTextSize(density * 16);

这就是全部的魔力。我希望这能解决您的问题。

我为每个屏幕大小绘制具有正确比例的自定义视图的方法是获得实际屏幕密度:

float density = context.getResources().getDisplayMetrics().density;
例如,为具有16个密度无关像素的自定义视图设置字体大小

paint.setTextSize(density * 16);

这就是全部的魔力。我希望这能解决您的问题。

您应该只使用完全不同的布局来大幅改变您希望应用程序的行为方式,而不是在单个设备类别(如手机)中使用屏幕大小的微小差异。您可以提供针对横向模式优化的布局的
-land
变体,或者您可以提供
-sw600dp
变体,为大约7英寸的平板电脑提供不同的信息架构“或更大。您不应该使用此选项为WVGA和qHD手机显示器提供不同的布局。这样做只会给你自己带来很多额外的工作

dp是一种用于处理不同密度的工具,它对大小和纵横比的差异没有帮助。处理屏幕大小和纵横比差异的解决方案是使用framewor中提供的布局管理器