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(). Обратите внимание, что это не зависит от размера представления, поэтому вам может потребоваться компенсировать, если приложение не полноэкранное.