Как получить значение масштабирования произвольной матрицы?

Изображение масштабируется матрицей:

Matrix matrix = new Matrix(); matrix.postScale(...); matrix.postTranslate(...); matrix.postRotate(...); ... 

Я надеюсь, что увеличенное изображение будет не меньше половины оригинала, поэтому общий масштаб не должен быть меньше 0,5.

Но как это сделать? Я попытался проверить первое значение матрицы:

 float pendingZoom = 0.6f; float[] values = new float[9]; Matrix.getValues(values); float scalex = values[Matrix.MSCALE_X]; 

Затем:

 if(scalex<0.5) { pendingZoom = pendingZoom * (0.5f / scalex); } 

К сожалению, иногда это не работает. Если изображение было повернуто, scalex может быть отрицательным, pendingZoom тоже будет отрицательным.

Как это сделать правильно?


ОБНОВИТЬ

Я только что нашел values[Matrix.MSCALE_X] не является реалистичным значением масштабирования. Я использую его для вычисления новой ширины прямоугольника, это неверно.

Вместо этого я попытался сопоставить две точки по матрице и вычислить два расстояния:

 PointF newP1 = mapPoint(matrix, new PointF(0, 0)); PointF newP2 = mapPoint(matrix, new PointF(width, 0)); float scale = calcDistance(newP1, newP2) / width; 

Теперь я могу получить правильное значение scale . Но я не уверен, что это лучшее решение.

  float scalex = values[Matrix.MSCALE_X]; float skewy = values[Matrix.MSKEW_Y]; float scale = (float) Math.sqrt(scalex * scalex + skewy * skewy); 

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

Вы можете просто взять абсолютное значение

 Math.abs(mMatrixValues[Matrix.MSCALE_X]); 
Intereting Posts
Как создать тестовый модуль для тестирования библиотеки Android в IntelliJ IDEA Задача «установить» Gradle Maven не работает с проектом библиотеки Android Удалить нежелательное разрешение WAKE_LOCK, объединенное с библиотекой Коснитесь координат в текстовом режиме IntelliJ – Проект Android – Не удалось обновить Gradle Отображать значок emoji / emotion в Android TextView Не удалось получить уведомление GCM в некоторых устройствах Android в фоновом режиме Исключение при попытке вызова (SIP) Ошибка EditText: дубликаты контента после нажатия символа ограничения Как запустить тест Travis-CI и Espresso Android GoogleMap или SupportMapFragment – исключение нулевого указателя RecyclerView: java.lang.IndexOutOfBoundsException: обнаружена несогласованность. Недопустимая позиция позиции Есть ли ложь getFirstVisiblePosition ListView и getLastVisiblePosition? Добавление программ просмотра изображений в FrameLayout программно, затем изменение их позиций Как использовать пользовательский ArrayAdapter в отдельном классе?