Я работаю с ActionScript/Flash/AIR и плохо знаком с иерархией Android View. Учитывая это, я нашел что-то очень странное в 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);
Выполняя отрицательные координаты внутри ViewGroup, я сразу заметил, что 'cont' обрезает их по координате [0, 0] и cont.setClipChildren(false); надо позвонить. Я предполагаю, что это плохая идея, потому что это похоже на оптимизацию для области invalidate(). После отключения обрезки результат отображается так, как ожидалось, но есть еще одна проблема:
Добавление прослушивателя события касания к кругу2 возвращает поддельный прямоугольник касания (отмечен фиолетовым) вместо ожидаемого (отмечен голубым), который должен смотреть на отрицательное смещение [X, Y] круга2. Результирующий прямоугольник начинается с [0, 0] из «cont» и заканчивается в [circle2X + circle2W, circle2Y + circle2H], как если бы он был обрезан в [0, 0] из «cont».
Я знаю, что вы можете решить проблему, не используя отрицательные координаты, но это не очень хорошее решение, если вы переносите из ActionScript, где отрицательные координаты имеют смысл (как в любой системе координат реального мира), а сенсорные прямоугольники правильно рассчитываются в Класс DisplayObjectContainer.
Итак, какие еще решения существуют?
Нужно ли создавать собственный класс ViewGroup и что там нужно делать?
Есть ли волшебная настройка, которая позволяет не обрезать сенсорные прямоугольники дочерних представлений в [0, 0] родительской ViewGroup?
Что-то другое?
Спасибо.