Android: как определить местоположение касания на ImageView, если изображение масштабируется по матрице?

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

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

Ответы

Ответ 1

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 coordinate system

Ответ 2

Ответ 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;

Ответ 3

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