Почему при вызове setPivot() не учитывается угол наклона (rotate)?
Есть две 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 Увы, награду отдать некому, но я пока оставлю этот вопрос в надежде что кто-то додумается. Или чуть попозже, когда вернусь к этой проблеме, то опубликую получившееся решение.