我来自ActionScript / Flash / AIR背景,我是Android View层次结构的新手。鉴于此,我发现ViewGroup及其坐标系非常奇怪。
假设我们在主Activity视图中有以下父/子关系,它扩展了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()区域的优化。禁用剪辑后,结果会按预期呈现,但还有另一个问题:
向circle2添加触摸事件侦听器会返回一个伪造的触摸矩形(标记为紫色),而不是预期的一个(以青色标记),它应该盯着circle2的负[X,Y]偏移量。得到的矩形从'cont'的[0,0]开始,到[circle2X + circle2W,circle2Y + circle2H]结束,好像它被剪切在'cont'的[0,0]处。
我知道您可以通过不使用负坐标来解决问题,但如果您从ActionScript移植,其中负坐标非常有意义(如在任何现实世界坐标系中)并且计算触摸矩形,那么这不是一个很好的解决方案正确地在DisplayObjectContainer类中。
那么还有其他解决方案吗?
是否应该创建自定义ViewGroup类以及必须在那里完成哪些操作?
是否有一个神奇的设置,可以允许孩子的触摸矩形视图不被剪切到父ViewGroup的[0,0]?
还有别的吗?
感谢。
答案 0 :(得分:0)
您可以使用View#scrollTo
移动原点,以便您的内容完全显示在View的边界矩形内。
Android UI工具包中的许多内容依赖于视图的测量和布局范围是准确的。一般来说,你不想在这里反对谷物。