Android — настройка положения просмотра изображения поверх масштабируемого изображения

Я работаю над изображением, создавая функцию, которая позволяет пользователю размещать теги на изображениях (например, тег фотографии Facebook). У меня есть масштабируемый ImageView (с использованием TouchImageView Майка Ортиса) в качестве фонового изображения и некоторые ImageViews в качестве тегов изображений.

Каждый тег имеет положение X и Y, и нет проблем с отображением как фонового изображения, так и тегов изображений в правильном положении. Однако, когда пользователь запускает масштабирование, положение фонового изображения изменяется. Это означает, что положение каждого тега изображения также должно быть изменено/обновлено в соответствии с уровнем масштабирования текущего фонового изображения и положением прокрутки.

В настоящее время я использую этот метод:

float currentZoom = mImageView.getCurrentZoom();
float zoomedX = x / currentZoom;
float zoomedY = y / currentZoom;

Но когда я попытался, все пошло не так. Может ли кто-нибудь помочь мне найти правильный метод/уравнение?

ИЗМЕНИТЬ:

Я пытался использовать Matrix.mapPoints(), но не понимаю, как эта матрица может помочь мне решить мою проблему. Вот изображение для лучшего объяснения:

image


person Harry    schedule 30.10.2014    source источник
comment
используйте Matrix.mapPoints()   -  person pskink    schedule 30.10.2014
comment
Я пробовал это раньше. Это дало мне матрицу 3x3, хранящуюся в float[]. Оттуда я мог получить координату изображения, а также уровень масштабирования. Но это не решает мою проблему. Как найти координату тега изображения после масштабирования и прокрутки изображения?   -  person Harry    schedule 30.10.2014
comment
как я уже сказал, используйте Matrix.mapPoints(), используйте две точки с плавающей запятой, чтобы входной массив имел длину 2   -  person pskink    schedule 30.10.2014
comment
попробуйте Matrix m = tiv.getImageMatrix(); поплавок [] пт = {0, 0}; m.mapPoints (баллы); и посмотреть, что в 'pts'   -  person pskink    schedule 31.10.2014
comment
Я поместил ваш код в прослушиватель масштабирования в своем коде. Когда я выполняю масштабирование (масштаб масштабирования был 1,0941195), float[] pts дает мне [0] = -33.788258 и [1] = 4.5877075. Можете ли вы объяснить эти значения?   -  person Harry    schedule 31.10.2014
comment
пиксель [0, 0] вашего изображения рисуется в месте [-33.788258, 4.5877075]   -  person pskink    schedule 31.10.2014
comment
Я пробовал ваш метод. Он отлично работает для прокрутки изображений! Но теперь последняя проблема заключается в том, как получить позицию тега изображения X и Y после масштабирования?   -  person Harry    schedule 03.11.2014


Ответы (1)


Наконец-то я получил ответ (спасибо pskink)! Чтобы получить точную позицию тега на изображении, все, что нам нужно сделать, это использовать Matrix.mapPoints(). Но это само по себе не даст новой позиции X и Y после масштабирования. Мы должны умножить текущую позицию X и Y на текущий уровень масштабирования, чтобы получить «позицию после масштабирования». ".

Другими словами:

Matrix matrix = mImageView.getImageMatrix();
float[] pts = {0, 0};
matrix.mapPoints(pts);
float newTagX = (tagX * currentZoom) + pts[0];
float newTagY = (tagY * currentZoom) + pts[1];
person Harry    schedule 03.11.2014
comment
нет, нет, нет: float[] pts = {0, 0} было просто для тестирования, вам нужно использовать координаты тега float[] pts = {tagX, tagY} - person pskink; 03.11.2014
comment
Если я использую этот метод, теги изображения идеально привязаны к координате на фоновом изображении. Это означает, что независимо от того, насколько сильно я прокручиваю изображение, теги изображений остаются на своих текущих позициях (а это не то, чего я хотел). Я хочу, чтобы при прокрутке изображения позиции тегов обновлялись в соответствии с текущей позицией прокрутки. Поэтому мне нужно использовать фиксированную (0, 0) координату. Но все равно спасибо! - person Harry; 03.11.2014