Intereting Posts
У меня возникли проблемы с добавлением OpenCV в новый Android-проект Error: не удается найти метод символов getMap () после обновления зависимостей Android JobScheduler – не может создать постоянную работу Как программно написать ярлык на конкретную страницу на главном экране панели запуска Android? Android Bluetooth Low Energy Pairing Как сохранить и получить значение списка массивов в пакете в android? В Android-журнале SDK показано: «Загрузка прервана: подключение к https://dl-ssl.google.com отказалось», что можно сделать? Приложение для Android Capture Предварительный просмотр макетов в Studio Studio для Listview + Gridview Как включить robolectric logging Как открыть меню dev на своем реальном устройстве на реальном устройстве Внедрение настраиваемого на Android Будет ли Xamarin Android выполнять OnCreateView при вызове конструктора IntPtr? Как получить файл журнала с устройства Android? Декодировать аппаратное обеспечение декодированного устройства H264 с помощью ffmpeg в режиме реального времени

Палим-масштабирование масштаба изображения ImageView и ограничения панорамирования

Я хотел создать галерею с изображениями. Изображения в галерее должны быть масштабируемыми и настраиваемыми. Я смог ущипнуть-увеличить изображение, но не смог установить ограничения масштабирования и не допустить, чтобы изображение было отключено от экрана. Я использовал следующий код для увеличения изображения: http://code.google.com/p/4chan-image-browser/source/browse/src/se/robertfoss/MultiTouch/TouchImageView.java?spec=svnd3e623ddeb6f9e97d9eba2c7aaa7c4567a3822b5&r=d3e623ddeb6f9e97d9eba2c7aaa7c4567a3822b5

Первый подход: я использовал TouchImageView для доставки изображений в галерею, это позволяет мне зажимать зум, но не может прокручивать галерею. Т.е. я не могу различать «событие с одной вкладкой» и «вкладка для прокрутки события».

Второй подход: используется ImageView для доставки изображений в галерею, и если пользователь нажимает на любой элемент галереи, отображает выбранное изображение в TouchImageView, где пользователь может зажимать изображение. Но это также мешает мне прокручивать галерею. А также, как установить ограничения масштабирования и панорамы на выбранном изображении?

Solutions Collecting From Web of "Палим-масштабирование масштаба изображения ImageView и ограничения панорамирования"

Это фиксировало проблему ограничения масштаба для меня. После того, как изображение будет увеличено до предела, оно просто перестанет двигаться дальше. Это также гладко и нет лаг. 0.7 и 2.0 – минимальный и максимальный уровни масштабирования.

.... } else if (mode == ZOOM) { float[] f = new float[9]; float newDist = spacing(event); if (newDist > 10f) { matrix.set(savedMatrix); float tScale = newDist / dist; matrix.postScale(tScale, tScale, mid.x, mid.y); } matrix.getValues(f); float scaleX = f[Matrix.MSCALE_X]; float scaleY = f[Matrix.MSCALE_Y]; if(scaleX <= 0.7f) { matrix.postScale((0.7f)/scaleX, (0.7f)/scaleY, mid.x, mid.y); } else if(scaleX >= 2.5f) { matrix.postScale((2.5f)/scaleX, (2.5f)/scaleY, mid.x, mid.y); } } .... 

Вы можете установить ограничение масштабирования, добавив эти строки в ACTION_MOVE, mode == ZOOM:

 float[] f = new float[9]; matrix.getValues(f); float scaleX = f[Matrix.MSCALE_X]; float scaleY = f[Matrix.MSCALE_Y]; if (scaleX > MAX_SCALE || scaleY > MAX_SCALE) return true; 

Аналогичным образом добавьте строки в ACTION_MOVE, mode == DRAG, которые учитывают исходное местоположение вашего изображения, переведенную длину и затем сравнивают их с границами.

Я представил здесь ответ, который добавляет панораму, масштабирование и обнаружение границ в ImageView.

Попробовали использовать этот код ниже, и хотя он работает, я обнаружил, что он вызывает небольшие инкрементные значения, которые накапливаются в Trans X и Trans Y, что приводит к медленному перемещению изображения на экране.

 if(scaleX <= 0.7f) matrix.postScale((0.7f)/scaleX, (0.7f)/scaleY, mid.x, mid.y); else if(scaleX >= 2.5f) matrix.postScale((2.5f)/scaleX, (2.5f)/scaleY, mid.x, mid.y); 

Я исправил это, сохраняя исходную матрицу в float [] (1,0,0,0,1,0,0,0,1) и возвращая матрицу обратно к этим значениям всякий раз, когда scaleX <1. Надеюсь, это поможет кому-то еще один день 🙂

 if(scaleX <= 1.0f) { float[] originalmatrixvalues = new float[] {1f, 0f, 0f, 0f, 1f, 0f, 0f, 0f, 1f}; matrix.setValues(originalmatrixvalues); } else if(scaleX >= 2.5f) { matrix.postScale((2.5f)/scaleX, (2.5f)/scaleY, mid.x, mid.y); }