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