安卓自定义布局

29
我昨天花了一些时间来解决Android布局(…或更好的自定义布局)。 对于一般目的,Android提供的现成布局已经足够了。 但是当涉及到更复杂的用例时(比如采取椭圆路径布置的重叠图像的旋转木马),我很快意识到Android API的限制和复杂性。 这是我的方法:
  1. 使用现成的布局不是一个选项(有太多无法处理的问题),然而需要添加到容器中的图形对象(例如ImageView)在内置动画中进行平移、旋转等操作是必要的。

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

  3. 下一步最合理的事情是编写自己的布局,子类化神秘ViewGroup..这就是整个过程分崩离析的地方(至少对我来说是这样的)。这个过程很复杂、易错,并且很棘手,就像为swing编写自己的自定义布局一样(我几年前的确这样做了,我记得它更简单)。

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

结论是,除非我错过了什么,否则当前Android架构与其他UI技术(例如Flash或JavaFX)提供的编程范例有些远离。 原因是,在JavaFX中,Scene对象(类似于Android的View概念)默认提供绝对布局。 然后,您可以根据需要应用其他现成布局。 但是对于需要自定义布局的情况,您无需执行任何操作。

我有点惊讶,因为在Android中这个选项不可用,在其他用户界面技术中已经解决了一个非常普遍的需求。我仍然希望在Android中能找到第五个选项。

有没有专家能提供一些关于这个主题的信息呢?

谢谢。


2
很棒的问题!这是我的几乎相同的问题:http://stackoverflow.com/questions/4953351/android-how-to-draw-a-letter-at-a-specific-point ... 如果你不能利用它们,为什么要有所有这些视图和动画呢? - user317033
4个回答

4
我认为Android布局非常适合与用户的大多数交互使用情况,但是(有一个大但是),布局机制非常微妙,正确扩展它很棘手。对于小调整来说还好,但如果您想做一些非同寻常的事情(例如动画旋转木马),那么您可能会自由绘制图形,因此您不需要扩展布局的额外复杂性。这只是更多需要遵守的限制,没有可证明的附加价值。
大多数应用程序都有一些标准内容(ActionBar、按钮、首选项、对话框等),以及一个或多个“独特”的元素。因此,我的建议是使用标准布局处理标准内容,但对于您的独特元素,请使用以下之一:
1)SurfaceView - 很容易使用。请参见官方Lunar Lander代码示例。 要查看SurfaceView的实际效果,您还可以查看我的应用程序视频,其中使用SurfaceView进行动画元素,并且所有内容都使用RelativeLayout布局。

2) OpenGL - 它是在Android上进行图形处理最强大的方式。它在GPU上运行,因此CPU可以空闲去做其他事情。而且它是3D的(如果你只使用一个平面,则为2D)。 我正在使用libgdx,它非常棒,在短时间内学习后并不难。

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


2
这是一个非常好的问题。我目前正在编写3.0及以上版本的程序,并已经决定在许多情况下坚持使用AbsoluteLayouts。虽然它被设置为过时,但编译3.0左右的版本很可能仍能在4及更高版本的系统上运行一段时间。我自己也在寻找这个答案(针对将来削减它的操作系统版本)。他们削减它的原因是因为Android上没有屏幕分辨率的标准化。

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

好问题:-)


根据Android开发团队的Dianne Hackborn所说,“我再次强调:我们不会在未来的版本中删除AbsoluteLayout,但我们强烈不建议人们使用它。”。因此,如果它确实是最符合您需求的选择,请使用它。 - jk7

1

现在两个链接都已经失效了。当你在回答中包含外部链接时,你应该始终提供响应的摘要。 - manfcas

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接