Gibt es eine übliche Möglichkeit, ein großes Bild anzuzeigen und dem Benutzer das Vergrößern und Verkleinern sowie das Schwenken des Bildes zu ermöglichen?
Bis jetzt habe ich zwei Wege gefunden:
- Das Überschreiben von ImageView scheint für ein so häufiges Problem etwas zu viel zu sein.
- Verwenden einer Webansicht, jedoch mit weniger Kontrolle über das Gesamtlayout usw.
Antworten:
AKTUALISIEREN
Ich habe TouchImageView gerade ein neues Update gegeben. Es enthält jetzt zusätzlich zu Panning und Pinch Zoom Double Tap Zoom und Fling. Der folgende Code ist sehr veraltet. Sie können das Github-Projekt überprüfen, um den neuesten Code zu erhalten.
VERWENDUNG
Platzieren Sie TouchImageView.java in Ihrem Projekt. Es kann dann genauso wie ImageView verwendet werden. Beispiel:
Wenn Sie TouchImageView in XML verwenden, müssen Sie den vollständigen Paketnamen angeben, da es sich um eine benutzerdefinierte Ansicht handelt. Beispiel:
Hinweis: Ich habe meine vorherige Antwort entfernt, die einen sehr alten Code enthielt, und verweise jetzt direkt auf den aktuellsten Code auf Github.
ViewPager
Wenn Sie TouchImageView in einen ViewPager einfügen möchten, lesen Sie diese Antwort.
quelle
TouchImageView(Context context, AttributeSet attrs)
und rufen Sie auf.super(context, attrs);
Dies liegt daran, dass beim Aufblasen der benutzerdefinierten Ansicht nicht nur einer, sondern zwei Parameter verwendet werden. Wenn ich dazu komme, werde ich TouchImageView reparieren, um die drei Ansichtskonstruktoren und Drawables zu unterstützen.<com.example.TouchImageView android:id="@+id/img" />
. H. Hast du das gemacht?Ich habe Code angepasst, um eine TouchImageView zu erstellen, die Multitouch unterstützt (> 2.1). Es ist inspiriert von dem Buch Hallo, Android! (3. Auflage)
Es ist in den folgenden 3 Dateien enthalten: TouchImageView.java WrapMotionEvent.java EclairMotionEvent.java
TouchImageView.java
WrapMotionEvent.java
EclairMotionEvent.java
quelle
WrapMotionEvent
undEclairMotionEvent
... sowieso +1.Ich habe ein WebView verwendet und das Bild über aus dem Speicher geladen
Das WebView übernimmt das gesamte Zoomen und Scrollen des Schwenks. Wenn Sie wrap_content verwenden, wird die Webansicht nicht größer als das Bild und es werden keine weißen Bereiche angezeigt. Das WebView ist das bessere ImageView;)
quelle
Als Antwort auf die ursprüngliche Frage von Janusz gibt es verschiedene Möglichkeiten, dies zu erreichen, die sich alle in ihrem Schwierigkeitsgrad unterscheiden und nachstehend aufgeführt sind. Die Verwendung einer Webansicht ist gut, jedoch in Bezug auf Erscheinungsbild und Steuerbarkeit sehr eingeschränkt. Wenn Sie eine Bitmap von einer Leinwand zeichnen, scheinen die vielseitigsten Lösungen, die vorgeschlagen wurden, die von MikeOrtiz, Robert Foss und / oder das zu sein, was Jacob Nordfalk vorgeschlagen hat. Es gibt ein gutes Beispiel für die Integration des Android-Multitouch-Controllers von PaulBourke und die Multitouch-Unterstützung und alle Arten von benutzerdefinierten Ansichten.
Persönlich finde ich die Lösung von MikeOrtiz am einfachsten, wenn Sie einfach eine Leinwand auf eine Bitmap zeichnen und sie dann in ImageView anzeigen und in der Lage sind, mit Multi-Touch hineinzuzoomen und sich zu bewegen. Für meine Zwecke scheint der von ihm bereitgestellte Code aus dem Git jedoch nur zu funktionieren, wenn seine benutzerdefinierte ImageIiew-Klasse TouchImageView das einzige untergeordnete Element ist oder die Layoutparameter wie folgt bereitstellt:
Leider brauchte ich aufgrund meines Layoutdesigns "wrap_content" für "layout_height". Als ich dies änderte, wurde das Bild unten zugeschnitten und ich konnte nicht in den zugeschnittenen Bereich scrollen oder zoomen. Also habe ich mir die Quelle für ImageView angesehen, um zu sehen, wie Android "onMeasure" implementiert und MikeOrtiz entsprechend angepasst hat.
Hier ist resolveSize (int, int) ein "Dienstprogramm zum Abgleichen einer gewünschten Größe mit Einschränkungen, die durch eine MeasureSpec auferlegt werden, wobei:
Parameter:
Kehrt zurück:
Stellen Sie also im Wesentlichen ein Verhalten bereit, das der ursprünglichen ImageView-Klasse beim Laden des Bildes etwas ähnlicher ist. Es könnten weitere Änderungen vorgenommen werden, um eine größere Auswahl an Bildschirmen zu unterstützen, die das Seitenverhältnis ändern. Aber jetzt hoffe ich, dass dies hilft. Vielen Dank an MikeOrtiz für seinen ursprünglichen Code, großartige Arbeit.
quelle
Sie können auch http://code.google.com/p/android-multitouch-controller/ ausprobieren.
Die Bibliothek ist wirklich großartig, obwohl sie anfangs etwas schwer zu verstehen ist.
quelle
Ich habe gerade Robert Foss 'TouchImageView integriert: Es hat sofort funktioniert! Vielen Dank!
Ich habe den Code nur ein wenig geändert, damit ich ihn aus meiner layout.xml instanziieren kann.
Fügen Sie einfach zwei Konstruktoren hinzu
und transformieren Sie den alten Konstruktor in eine init-Methode:
quelle
@ Robert Foss, @ Mike Ortiz, vielen Dank für Ihre Arbeit. Ich habe Ihre Arbeit zusammengeführt und Robert-Kurse für Android> 2.0 mit Mike zusätzlicher Arbeit abgeschlossen.
Als Ergebnis meiner Arbeit präsentiere ich die Android Touch Gallery, die auf ViewPager basiert und modifiziertes TouchImageView verwendet. Bilder werden per URL geladen und können gezoomt und gezogen werden. Sie finden es hier https://github.com/Dreddik/AndroidTouchGallery
quelle
Versuchen Sie,
ZoomView
eine andere Ansicht zum Zoomen zu verwenden.http://code.google.com/p/android-zoom-view/ es ist einfach, kostenlos und macht Spaß!
quelle
Hinzufügen zu @ Mikes Antwort. Ich musste auch zweimal tippen, um das Bild beim ersten Betrachten auf die ursprünglichen Abmessungen zurückzusetzen. Also habe ich einen ganzen Haufen "orig ..." - Instanzvariablen hinzugefügt und den SimpleOnGestureListener hinzugefügt, der den Trick gemacht hat.
quelle
Dies ist eine sehr späte Ergänzung zu diesem Thread, aber ich habe an einer Bildansicht gearbeitet, die Zoom und Schwenken unterstützt und einige Funktionen enthält, die ich anderswo nicht gefunden habe. Dies begann damit, sehr große Bilder anzuzeigen, ohne
OutOfMemoryError
s zu verursachen , indem das Bild beim Verkleinern unterabgetastet und beim Vergrößern Kacheln mit höherer Auflösung geladen wurden. Es unterstützt jetzt die Verwendung in aViewPager
, die manuelle Drehung oder die Verwendung von EXIF-Informationen (90 ° -Stopps). Überschreiben ausgewählter Berührungsereignisse mitOnClickListener
oder Ihrem eigenenGestureDetector
oderOnTouchListener
Unterklasse zum Hinzufügen von Überlagerungen, Schwenken beim Zoomen und Schwingen des Impulses.Es ist nicht als allgemeiner Ersatz für gedacht
ImageView
erweitert es also nicht und unterstützt nicht die Anzeige von Bildern aus Ressourcen, nur Assets und externen Dateien. Es erfordert SDK 10.Die Quelle befindet sich auf GitHub, und es gibt ein Beispiel, das die Verwendung in a veranschaulicht
ViewPager
.https://github.com/davemorrissey/subsampling-scale-image-view
quelle
Sie können versuchen, die LayoutParams dafür zu verwenden
ZoomIn = Zoom (wahr); ZoomOut = zoom (false);
quelle
und zeichnbarer Ordner sollte bticn Bilddatei haben. funktioniert perfekt :)
quelle
So etwas wie unten wird es tun.
Das vollständige Programm finden Sie hier: Programm zum Zoomen von Bildern in Android
quelle