Android:将视图放置在任意位置

时间:2010-06-22 12:57:33

标签: android layout coordinates

我一直在尝试将视图放在任意位置。

我的目标:要覆盖JPG / PNG的某个矩形,给定与JPG / PNG 相关的坐标,以及其他一些视图,例如,图库,或者一些视频。

我不想使用AbsoluteLayout,因为它已被删除。

因此,我使用RelativeLayout,将虚拟文本框定义为占位符,并将我的视图RIGHT_TO和BELOW放在文本框中。

+--------+
|TextView|
|        | (x,y)
+--------+-----------------------+
         |                       |
         |     My View           |
         |                       |
         +-----------------------+

我的问题是:有更健壮,更优雅的方式吗?

上面提到的问题是,它非常脆弱:需要为每个新屏幕重新计算坐标。我的观点覆盖了以下内容。它需要准确放置,这很难做到。

  • 每当旋转或缩放或其他任何时候,我都需要再次布局屏幕。的更糟:
    • 在初始时,放置图像的典型时间,屏幕坐标无效。将实体放在屏幕上后坐标有效。为了准确地将实体放置在屏幕上,我们需要坐标。鸡肉和鸡蛋问题:(
    • 在旋转时,坐标包括边距而不是视图本身的宽度(例如:在纵向AVD上,显示纵向ImageView,然后按CTRL + F12旋转。左边,右边,顶部和底部ImageView完全没有预期的那样。)
    • 缩放动画时,缩放坐标。

所以我想找到一个更好的方法来做到这一点。

Thanks
    M.

2 个答案:

答案 0 :(得分:2)

不完全理解你在做什么,看起来你正在通过使用RelativeLayout为自己做额外的工作。你想要在屏幕上放置的东西与任何东西都不相关,它基于图像中的特定坐标,所以即使你使用其他布局之一,你仍然基本上放置一些绝对坐标。

至于AbsoluteLayout被弃用,从我所看到的仅仅是为了阻止它的使用,因为它与可变屏幕尺寸有关。他们无意实际删除它,即使他们这样做,你也可以获得源代码并将其编译到你的项目中。

答案 1 :(得分:2)

解决方案非常难看,它不是相对的,但有些人可能会说这似乎是合理的:

将FrameLayout添加为容器(而不是下面提到的RelativeLayout)。要显示的视图是该FrameLayout的子视图。 要将其放置到位,请添加填充。

void addViewInAnArbitraryRect( Rect rect, 
                               Context context, 
                               View subjectView, 
                               View parent ) {
    FrameLayout container = new FrameLayout( context );
    parent.addView( container );
    container.setPadding( rect.left,
                          rect.top,
                          container.getWidth() - rect.right,
                          container.getHeight() - rect.bottom );
    container.addView( subjectView );

}

注意:您可能需要将页面坐标调整为屏幕上的坐标。记住:

  1. 在调用onSizeChanged之前,坐标/宽度/高度尚未就绪。
  2. 不要操纵onSizeChanged范围内的视图,否则它可能会裁剪您的视图。必须从创建它们的线程的上下文中操纵视图。使用Handler。
  3. 我希望它有所帮助。

    Meymann