Czy istnieje wspólny sposób wyświetlania dużego obrazu i umożliwiania użytkownikowi powiększania i pomniejszania oraz przesuwania obrazu?
Do tej pory znalazłem dwa sposoby:
- nadpisując ImageView, wydaje się to trochę za dużo jak na tak powszechny problem.
- używając widoku internetowego, ale z mniejszą kontrolą nad ogólnym układem itp.
Odpowiedzi:
AKTUALIZACJA
Właśnie podałem TouchImageView nową aktualizację. Obejmuje teraz powiększanie podwójnym dotknięciem i rzutowanie oprócz powiększania panoramy i powiększania. Poniższy kod jest bardzo stary. Możesz sprawdzić projekt github, aby uzyskać najnowszy kod.
STOSOWANIE
Umieść TouchImageView.java w swoim projekcie. Następnie można go używać tak samo jak ImageView. Przykład:
Jeśli używasz TouchImageView w formacie xml, musisz podać pełną nazwę pakietu, ponieważ jest to widok niestandardowy. Przykład:
Uwaga: usunąłem moją poprzednią odpowiedź, która zawierała bardzo stary kod i teraz link do najbardziej aktualnego kodu na github.
ViewPager
Jeśli chcesz umieścić TouchImageView w ViewPager, zapoznaj się z tą odpowiedzią.
źródło
TouchImageView(Context context, AttributeSet attrs)
i wywołajsuper(context, attrs);
Wynika to z tego, że po nadmuchaniu widoku niestandardowego jest on konstruowany przy użyciu dwóch parametrów, a nie tylko jednego. Kiedy do tego dojdę, naprawię TouchImageView, aby obsługiwał trzy konstruktory widoków i drawable.<com.example.TouchImageView android:id="@+id/img" />
. Czy ty to zrobiłeś?Dostosowałem trochę kodu, aby utworzyć TouchImageView, który obsługuje multitouch (> 2.1). Inspiruje się książką Hello, Android! (3. edycja)
Jest zawarty w następujących 3 plikach TouchImageView.java WrapMotionEvent.java EclairMotionEvent.java
TouchImageView.java
WrapMotionEvent.java
EclairMotionEvent.java
źródło
WrapMotionEvent
iEclairMotionEvent
... w każdym razie +1.Użyłem WebView i załadowałem obraz z pamięci przez
WebView obsługuje wszystkie powiększanie i przewijanie panoramowania. Jeśli użyjesz wrap_content, widok nie będzie większy niż obraz i nie zostaną wyświetlone białe obszary. WebView to lepszy ImageView;)
źródło
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:
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.
Tutaj resolSize (int, int) to „Narzędzie do uzgadniania pożądanego rozmiaru z ograniczeniami narzuconymi przez MeasureSpec, gdzie:
Parametry:
Zwroty:
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.
źródło
Możesz także wypróbować http://code.google.com/p/android-multitouch-controller/
Biblioteka jest naprawdę świetna, choć początkowo trochę trudna do zrozumienia.
źródło
Właśnie zintegrowałem TouchImageView Roberta Fossa: zadziałał doskonale po wyjęciu z pudełka! Dzięki!
Właśnie zmodyfikowałem trochę kod, aby móc utworzyć jego instancję z pliku layout.xml.
Po prostu dodaj dwa konstruktory
i przekształć starego konstruktora w metodę init:
źródło
@Robert Foss, @Mike Ortiz, bardzo dziękuję za twoją pracę. Połączyłem twoją pracę i ukończyłem klasy Roberta dla Androida> 2.0 z dodatkowymi pracami Mike'a.
W wyniku mojej pracy prezentuję Galerię dotykową Android, opartą na ViewPager i wykorzystującą zmodyfikowany TouchImageView. Obrazy ładują się według adresu URL i możesz je powiększać i przeciągać. Można go znaleźć tutaj https://github.com/Dreddik/AndroidTouchGallery
źródło
Spróbuj użyć
ZoomView
do powiększenia dowolnego innego widoku.http://code.google.com/p/android-zoom-view/ jest łatwy, darmowy i przyjemny w użyciu!
źródło
Dodanie do odpowiedzi @ Mike'a. Potrzebowałem też podwójnego stuknięcia, aby przywrócić obraz do oryginalnych wymiarów podczas pierwszego oglądania. Więc dodałem całą masę zmiennych instancji „orig ...” i dodałem SimpleOnGestureListener, który załatwił sprawę.
źródło
Jest to bardzo późny dodatek do tego wątku, ale pracowałem nad widokiem obrazu, który obsługuje powiększanie i przesuwanie i ma kilka funkcji, których nie znalazłem gdzie indziej. Zaczęło się to od sposobu wyświetlania bardzo dużych obrazów bez powodowania
OutOfMemoryError
s, poprzez podpróbkowanie obrazu po pomniejszeniu i ładowanie kafelków o wyższej rozdzielczości po powiększeniu. Teraz obsługujeViewPager
ręczne obracanie lub użycie informacji EXIF (90 stopni zatrzymuje), zastępuj wybrane zdarzenia dotykowe za pomocąOnClickListener
lub własnegoGestureDetector
lubOnTouchListener
, podklasy, aby dodać nakładki, przesuwać podczas powiększania i pędu.Nie jest przeznaczony do ogólnego zastępowania,
ImageView
więc go nie rozszerza i nie obsługuje wyświetlania obrazów z zasobów, tylko zasobów i plików zewnętrznych. Wymaga zestawu SDK 10.Źródło znajduje się na GitHub, a jest tam próbka ilustrująca użycie w
ViewPager
.https://github.com/davemorrissey/subsampling-scale-image-view
źródło
Możesz w tym celu spróbować użyć LayoutParams
ZoomIn = zoom (prawda); ZoomOut = zoom (false);
źródło
a folder do rysowania powinien mieć plik obrazu bticn. doskonale działa :)
źródło
Zrobi to coś takiego jak poniżej.
Aby wyświetlić pełny program, zobacz tutaj: Program do powiększania obrazu w Androidzie
źródło