Здесь я вижу две проблемы.
Одна проблема заключается в том, что вы получаете положение ваших объектов в окне, где вы должны просто использовать положение объектов в их родительском контейнере.Это проще, быстрее и больше того, что вы ищете - где объекты живут в своей компоновке.Если они не находятся в одном и том же контейнере, то вам может потребоваться получить позицию в окне или на экране, а затем просто работать с дельта-значениями (разница в их расположениях, а не сами абсолютные местоположения).
Вы можете получить эти простые позиции контейнера из методов getLeft () и getTop () в View.
Вторая проблема заключается в том, что параметры TranslateAnimation не выполняют то, что, по вашему мнению, они делают.Числовые значения (второе, четвертое, шестое и восьмое значения) указывают начальное и конечное местоположения целевого объекта как смещения от его текущего местоположения .Вот почему в объявлении метода есть слово «дельта».Таким образом, вам не следует отправлять абсолютные координаты позиций объекта, а, скорее, дельты, которые они должны иметь.
Предположим, что вы вычислили xDelta и yDelta как разность x и y междуисходные и целевые позиции.Если вы анимируете источник в целевую позицию, то вы должны использовать что-то вроде 0, xDelta, 0, yDelta для этих значений.
Обратите внимание, что TranslateAnimation () физически не перемещает объект - он просто рисуетэто в другом месте.Поэтому, как только анимация будет завершена, объект вернется в исходное положение.Возможно, вы захотите установить свойство fillAfter, чтобы сохранить его конечное местоположение на экране после завершения анимации.