Android ImageView – получить координаты нажатия (щелчок) независимо от местоположения прокрутки или масштаба масштабирования

Предпосылки: У меня есть ImageView, который я модифицировал для прокрутки (перетаскивания) и масштабирования (масштабирование). Я использовал точный метод, упомянутый в книге «Hello, Android» 3-го издания, который также можно найти здесь . Этот метод использует матричное преобразование для обработки прокрутки и масштабирования.

Моя проблема. Когда пользователь нажимает на изображение, мне нужны координаты этого касания по отношению к самому изображению, независимо от того, как изображение было прокручено или увеличено. Например, если мое изображение 1000×2000, и я просматриваю и увеличиваю изображение. Затем я нажимаю на изображение в определенный момент, я хочу знать, что это за точка относительно 1000×2000, а не только область экрана. Как я могу это сделать?

Solutions Collecting From Web of "Android ImageView – получить координаты нажатия (щелчок) независимо от местоположения прокрутки или масштаба масштабирования"

Я нашел решение для этого, используя бит информации, которую я собрал вместе с другими вопросами на этом сайте. Чтобы вернуть сообщество, я подумал, что правильно делиться тем, что я узнал. Надеюсь, это поможет кому-то:

// Get the values of the matrix float[] values = new float[9]; matrix.getValues(values); // values[2] and values[5] are the x,y coordinates of the top left corner of the drawable image, regardless of the zoom factor. // values[0] and values[4] are the zoom factors for the image's width and height respectively. If you zoom at the same factor, these should both be the same value. // event is the touch event for MotionEvent.ACTION_UP float relativeX = (event.getX() - values[2]) / values[0]; float relativeY = (event.getY() - values[5]) / values[4]; 

Благодаря этим источникам: источник 1 и источник 2

Вы также можете вычислить обратную матрицу и использовать метод mapPoints ():

  // Get the inverse matrix Matrix inverseMatrix = new Matrix(); matrix.invert(inverseMatrix); // Transform to relative coordinates float[] point = new float[2]; point[0] = e.getX(); point[1] = e.getY(); inverseMatrix.mapPoints(point);