Android: ViewGroup 和触摸矩形中的负坐标

Android: negative coordinates in ViewGroup and touch rectangles

我来自 ActionScript/Flash/AIR 背景,我是 Android 视图层次结构的新手。鉴于此,我发现 ViewGroup 及其坐标系有些奇怪。

假设我们在主 Activity 视图中有以下 parent/child 关系,它扩展了 RelativeView(或者基本上是一些允许绝对坐标和比例的组布局):

circle1 = new ImageView(context);
circle1.setImageBitmap(...);
circle2 = new ImageView(context);
circle2.setImageBitmap(...);
cont = new RelativeView(context);

cont.addView(circle1);
cont.addView(circle2);
this.addView(cont);

我们的想法是创建一个以主视图为中心的容器,并以容器内的两个圆圈为中心。这允许容器动画,将两个圆分组。

cont.setX(getWidth() / 2);
cont.setY(getHeight() / 2);
circle1.setX(-circle1.getWidth() / 2);
circle1.setY(-circle1.getHeight() / 2);
circle2.setX(-circle2.getWidth() / 2);
circle2.setY(-circle2.getHeight() / 2);

在 ViewGroup 中做负坐标,我立即注意到 'cont' 将它们剪辑在 [0, 0] 坐标和 cont.setClipChildren(false) 处;必须被调用。我猜这是个坏主意,因为它看起来像是对 invalidate() 区域的优化。禁用裁剪后,结果呈现如预期,但还有一个问题:

illustration

向 circle2 添加触摸事件侦听器 returns 一个伪造的触摸矩形(标记为紫色)而不是预期的触摸矩形(标记为青色),它应该盯着负 [X, Y] 偏移量圈子2。生成的矩形从 'cont' 的 [0, 0] 开始,到 [circle2X + circle2W, circle2Y + circle2H] 结束,就好像它在 'cont' 的 [0, 0] 处被剪裁一样。

我知道你可以通过不使用负坐标来解决这个问题,但是如果你从 ActionScript 移植,负坐标非常有意义(就像在任何现实世界的坐标系统中一样)并且触摸矩形,那并不是一个很好的解决方案在 DisplayObjectContainer class.

中正确计算

那么还有哪些解决方案呢?

谢谢。

您可以使用 View#scrollTo 移动原点,以便您的内容完全显示在视图的边界矩形内。

Android UI 工具包中的许多内容都依赖于视图的测量和布局边界是否准确。一般来说,你不想在这里违背常理。