EDIT: Раздвоенный оригинальную суть и обновлять его, view it here. Это было немного сложнее, чем я думал. Поворотная точка по умолчанию для масштабирования представляет собой центр представления. Для того, чтобы сделать эту работу, я должен был установить вид шарнир к (0,0) и настроить перевод для поворота от жеста пользователя.
Я заметил в вашем onScale()
переопределение вы звоните scaleDetector.getScaleFactor()
, но вы не вызывая scaleDetector.getFocusX()
и scaleDetector.getFocusy()
. Эти методы говорят вам, что является фокусом масштабирования. Вам нужно будет вызвать эти методы и получить эту координационную точку (x, y), затем выполнить некоторые вычисления, чтобы вычислить перевод, необходимый для сохранения этой фокальной точки. Вам нужно будет это сделать в своихи dy
значениях, чтобы перевод учитывал фокус.
Для расчета перевода вы должны взять фокусную точку и умножить значения x и y на изменение масштабного коэффициента. Это говорит о том, как далеко перемещается точка с заданной координационной точкой (0,0). Таким образом, вы должны вычесть x (обновленный) из x (оригинал) и y (обновленный) из y (оригинал), чтобы получить этот вектор перемещения. Ваши значения перевода - это отрицательные значения вектора. Итак:
scale(delta) = scaleDector.getScaleFactor() -- just the change, not the new scale factor
translation x = x(focal) - x(focal) * scale(delta)
translation y = y(focal) - y(focal) * scale(delta)
Так, очевидно, вы бы добавить эти значения в ваших dx
и dy
значений для перевода.
Не понимайте, что вы имеете в виду. Не могли бы вы привести пример более подробно. Потому что я новичок в этом, поэтому я не понимаю, что вы говорите. Спасибо –
См. Мой обновленный ответ. –
@KrisLarson: как насчет сброса макета при двойном нажатии? – abcd1234