Android: как определить местоположение касания в ImageView, если изображение отображается в масштабе матрицы? - PullRequest
16 голосов
/ 18 мая 2011

Я установил OnTouchListener для ImageView и внедрил метод onTouch, но если изображение масштабируется с использованием матрицы, как рассчитать местоположение касания?

Или событие движения автоматически учитывает это при возврате getX() и getY()?

Ответы [ 3 ]

41 голосов
/ 14 сентября 2011

getX и getY вернут местоположение касания в системе координат ImageView. Если вы ищете точку в системе координат изображения, вы можете использовать обратную матрицу матрицы, используемой ImageView. Я сделал что-то вроде следующего:

// calculate inverse matrix
Matrix inverse = new Matrix();
imageView.getImageMatrix().invert(inverse);

// map touch point from ImageView to image
float[] touchPoint = new float[] {event.getX(), event.getY()};
inverse.mapPoints(touchPoint);
// touchPoint now contains x and y in image's coordinate system
6 голосов
/ 09 августа 2014

Ответ Zorgbargle верный, но при загрузке изображений из папки ресурсов и при плотности устройства используется другое соображение.

Масштабирование изображений Android основано на плотности устройства, поэтому вы , если у вас есть толькоизображение в папке mdpi , вы также должны разделить точки на плотность, чтобы найти реальную точку на изображении:

float[] point = new float[] {event.getX(), event.getY()};

Matrix inverse = new Matrix();
imageView.getImageMatrix().invert(inverse);
inverse.mapPoints(point);

float density = getResources().getDisplayMetrics().density;
point[0] /= density;
point[1] /= density;
0 голосов
/ 09 августа 2011

Попробуйте использовать getRawX () и getRawY ().Обратите внимание, что это не регулируется для размера представления, поэтому вам может потребоваться смещение, если приложение не полноэкранное.

...