ImageView неверные координаты X Y

У меня возникли проблемы с получением правильных координат (XY) для моего ImageView.

Мой макет выглядит следующим образом:

<Relativelayout>
    <Relativelayout>
        <LinearLayout>
            //I want to get the X and Y of this imageview
            <ImageView/>
        </LinearLayout>
    </Relativelayout>
</Relativelayout>

Посмотрев на вопрос похожий, я реализовал следующее:

int[] img_coordinates = new int[2];
mImageView.getLocationOnScreen(img_coordinates);
double x = (double)img_coordinates[0];
double y = (double)img_coordinates[1];

На всякий случай я добавил это в ViewTreeObserver, вот так:

mImageView.getViewTreeObserver().addOnGlobalLayoutListener(
    new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            int[] img_coordinates = new int[2];
            mImageView.getLocationOnScreen(img_coordinates);
            float x = (double)img_coordinates[0];
            float y = (double)img_coordinates[1];
    }
});

У меня проблема в том, что возвращаемые XY неверны.


Мой вопрос:

Есть ли причина, по которой я получаю неправильные координаты и как я могу получить правильные?


Обновлено:

Я решил предоставить весь свой XML-файл макета с помощью pastebin, потому что он очень большой и потребуется некоторое время, чтобы отформатировать его в SO. Здесь - это ссылка.

Кроме того, вот изображение того, чего я хотел бы достичь:

ImageView неверные координаты X Y

@pskink какой ответ вы имеете в виду?

HB. 13.12.2018 08:07

@pskink да, потому что это вообще не работает.

HB. 13.12.2018 08:09

Я сбит с толку. Вам нужны координаты самого ImageView или координаты события касания для масштабированного Bitmap?

Mike M. 13.12.2018 08:09

@MikeM. Я хочу координаты самого ImageView.

HB. 13.12.2018 08:13

@pskink Вы уверены, что связали правильный пост?

Mike M. 13.12.2018 08:14

HB., Как координаты у тебя неверные? То есть какие значения вы получаете и каковы ожидаемые значения?

Mike M. 13.12.2018 08:16

@pskink Да, я думаю, им просто нужны ImageView (x, y).

Mike M. 13.12.2018 08:19

@MikeM. У меня есть 2 ImageView, на вопрос, который я только что упомянул, для простоты. Когда я нажимаю кнопку, я хочу переместить один ImageView поверх другого, получив XY целевого ImageView. В настоящее время изображение перемещается в неправильную позицию, а не поверх другого. Надеюсь, это имеет смысл.

HB. 13.12.2018 08:20

Что ж, вы не можете сделать это внутри LinearLayout. Он не будет перекрывать своих дочерних элементов, если это то, что вы подразумеваете под «сверху».

Mike M. 13.12.2018 08:21

@MikeM. Что вы предлагаете мне делать?

HB. 13.12.2018 08:23

@MikeM. Я забыл упомянуть, что второе изображение, которое я хочу переместить, находится не внутри LinearLayout.

HB. 13.12.2018 08:24

Ой, ну это другое. Какой бы общий предок ViewGroup у них ни был, он должен быть таким, который допускает перекрытие дочерних элементов; например, FrameLayout или RelativeLayout. Затем вам нужно будет основывать их координаты на их положении в пределах этого предка.

Mike M. 13.12.2018 08:28

Это все обобщения, потому что не совсем понятно, что вы собираетесь делать. Вы, вероятно, захотите показать нам фактическую компоновку с обоими ImageView на своих местах.

Mike M. 13.12.2018 08:32

@MikeM. Пожалуйста, покажитесь моим редактором, я предоставил изображение того, чего я хотел бы достичь / сделать, и ссылку на мой макет .xml.

HB. 13.12.2018 08:57

Честно говоря, есть более простые способы сделать это. Лично я бы написал кастомный View для такой игровой доски. Однако, если вы хотите придерживаться доступных View и ViewGroup, вы можете значительно упростить макет. Например, основная плата может содержать 64 ImageView в одном GridLayout. Если вы разместите это внутри корневого RelativeLayout, а затем добавите свою часть View к этому корню, это будет просто вопрос установки части на смещения GridLayout, плюс смещения цели; то есть что-то вроде: piece.setX(gridLayout.getX() + target.getX());, и то же самое для Y

Mike M. 13.12.2018 09:08

@MikeM. В этом есть смысл, я также думаю, что это уменьшит объем моего кода. Вместо этого я попробую. Спасибо, что нашли время ответить.

HB. 13.12.2018 09:23
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
16
60
0

Другие вопросы по теме