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:
android:layout_height="match_parent"
android:layout_height="match_parent"
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.
@Override
protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec)
{
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//**** ADDED THIS ********/////
int w = (int) bmWidth;
int h = (int) bmHeight;
width = resolveSize(w, widthMeasureSpec);
height = resolveSize(h, heightMeasureSpec);
//**** END ********///
// width = MeasureSpec.getSize(widthMeasureSpec); // REMOVED
// height = MeasureSpec.getSize(heightMeasureSpec); // REMOVED
//Fit to screen.
float scale;
float scaleX = (float)width / (float)bmWidth;
float scaleY = (float)height / (float)bmHeight;
scale = Math.min(scaleX, scaleY);
matrix.setScale(scale, scale);
setImageMatrix(matrix);
saveScale = 1f;
// Center the image
redundantYSpace = (float)height - (scale * (float)bmHeight) ;
redundantXSpace = (float)width - (scale * (float)bmWidth);
redundantYSpace /= (float)2;
redundantXSpace /= (float)2;
matrix.postTranslate(redundantXSpace, redundantYSpace);
origWidth = width - 2 * redundantXSpace;
origHeight = height - 2 * redundantYSpace;
// origHeight = bmHeight;
right = width * saveScale - width - (2 * redundantXSpace * saveScale);
bottom = height * saveScale - height - (2 * redundantYSpace * saveScale);
setImageMatrix(matrix);
}
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:
- size How big the view wants to be
- MeasureSpec Constraints imposed by the parent
Kehrt zurück:
- The size this view should be."
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.