W odpowiedzi na oryginalne pytanie Janusza istnieje kilka sposobów na osiągnięcie tego celu, z których każdy różni się poziomem trudności i został opisany poniżej. Korzystanie z widoku internetowego jest dobre, ale jest bardzo ograniczone pod względem wyglądu, dotyku i kontroli. Jeśli rysujesz mapę bitową z płótna, najbardziej wszechstronnymi zaproponowanymi rozwiązaniami wydają się rozwiązania MikeOrtiza, Roberta Fossa i / lub sugestie Jacoba Nordfalka. Jest świetny przykład włączenia kontrolera wielodotykowego Androida autorstwa PaulBourke i doskonale nadaje się do obsługi wielodotyku i wszelkiego rodzaju niestandardowych widoków.
Osobiście, jeśli po prostu rysujesz płótno na mapie bitowej, a następnie wyświetlasz je wewnątrz i ImageView i chcesz móc powiększać i przemieszczać się za pomocą multi-touch, uważam rozwiązanie MikeOrtiz za najłatwiejsze. Jednak dla moich celów kod z Git , który podał, wydaje się działać tylko wtedy, gdy jego niestandardowa klasa ImageView TouchImageView jest jedynym dzieckiem lub podaje parametry układu jako:
android:layout_height="match_parent"
android:layout_height="match_parent"
Niestety z powodu mojego projektu układu potrzebowałem „wrap_content” dla „layout_height”. Kiedy zmieniłem to na to obraz został przycięty na dole i nie mogłem przewinąć ani powiększyć obszaru przycięcia. Spojrzałem więc na Source for ImageView, aby zobaczyć, jak Android zaimplementował „onMeasure” i zmienił MikeOrtiza na odpowiedni.
@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);
}
Tutaj resolSize (int, int) to „Narzędzie do uzgadniania pożądanego rozmiaru z ograniczeniami narzuconymi przez MeasureSpec, gdzie:
Parametry:
- size How big the view wants to be
- MeasureSpec Constraints imposed by the parent
Zwroty:
- The size this view should be."
Zasadniczo zapewnia zachowanie nieco bardziej podobne do oryginalnej klasy ImageView po załadowaniu obrazu. Można wprowadzić więcej zmian, aby obsługiwać większą różnorodność ekranów, które modyfikują proporcje obrazu. Ale na razie mam nadzieję, że to pomaga. Dzięki MikeOrtiz za jego oryginalny kod, świetna robota.