Android ImageView - получить координаты касания (щелчка) независимо от местоположения прокрутки или масштаба увеличения - PullRequest
11 голосов
/ 04 ноября 2011

Фон: У меня есть ImageView, который я изменил, чтобы прокручивать (перетаскивать) и масштабировать (масштабирование).Я использовал точную технику, упомянутую в третьей книге «Здравствуй, Android», которую также можно найти здесь .Этот метод использует матричное преобразование для обработки как прокрутки, так и масштабирования.

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

Ответы [ 2 ]

32 голосов
/ 04 ноября 2011

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

// 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

2 голосов
/ 16 октября 2014

Вы также можете вычислить обратную матрицу и использовать метод 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);
...