我昨天花了一些时间在 android 布局(...或更好的自定义布局)上苦苦挣扎。对于一般用途的表单,androids 提供的开箱即用布局绰绰有余。但是当涉及到更复杂的用例时(让我们以椭圆形路径上重叠图像的旋转木马为例),我很快意识到了 android API 的局限性和复杂性。这是我的方法:
使用开箱即用的布局不是一种选择(对于许多难以处理的问题要处理),但是需要可以添加到容器中的图形对象(例如 ImageView),以便通过内置动画轻松执行平移、旋转等。
AbsoluteLayout 似乎是最合理的布局。它允许添加派生 View 对象并编写您自己的算法来定位它们。但是......它已被弃用。真可惜!谁想使用已弃用的 api?
下一个最合理的做法是编写自己的布局子类化神秘的 ViewGroup.. 这就是一切崩溃的地方(至少它对我来说是这样)。编写自己的 swing 自定义布局一样复杂、误导和棘手(实际上我几年前就这样做了,我记得要更简单)。
然后(在绝望的驱使下)子类化一个 View,覆盖 onDraw 方法并直接在 Canvas 上绘图似乎是唯一直接的解决方案(尽管这让我想起了 java2D 的日子......花了很长时间来实现项目的最高 1%),但是您放弃了方便的内置动画 API,您希望将其应用于 Canvas 上绘制的图形。
结论是,除非我遗漏了什么,否则当前的 android 架构与其他一些 UI 技术(如 flash 或 javafx)提供的编程范式有点远(我可以在 javafx 和 flash 中轻松实现上述轮播) )。 原因是,例如在 javafx 中,Scene 对象(类似于 android 的 View 概念)默认提供绝对布局。然后,您可以根据需要应用其他开箱即用的布局。但对于需要自定义布局的场景,您无需执行任何操作。
我有点惊讶这个选项在 android 中不可用,毕竟这是其他 ui 技术解决的非常普遍的需求。我仍然喜欢认为在 android 中我还没有找到第 5 个选项。 有没有专家可以提供有关该主题的一些信息?
谢谢。
最佳答案
我认为 Android 布局非常适合大多数与用户交互的用例,但是(一个很大的但是)布局机制非常微妙,并且很难正确扩展。对于小的 tweeks 来说这很好,但如果你想做一些与众不同的事情(比如动画轮播),你可能还是会做免费的图形,所以你不需要扩展 Layout 的额外复杂性。这只是更多的限制,没有合理的附加值。
大多数应用程序都有一些标准的东西(ActionBar、按钮、首选项、对话框等),以及一个或多个“独特”元素。所以我的建议是对标准的东西使用标准布局,但对于您的独特元素,请使用以下之一:
1) SurfaceView - 非常易于使用。见官方Lunar Lander代码示例。 要查看 SurfaceView 的实际效果,您还可以查看 my app video,动画元素使用SurfaceView,一切都用RelativeLayout布局。
2) opengl - 这是在 Android 上进行图形处理的最强大的方法。它在 GPU 上运行,因此 CPU 可以自由地做其他事情。它是 3D(或 2D,如果您只使用一架飞机)。 我正在使用 libgdx ,而且很不错,学了一点也不难。
SurfaceView 和 opengl (GLSurfaceView) 都是 View ,因此它们可以像任何其他 View 一样添加到布局中
关于安卓自定义布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3268068/