Почему при вызове setPivot() не учитывается угол наклона (rotate)?

Рейтинг: 1Ответов: 0Опубликовано: 03.03.2023

Есть две view, одна вложена в другую. На внешней установлен слушатель жестов (OnTouchListener), внутренняя подвергается трансформациям scale, rotate и translate. При жестах rotate и pinch to zoom мне необходимо устанавливать точку pivot. Я это делаю так:

private void setPivot(float focusX, float focusY) {
  PointF newPivot = new PointF(
    (focusX - scroll.x + pivot.x * (scale.x - 1)) / scale.x,
    (focusY - scroll.y + pivot.y * (scale.y - 1)) / scale.y
  );

  PointF newScroll = new PointF(
    scroll.x - (pivot.x - newPivot.x) * (scale.x - 1),
    scroll.y - (pivot.y - newPivot.y) * (scale.y - 1)
  );

  pivot = newPivot;
  contentView.setPivotX(pivot.x);
  contentView.setPivotY(pivot.y);

  scroll = newScroll;
  contentView.setTranslationX(scroll.x);
  contentView.setTranslationY(scroll.y);
}

Точка focus берется с внешней view вот так:

private PointF getCenter(MotionEvent event) {
  int action = event.getAction() & MotionEvent.ACTION_MASK;
  int index = event.getActionIndex();

  float sumX = 0;
  float sumY = 0;
  int num = 0;

  for (int i = 0; i < event.getPointerCount(); i++) {
    if (action == MotionEvent.ACTION_POINTER_UP && index == i) {
      continue;
    }

    sumX += event.getX(i);
    sumY += event.getY(i);
    num++;
  }

  return new PointF(sumX / num, sumY / num);
}

Проблема в том, что в setPivot() не учитывается rotate (угол наклона внутренней view). Без трансформаций rotate все работает отлично, но с трансформацией наклона при повторных вызовах setPivot() происходит скачок внутренней view.

Вопрос: Каким образом правильно рассичитать pivot с учетом rotate?

UPD Увы, награду отдать некому, но я пока оставлю этот вопрос в надежде что кто-то додумается. Или чуть попозже, когда вернусь к этой проблеме, то опубликую получившееся решение.

Ответы

Ответов пока нет.