我希望只编写一次布局和代码,以便在所有设备上都能看起来不错。 我尝试了很多方法(是的,包括谷歌建议的,使用DP并添加多个布局文件),但没有一个真正解决了每次有一个随机分辨率的新设备时必须处理新情况的问题和密度。 DP的使用只是一个XML技巧,它允许尺寸在所有屏幕上保持不变,例如标尺(例如,1cm在所有屏幕上保持1cm),因此它实际上不是解决方案。
我还使用了权重和代码技巧来设置正确的大小和位置,但这对于这么简单的任务来说太过分了。
我听说谷歌正在研究这个问题的解决方案以及新冰淇淋三明治版本的版本碎片,但我没有听到/读到任何关于此事的新内容。 不仅如此,Android需要支持的多个密度和分辨率的图表越来越大: http://developer.android.com/guide/practices/screens_support.html
令人遗憾的是,许多其他技术已经解决了这个问题:苹果拥有它(自动将应用程序从iphone 3g扩展到iphone 4),adobe拥有它(闪存)甚至微软拥有它(使用viewbox,关于silverlight,wpf和WP)。即使电视也必须处理这个问题,他们做得很好。
我不是要求魔法,只是为了扩展一切。如果一个视图是W%的大小,屏幕的H%,并且在屏幕的X%,Y%的位置上,它应该保持在所有屏幕上,并且如果它很重要也允许我们保持纵横比足够我们。 为什么我们需要打扰决议和密度?它只是让我们和图形团队感到困惑。
总而言之,我想并希望许多人像我一样思考,也许有人做了一个很好的sdk解决了这一切?
@chubbard:DP不能很好地工作,因为它会让所有屏幕的内容与标尺完全相同。如果有什么东西在屏幕的3/4处,那么在另一个屏幕上就不会出现这种情况(它甚至可能在屏幕之外或者有其他奇怪的事情发生,这取决于你选择的布局)。 DP是固定值,仅基于密度仅转换为每个设备上的像素。所以,对于wvga800(hdpi-480x800)和wvga854(hdpi-480x854)之间的区别,DP不会改变任何东西,你会得到54个像素,你不知道如何处理它们。如果你想为wvga854添加一些内容,它将不会显示为wvga800。更糟糕的是,在讨论android布局时,这2个屏幕之间没有区别 - 它们都属于普通hdpi的同一类别。
另外,如果你使用DP,在一个屏幕上图像/按钮看起来不错,但在其他屏幕上它们看起来与屏幕的其他部分相比很小,所以它真的不是一个好的解决方案。 我也不明白为什么我们通常设置多个可绘制文件夹取决于密度。它只会为图形团队带来更多的工作,并使应用程序的尺寸远大于它,因此,市场可能不会接受它(因为尺寸太大)甚至更糟糕 - 设备不会能够下载应用程序(例如,Galaxy S上的旧操作系统版本无法下载和安装超过30MB大小的应用程序。)
@adamp:我没有对absoluteLayout说什么。它具有我想要克服的其他布局的确切不良行为。以某种方式允许缩放的唯一布局是linearLayout(使用权重),但是需要很多标记和文字来完成一项简单的任务。 关于我想要什么,我已经写过了:我希望一切都能扩展。互联网上有很多例子,你可以看到它工作正常,即使在闪存上也是如此。只需打开一个完整的窗口flash / silverlight内容并调整窗口大小。如果程序员设置正确,那么其中的所有内容都将根据新大小与原始大小进行比较。 顺便说一句,谢谢你对gridlayout的说明。我不知道。然而,似乎它也无法扩展任何东西。
@andreasg:现在这很有趣。你是怎么处理图像的?你可以试试下一个“谜语”吗? 假设你有一个适合屏幕的人脸(或安卓:)的图像(并保持其纵横比),并且你有另一种颜色以不同颜色着色的图像,你怎么把它们放在一个另一个(可能使用framelayout)的顶部,以便它在所有设备上看起来都相同(缩放),无论你是在横向还是纵向模式下?
答案 0 :(得分:1)
您应该只使用完全不同的布局来更改您希望应用的行为方式,而不是在单个设备类(如手机)中屏幕尺寸的微小差异。您可以提供针对横向模式优化的布局的-land
变体,或者您可以提供-sw600dp
变体来为大约7英寸或更大的平板电脑提供不同的信息架构。您不应该使用这为WVGA和qHD手机显示器提供了不同的布局。这样做只会为自己创造很多额外的工作。
dp是一种处理不同密度的工具,它对尺寸和纵横比的变化没有帮助。处理屏幕大小和宽高比差异的解决方案是使用框架中提供的布局管理器来适应当前设备。如果您遇到真正需要自定义行为的情况,可以通过扩展ViewGroup
并覆盖onMeasure
和onLayout
方法轻松编写自己的内容。 API 14添加了GridLayout
,它还提供了更多选项。
设计这些差异确实需要采用不同的方法来解决问题。你不能通过考虑绝对屏幕坐标来解决问题,除非你想为自己做很多工作。考虑一下布局中的组件如何相互组合在一起,哪些部件应该扩展到比最小配置可用时消耗更多的空间。
从百分比的角度思考是一个良好的开端,这正是使用LinearLayout
的权重特征所获得的结果。但是如果你想指定某个视图应该保持特定的宽高比,你需要考虑应该如何限制,什么将填补任何多余的空间,以及这些决定是否会为你的应用程序产生良好的用户体验。 (例如,没有用户想要使用信箱本身的应用程序,只在中间的固定宽高比框中显示真实内容。)
没有神奇的解决方案,因为只有你知道这些东西在你的应用中应该如何表现。 Android会帮助你,但你必须告诉它你想要什么。
也许您可以发布一个有关您遇到问题的特定设计的问题,而stackoverflow上的某人可以提供一些建议。
答案 1 :(得分:0)
我为每个屏幕尺寸绘制具有正确比例的自定义视图的方法是获得实际的屏幕密度:
float density = context.getResources().getDisplayMetrics().density;
例如,为具有16个密度无关像素的自定义视图设置字体大小
paint.setTextSize(density * 16);
这就是整个魔法。我希望这能解决你的问题。