Вопрос по imageview, android, java – Почему в ImageView getX, getY, setX и setY не представляют фактическое значение в относительном макете?

8

Я пытаюсь сделать простое приложение, чтобы лучше понять, как использовать сенсорные события на Android. Прямо сейчас моя активность просто перемещает ImageView к координатам касания на экране (координаты MotionEvent). Я мог бы сделать это, применив простой трюк, чтобы установить новую позицию изображения в значение, которое состоит из координат касания относительно позиции изображения (getX() а такжеgetY()).дх а такжеду переменные ответственны за сохранение этих относительных значений, поэтому касание остается постоянным внутри изображения.

Теперь я хочу поместить 2 ImageViews в Activity и иметь только два фиксированных места для ImageViews, и как только пользователь перетаскивает один ImageView поверх центра другого ImageView, два изображения меняются местами, но для правильного выполнения я хотел бы получить реальные координаты центра изображения. Я прокомментировал части кода, которые заставляют его работать правильно, чтобы показать проблему. Как вы можете видеть впервая картинка когда представление создается, координаты изображения просто(0, 0)независимо от того, где он находится (до тех пор, пока начальная позиция определяется как параметр макета, например,CENTER_IN_PARENT).

Как вы можете видеть ввторая картина и насколько я наблюдал ImageViewgetX() а такжеgetY() вернуть координату, как если бы верхний левый угол изображения находился в верхнем левом углу экрана, когда изображение расположено в верхнем левом углу окна ACTIVITY.

Я хотел бы понять, почему это происходит, и если кто-нибудь знает, как на самом деле получить координаты ImageView, которые можно напрямую сравнить с координатами MotionEvent.

Фотографий:

ПЕРВАЯ КАРТИНА

ВТОРАЯ КАРТИНА

Ваш Ответ

1   ответ
14

getX(), getY(), setX(), а такжеsetY() не отображать положение вида на экране, но я выяснил, как получить фактическое расположение объектов вида на экране:getLocationOnScreen(coordinates), гдеcoordinates 2-позиционный массив int (ИНТ [2]).

Например, чтобы получить реальное значение, соответствующее верхнему левому углу моего ImageViewimage Мне просто нужно сделать что-то вроде:

int[] img_coordinates = new int[2];
ImageView image = (ImageView) findViewById(R.id.myImage);

image.getLocationOnScreen(img_coordinates);

И тогда я действительно могу сравнить эти координаты с событиями TouchgetRawX а такжеgetRawY.

Если я хочу получить центральную точку зрения, мне просто нужно сделать это:

x_center = (double)img_coordinates[0] + image.getWidth()/2.0;
y_center = (double)img_coordinates[1] + image.getHeight()/2.0;

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

Похожие вопросы