У меня есть следующая проблема, которую я пытался решить целый день.
Я загружаю растровое изображение с соответствующими ему высотой и шириной в ImageView.
Затем я использую матрицу для перемещения, масштабирования и поворота изображения.
Для масштабирования я использую метод postScale.
Для перемещения я использую метод postTranslate.
Только для Вращения я использую метод preRotate.
Теперь мне нужно получить коэффициент, с которым я масштабировал изображение, потому что позже мне нужен этот фактор в другой программе.
Использование значений матрицы MSCALE_X и MSCALE_Y подходит только до тех пор, пока у меня не будет вращения. Если я повернул изображение, значения масштаба больше не соответствуют (потому что матрица умножалась на формулу, которая показана в API).
Теперь мой вопрос:
Как я могу получить масштабный коэффициент изображения после его поворота?
Для коэффициента вращения (градусы) это просто, потому что я храню его в дополнительной переменной, которая уменьшается / уменьшается во время вращения.
Но для масштабного коэффициента это не работает, потому что, если я сначала уменьшу изображение до 50%, а затем масштабирую его до 150%, то я масштабировал его с коэффициентом 3, но исходный коэффициент масштабирования составляет всего 1,5).
Другой пример. Даже если я не изменил масштаб изображения, он даже изменит коэффициент масштабирования, если я поверну его.
// Изменить:
В конце концов, я решил проблему самостоятельно :) (немного по математике, а потом понял что-то интересное (или, скажем, очевидное)).
Вот мое решение:
Я понял, что значения MSCALE_X и MSCALE_Y вычисляются с помощью функции косинуса (да, базовая математика ...). (Использование поворота на 0 ° приводит к правильному scalingWidth и scalingHeight в пределах X и Y). (90 и 270 ° приводит к scalingWidth / Height, равному 0 и 180 °, приводит к scalingWidth / Height, умноженному на -1).
Это приводит меня к мысли написать следующую функцию:
Эта функция сохраняет текущую матрицу в новой матрице. Затем он поворачивает новую матрицу в начальное состояние (0 °). Теперь мы можем прочитать не нарушенные значения MSCALE_X и MSCALE_Y в нашей матрице (которые сейчас являются правильными коэффициентами масштабирования)