Получить реальные координаты x и y пользователей

Мне нужно сопоставить координаты X, Y координат OnTouch с координатами Bitmap X, Y внутри ImageView, чтобы сделать это. Я использую следующий подход.

Однако этот подход работает, только когда я:
a) Полностью увеличьте изображение (полностью)

b) Работает в любом случае, если я делаю свое приложение на весь экран

  final int index = event.getActionIndex();
  touchLocation = new float[] {
    event.getX(index), event.getY(index)
  };

  Matrix matrix = new Matrix();
  ImageView view = getImageView();
  view.getImageMatrix().invert(matrix);

  matrix.postTranslate(view.getScrollX(), view.getScrollY());
  matrix.mapPoints(touchLocation);
  // touchLocation[0] is real x and [1] is real y  

Однако моя активность - это действие ActionBar, так что я получаю немного неправильное положение по оси Y. Я попытался вычесть высоту ActionBar и StatusBar, но это не всегда работает.

Что странно, так это то, что на полноэкранном режиме неважно, полностью ли я увеличиваю изображение или получаю изображение. Я всегда получаю правильные координаты, рассчитанные, однако, с любым другим видом деятельности, это не будет правильно отображать точки.

Ответ 1

Я использую этот код, чтобы получить фактическую ось касания на экране:

PointF p = new PointF(event.getX(), event.getY());
View v = this;// your view
View root = v.getRootView();
while (v.getParent() instanceof View && v.getParent() != root) {
  p.y += v.getTop();
  p.x += v.getLeft();
  v = (View) v.getParent();
}

Надеюсь, что это сработает и для вас.

Ответ 3

Убедитесь, что ваша панель действий и высоты состояния находятся в пикселях, а не dp а также вы можете использовать getRawX() и getRawY() вместо getX(), getY()

Ответ 4

Попробуйте этот путь

int[] viewCoords = new int[2];
imageView.getLocationOnScreen(viewCoords);
int touchX = (int) event.getX();
int touchY = (int) event.getY();

int imageX = touchX - viewCoords[0]; // viewCoords[0] is the X coordinate
int imageY = touchY - viewCoords[1]; // viewCoords[1] is the y coordinate

вы получите координаты x и y, используя этот способ

Ответ 5

Переопределите onTouchEvent (событие MotionEvent), а затем вызовите event.getX() и event.getY(), чтобы получить координатные позиции, где пользователь коснулся [они будут плавать]. (by: @antonyt)

Ответ 6

Шаг 1. Создайте один пользовательский CustomFrameLayout, расширяющий FrameLayout в вашем приложении, которое может взять один объект интерфейса в конструкторе. (интерфейс будет создан на шаге 3)

Шаг 2: Write/Override onInterceptTouchEvent.

Шаг 3: Создайте один интерфейс для отправки/получения желаемых параметров.

Шаг 4: Внедрите интерфейс и метод, созданные на шаге 3 в вашем действии/фрагменте

Шаг 5: В вашей деятельности/фрагменте создайте объект CustomFrameLayout с интерфейсом реализации.

Шаг 6: В режиме переопределенного настраиваемого макета передать значение активности через интерфейс

Надеюсь, что это сработает!


Создание демонстрации займет немного больше времени, скорее всего, опубликует как комментарий, но все равно опубликует как ответ, чтобы я мог когда-нибудь улучшить с помощью некоторого примерного кода.