Android:ViewGroup和touch矩形中的负坐标

Android:ViewGroup和touch矩形中的负坐标,android,touch,coordinates,rectangles,viewgroup,Android,Touch,Coordinates,Rectangles,Viewgroup,我来自ActionScript/Flash/AIR的背景,对Android视图层次结构来说是个新手。有鉴于此,我发现ViewGroup及其坐标系有些奇怪 假设我们在主活动视图中有以下父/子关系,它扩展了RelativeView或一些基本上允许绝对坐标和比例的组布局: circle1 = new ImageView(context); circle1.setImageBitmap(...); circle2 = new ImageView(context); circle2.setImageBit

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

假设我们在主活动视图中有以下父/子关系,它扩展了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);
在视图组中使用负坐标时,我立即注意到“cont”在[0,0]坐标处对其进行剪辑,而cont.setClipChildrenfalse;必须打电话。我猜这是个坏主意,因为它看起来像是对失效区域的优化。禁用剪裁后,结果将按预期呈现,但存在另一个问题:

将触摸事件侦听器添加到circle2会返回一个用紫色标记的伪触摸矩形,而不是预期的用青色标记的矩形,该矩形应位于circle2的负[X,Y]偏移处。生成的矩形从“cont”的[0,0]开始,到[circle2X+circle2W,circle2Y+circle2H]结束,就好像它被剪切到了“cont”的[0,0]一样

我知道不使用负坐标可以解决这个问题,但如果您从ActionScript移植,负坐标在任何现实世界坐标系中都有完美的意义,并且在DisplayObjectContainer类中正确计算了触摸矩形,那么这并不是一个好的解决方案

那么还有什么其他的解决方案呢

是否应创建自定义ViewGroup类,以及在该类中必须执行哪些操作

是否有一种神奇的设置,可以使子视图的触摸矩形不被剪裁在父视图组的[0,0]处

还有别的吗

谢谢。

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


Android UI工具包中的许多东西都依赖于视图的测量和布局范围是否准确。一般来说,您不想在这里违反规则。

这与android:clipchildren有关吗?默认情况下,这是错误的?Derp,没关系,当我执行a:Rect out=new Rect;圆圈2.getHitRectout;out包含圆圈2的正确hitRect值。i、 e.左侧和顶部的否定值。似乎父视图组根本不允许以负偏移量进行触摸。谢谢。您的解决方案是有效的,因此我将其标记为有效。一旦应用了scrollTo,触摸点击矩形就可以工作了,但是副作用当然是视图组的全部内容都被移动并滚动。因此,为了补偿“cont”的[X,Y]也必须进行调整。这接近于复杂性,但与我已经知道并在OP中提到的一种解决方案不太复杂,即根据其较大子对象的大小定位“cont”,而不使用负坐标。遗憾的是,这样的设计模式使最终开发人员更容易参与。