29

我昨天花了一些时间在 android 布局(...或更好的自定义布局)上苦苦挣扎。对于一般用途的表单,androids 提供的开箱即用布局绰绰有余。但是当涉及到更复杂的用例时(让我们以旋转木马为例,在椭圆路径上重叠图像),我很快意识到了 android API 的局限性和复杂性。这是我的方法:

  1. 使用开箱即用的布局不是一种选择(对于许多难以处理的问题要处理),但是需要可以添加到容器中的图形对象(例如 ImageView),以便轻松执行平移、旋转、等等...通过内置动画。

  2. AbsoluteLayout 似乎是可用于此目的的最合理的布局。它允许添加派生视图对象并编写您自己的算法来定位它们。但是......它已被弃用。真可惜!谁想使用已弃用的 api?

  3. 下一个最合理的做法是编写自己的布局子类化神秘的 ViewGroup.. 这就是所有事情都崩溃的地方(至少对我来说是这样)。编写自己的 swing 自定义布局是复杂、误导和棘手的(实际上我几年前就这样做了,我记得要更简单)。

  4. 然后(在绝望的驱使下)对视图进行子类化,覆盖 onDraw 方法并直接在 Canvas 上绘图似乎是唯一直接的解决方案(尽管这让我想起了 java2D 的日子......花费了很长时间来实现你的高 1%项目),但随后您将放弃希望应用于画布上绘制的图形的方便的内置动画 API。

结论是,除非我遗漏了什么,否则当前的 android 架构与其他一些 UI 技术(如 flash 或 javafx)提供的编程范式有点远(我可以轻松地在 javafx 和 flash 中实现上述轮播)。原因是,例如在 javafx 中,Scene 对象(类似于 android 的 View 概念)默认提供绝对布局。然后,您可以根据需要应用其他开箱即用的布局。但是对于需要自定义布局的场景,您无需执行任何操作。

我有点惊讶于这个选项在 android 中不可用,毕竟这是其他 ui 技术解决的一个非常普遍的需求。我仍然喜欢认为在 android 中我还没有找到第 5 个选项。有哪位专家可以提供有关该主题的一些信息吗?

谢谢。

4

4 回答 4

4

我认为 Android Layout 非常适合与用户交互的大多数用例,但是(一个很大的但是)Layout 机制非常微妙,并且很难正确扩展。对于小的 tweeks 来说这很好,但如果你想做一些与众不同的事情(比如动画轮播),你可能还是会做免费的图形,所以你不需要扩展 Layout 的额外复杂性。这只是更多的限制,没有合理的附加值。

大多数应用程序都有一些标准的东西(ActionBar、按钮、首选项、对话框等),以及一个或多个“独特”元素。所以我的建议是对标准的东西使用标准布局,但对于您的独特元素,请使用以下之一:

1) SurfaceView - 非常易于使用。请参阅官方月球着陆器 代码示例。要查看 SurfaceView 的实际效果,您还可以查看我的应用视频,它使用 SurfaceView 作为动画元素,所有内容都使用 RelativeLayout 进行布局。

2) opengl - 这是在 Android 上做图形的最强大的方法。它在 GPU 上运行,因此 CPU 可以自由地做其他事情。它是 3D(或 2D,如果您只使用一架飞机)。我正在使用libgdx,它很棒,经过短暂的学习并不难。

SurfaceView 和 opengl (GLSurfaceView) 都是视图,因此它们可以像任何其他视图一样添加到布局中

于 2012-05-22T20:50:44.753 回答
2

这是一个很棒的问题。我目前正在为 3.0 及更高版本进行编程,并且在大多数情况下已决定在大多数情况下坚持使用 AbsoluteLayouts。虽然它被设置为弃用,但为 3.0ish 及以下版本编译很可能仍然能够在 4 及更高版本的系统上运行一段时间。我自己在寻找这个答案(对于删除它的操作系统的未来版本)。他们削减它的原因是因为 Android 上的屏幕分辨率没有标准化。

我的建议是尽可能长时间地使用 AbsoluteLayouts。我也认为我们应该开始推动让谷歌知道它仍然是他们平台的一个非常必要的 API。

好问题:-)

于 2012-05-22T16:29:31.817 回答
1

有一个很好的例子:http ://www.google.com/events/io/2009/sessions/TurboChargeUiAndroidFast.html

第 44 分钟

甚至更好:http ://www.google.com/events/io/2009/sessions/SupportingMultipleDevicesBinary.html

于 2011-02-01T01:14:25.800 回答
1

关于自定义布局的可用文档对我来说似乎相当模糊,但我终于发现了一些有用的东西:这是一个很好的简单示例布局,展示了如何连接 XML 和 Java 代码: 如何在中心布局图像的“网格”屏幕 这里有一篇文章解释了我错过的一个关键问题: http ://www.arpitonline.com/blog/2012/07/01/creating-custom-layouts-for-android/ 。显然,必须为每个孩子覆盖 onMeasure 并调用 measure() 。

于 2012-12-20T22:08:39.343 回答