Какова единица системы координат Canvas? - андроид

Я обнаружил, что единица измерения системы координат Canvas отличается от единицы измерения экрана.

Например, в моем случае, как показано ниже:

Для одной конкретной точки ее экранная координата, полученная из ImageView.getX() и ImageView.getY(), равна (336, 578).

Затем методом проб и ошибок я рисую точку на холсте так, чтобы эта точка находилась ТОЧНО в том же положении, что и ImageView. Для этого я вызвал canvas.drawCircle(330, 440, radius, paint);.

Вот вопрос:

Почему две координаты (336, 578) и (330, 440) отличаются друг от друга?

Это потому, что экран и холст используют разные единицы измерения?

Это проблема с пикселем, dp и всем этим?


person Sibbs Gambling    schedule 12.07.2013    source источник


Ответы (2)


Вы можете попробовать преобразовать координаты окна и обратно, используя View.getLocationInWindow таким образом, вы всегда будете уверены, что используете одну и ту же систему координат.

Координаты ImageView.getX и Y указаны относительно родителя. Координаты холста относятся к виду. Это может вызвать различия

Изменить: я предполагаю, что в одном месте вы получаете координаты вида (используя getX и getY). Преобразуйте их в координаты окна. Назовите их viewXY[].

Когда вам нужно использовать их для рисования на холсте, также преобразуйте верхнюю и левую координаты в координаты окна. Мы называем их canvasXY[].

Теперь X позиция для рисования будет viewXY[0] - canvasXY[0], а Y позиция будет viewXY[1] - canvasXY[1].

person nickmartens1980    schedule 12.07.2013
comment
Что означают координаты окна, полученные от View.getLocationInWindow, пожалуйста? - person Sibbs Gambling; 12.07.2013
comment
Кажется, это имеет большой смысл. Как я могу объединить 2 координаты? Спасибо! - person Sibbs Gambling; 12.07.2013
comment
Я добавил еще несколько описаний, как это сделать. Надеюсь, поможет - person nickmartens1980; 12.07.2013

Координаты положения представления всегда относятся к его родителю. Это все равно, что сказать, где по отношению к его родителю находится это представление.

Там в другом дело, скрин Координат. Это говорит о том, где относительно верхней/левой части окна (думаю, реальный физический экран) находится этот объект. Это можно получить через View.getLocationOnScreen.

Если вы хотите сравнить два местоположения, они будут эквивалентны только в том случае, если родительский вид обоих этих местоположений одинаков или вы используете абсолютные координаты экрана. В противном случае вы получите только результаты, которые «кажутся» другими.

Если вы хотите объединить их, либо отнесите их к общему родителю, либо используйте абсолютные координаты.

person Code Poet    schedule 12.07.2013
comment
это имеет большой смысл. Итак, я могу нарисовать точку на холсте с абсолютным местоположением экрана?? Как я могу это сделать? X и y в canvas.drawCircle(x, y, radius, paint) — это просто 2 числа с плавающей запятой. Как я могу сообщить функции, что хочу использовать абсолютное местоположение экрана? - person Sibbs Gambling; 12.07.2013