2012-11-25 15 views

Odpowiedz

0

Realizacja Pinch zoom Gest

pinch zoom gest jest podobny do gestu przeciągania, oprócz tego, że rozpoczyna się, gdy drugi palec jest wciśnięty do ekranu (ACTION_POINTER_DOWN).

Kiedy otrzymamy zdarzenie w dół dla drugiego palca, obliczamy i pamiętamy odległość między dwoma palcami. Podczas moich testów, Android czasami mówił mi (niepoprawnie), że były dwa palce wciśnięte w prawie dokładnie to samo miejsce. Dodałem więc czek, aby zignorować zdarzenie, jeśli odległość jest mniejsza niż pewna dowolna liczba pikseli. Jeśli jest większy, pamiętamy obecną macierz transformacji, obliczamy punkt środkowy dwóch palców i uruchamiamy zoom.

Po nadejściu wydarzenia z ruchu, gdy jesteśmy w trybie powiększenia, obliczamy ponownie odległość między palcami. Jeśli jest zbyt mały, zdarzenie jest ignorowane, w przeciwnym razie przywracamy macierz transformacji i skalujemy obraz dookoła punktu środkowego.

Skala to po prostu stosunek nowej odległości podzielonej przez starą odległość. Jeśli nowa odległość jest większa (to znaczy, że palce zostały rozdzielone dalej), wówczas skala będzie większa niż 1, co spowoduje zwiększenie obrazu. Jeśli jest mniejszy (palce bliżej siebie), wówczas skala będzie mniejsza niż jeden, co spowoduje zmniejszenie obrazu. I oczywiście, jeśli wszystko jest takie samo, skala jest równa 1, a obraz nie ulega zmianie.

Teraz określmy metody spacing() i midPoint().

odległość pomiędzy dwoma punktami

Aby dowiedzieć się, jak daleko od siebie dwa palce, najpierw skonstruować wektor (x, y), który jest różnicą między tymi dwoma punktami.

Następnie używamy formuły odległości euklidesowej obliczyć rozstaw

 
private float spacing(MotionEvent event) { 
float x = event.getX(0) - event.getX(1); 
float y = event.getY(0) - event.getY(1); 
return FloatMath.sqrt(x * x + y * y); 
} 

Kolejność punktów nie ma znaczenia, ponieważ wszelkie negatywne znaki zostaną utracone, kiedy ich kwadratowy. Zauważ, że cała matematyka jest wykonywana przy użyciu typu float Java. Chociaż niektóre urządzenia z Androidem mogą nie mieć sprzętu zmiennoprzecinkowego, nie robimy tego wystarczająco często, aby martwić się o jego wydajność.

Symetria dwóch punktów

obliczania punktu w środku dwoma punktami jest jeszcze prostsze:

 
private void midPoint(PointF point, MotionEvent event) { 
float x = event.getX(0) + event.getX(1); 
float y = event.getY(0) + event.getY(1); 
point.set(x/2, y/2); 
} 

Wszystko możemy zrobić, to wziąć średnią z ich współrzędne X i Y. Aby uniknąć zbierania śmieci, które mogą powodować zauważalne przerwy w aplikacji, używamy istniejącego obiektu do przechowywania wyniku, a nie każdorazowo przydzielając i zwracając nowy. Spróbuj uruchomić program teraz w telefonie. Przeciągnij obraz jednym palcem i powiększ go, szarpiąc dwoma palcami. Aby uzyskać najlepsze wyniki, nie pozwól, aby palce zbliżyły się do siebie w odległości mniejszej niż 2,5 cm. W przeciwnym razie zaczniesz wpadać na niektóre z tych błędów w API, o którym wspomniałem wcześniej.

This is an excerpt from Hello, Android 3rd edition, published by the Pragmatic Bookshelf. For more information or to purchase a paperback or PDF copy, please visit http://www.pragprog.com/titles/eband3