Есть ли общий способ показать большое изображение и позволить пользователю увеличивать и уменьшать масштаб и панорамировать изображение?
До сих пор я нашел два способа:
- перезапись ImageView, которая кажется слишком большой для такой распространенной проблемы.
- используя веб-просмотр, но с меньшим контролем общего макета и т. д.
Ответы:
ОБНОВИТЬ
Я только что дал TouchImageView новое обновление. Теперь он включает Double Tap Zoom и Fling в дополнение к панорамированию и Pinch Zoom. Код ниже очень устарел. Вы можете проверить проект GitHub, чтобы получить последний код.
ИСПОЛЬЗОВАНИЕ
Поместите TouchImageView.java в ваш проект. Затем его можно использовать так же, как ImageView. Пример:
Если вы используете TouchImageView в формате xml, то вы должны указать полное имя пакета, поскольку это пользовательский вид. Пример:
Примечание: я удалил свой предыдущий ответ, который включал очень старый код и теперь ссылается прямо на самый обновленный код на github.
ViewPager
Если вы заинтересованы в размещении TouchImageView в ViewPager, обратитесь к этому ответу.
источник
TouchImageView(Context context, AttributeSet attrs)
и вызовитеsuper(context, attrs);
Это потому, что когда вы раздуваете пользовательское представление, оно создается с двумя параметрами, а не с одним. Когда я доберусь до него, я исправлю TouchImageView, чтобы он поддерживал три конструктора вида и рисованные объекты.<com.example.TouchImageView android:id="@+id/img" />
. Ты сделал это?Я адаптировал некоторый код для создания TouchImageView, который поддерживает мультитач (> 2.1). Это вдохновлено книгой Привет, Android! (3-е издание)
Он содержится в следующих 3 файлах TouchImageView.java WrapMotionEvent.java EclairMotionEvent.java
TouchImageView.java
WrapMotionEvent.java
EclairMotionEvent.java
источник
WrapMotionEvent
иEclairMotionEvent
... в любом случае, +1.Я использовал WebView и загрузил изображение из памяти через
WebView обрабатывает все масштабирование и прокрутку панорамирования. Если вы используете wrap_content, веб-просмотр не будет больше, чем изображение, и белые области не отображаются. WebView лучше ImageView;)
источник
В ответе на оригинальный вопрос Януша есть несколько способов достижения этого, каждый из которых различается по уровню сложности и был указан ниже. Использование веб-представления - это хорошо, но оно очень ограничено с точки зрения внешнего вида и управляемости. Если вы рисуете растровое изображение с холста, наиболее универсальные решения, которые были предложены, это MikeOrtiz, Robert Foss и / или то, что предложил Jacob Nordfalk. Есть отличный пример для включения android-multitouch-контроллера от PaulBourke , и он отлично подходит для поддержки мультитач и всех типов пользовательских представлений.
Лично, если вы просто рисуете холст в растровом изображении, а затем отображаете его внутри и в ImageView и хотите иметь возможность увеличивать и перемещать объекты с помощью мультитач, я считаю решение MikeOrtiz самым простым. Однако, для моих целей, код из предоставленного им Git , похоже, работает только тогда, когда его собственный класс ImageView TouchImageView является единственным дочерним элементом или предоставляет параметры макета в виде:
К сожалению, из-за моего макета, мне нужно было "wrap_content" для "layout_height". Когда я изменил его на это, изображение было обрезано внизу, и я не мог прокрутить или увеличить область обрезки. Поэтому я взглянул на Source для ImageView, чтобы увидеть, как Android реализовал «onMeasure» и изменил MikeOrtiz для соответствия.
Здесь resolSize (int, int) - это «Утилита для согласования желаемого размера с ограничениями, наложенными MeasureSpec, где:
Параметры:
Возвращает:
Таким образом, по сути, обеспечивает поведение, немного более похожее на исходный класс ImageView, когда изображение загружается. Некоторые дополнительные изменения могут быть сделаны для поддержки большего разнообразия экранов, которые изменяют соотношение сторон. Но сейчас я надеюсь, что это поможет. Спасибо MikeOrtiz за его оригинальный код, отличная работа.
источник
Вы также можете попробовать http://code.google.com/p/android-multitouch-controller/
Библиотека действительно отличная, хотя поначалу ее немного сложно понять.
источник
Я только что интегрировал TouchImageView Роберта Фосса: он работал отлично из коробки! Спасибо!
Я просто немного изменил код, чтобы иметь возможность создать его экземпляр из моего layout.xml.
Просто добавьте два конструктора
и преобразовать старый конструктор в метод init:
источник
@ Роберт Фосс, @ Майк Ортис, большое спасибо за вашу работу. Я объединил твою работу и закончил занятия Роберта для Android> 2.0 с дополнительной работой Майка.
В результате моей работы я представляю Android Touch Gallery, основанную на ViewPager и использующую модифицированный TouchImageView. Изображения загружаются по URL и вы можете масштабировать и перетаскивать их. Вы можете найти его здесь https://github.com/Dreddik/AndroidTouchGallery
источник
Попробуйте использовать
ZoomView
для масштабирования любой другой вид.http://code.google.com/p/android-zoom-view/ это просто, бесплатно и интересно!
источник
Добавление к ответу @ Майка. Мне также нужно было дважды нажать, чтобы восстановить первоначальные размеры изображения при первом просмотре. Поэтому я добавил целую кучу переменных экземпляра «orig ...» и добавил SimpleOnGestureListener, который добился цели.
источник
Это очень позднее дополнение к этой теме, но я работаю над изображением, которое поддерживает масштабирование и панорамирование и имеет несколько функций, которых я не нашел в других местах. Это началось как способ отображения очень больших изображений без указания
OutOfMemoryError
s, путем подвыборки изображения при уменьшении и загрузки листов с более высоким разрешением при увеличении. Теперь он поддерживает использование в aViewPager
, поворот вручную или использование информации EXIF (остановки на 90 °), переопределить выбранные сенсорные события, используяOnClickListener
или свой собственныйGestureDetector
илиOnTouchListener
, используя подклассы для добавления наложений, панорамирования при масштабировании и броска импульса.Он не предназначен в качестве замены для общего пользования
ImageView
поэтому не расширяет его и не поддерживает отображение изображений из ресурсов, только ресурсы и внешние файлы. Требуется SDK 10.Источник находится на GitHub, и есть пример, который иллюстрирует использование в
ViewPager
.https://github.com/davemorrissey/subsampling-scale-image-view
источник
Вы можете попробовать использовать LayoutParams для этого
ZoomIn = zoom (true); ZoomOut = zoom (false);
источник
и в папке drawable должен быть файл изображения bticn. отлично работает :)
источник
Нечто подобное ниже сделает это.
Для просмотра полной программы смотрите здесь: Программа для увеличения изображения в Android
источник