2013-07-01 13 views
8

Próbuję wykonać prostą aplikację, aby lepiej zrozumieć, jak korzystać z wydarzeń Touch na Androidzie. Teraz moja aktywność powoduje przesunięcie widoku obrazu do współrzędnych dotyku na ekranie (współrzędne MotionEvent). Mogłem to zrobić, stosując prostą sztuczkę, aby ustawić nową pozycję obrazu na wartość, która jest utworzona ze współrzędnych dotyku w odniesieniu do pozycji obrazu (getX() i getY()). Zmienne te są odpowiedzialne za przechowywanie tych względnych wartości, więc dotyk pozostaje stały w obrazie.Dlaczego getX obrazu ImageView, getY, setX i setY nie reprezentują rzeczywistej wartości w układzie względnym?

Teraz chcę umieścić 2 Widoki Obrazu w Aktywności i mieć tylko dwa ustalone miejsca dla ImageViews i gdy użytkownik przeciągnie jeden ImageView nad drugim centrum ImageView, dwa obrazy zmieniają miejsca, ale żeby zrobić to poprawnie Chciałbym uzyskać rzeczywiste współrzędne centrum obrazu. Skomentowałem części kodu, które sprawiają, że działa poprawnie, aby pokazać problem. Jak widać na pierwszym zdjęciu pierwsze zdjęcie podczas tworzenia widoku, Współrzędne obrazu są po prostu (0, 0), bez względu na to, gdzie jest (o ile pozycja początkowa jest zdefiniowana jako parametr układu, taki jak CENTER_IN_PARENT).

Jak widać w drugim zdjęciu io ile zauważyłem ImageView na getX() i getY() powrócić współrzędnych jakby lewy górny róg obrazu był w lewym górnym rogu ekranu, gdy obraz znajduje się w lewym górnym rogu OKNA AKTYWNEGO.

Chciałbym zrozumieć, dlaczego tak się dzieje i czy ktoś wie, jak właściwie uzyskać współrzędne ImageView, które można bezpośrednio porównać ze współrzędnymi MotionEvent.


Zdjęcia:

FIRST PICTURE

SECOND PICTURE

Odpowiedz

13

ja nadal nie wiem dokładnie dlaczego getX(), getY(), setX() i setY() nie reprezentują stanowiska widoku na ekranie , ale zorientowałem się, jak uzyskać rzeczywistą lokalizację obiektów widoku na ekranie: getLocationOnScreen(coordinates). Gdzie coordinates jest tablicą int z 2 pozycjami (int [2]).

Na przykład, aby uzyskać prawdziwy wartość odpowiadającą lewym górnym rogu mojego ImageView image po prostu trzeba zrobić coś takiego:

int[] img_coordinates = new int[2]; 
ImageView image = (ImageView) findViewById(R.id.myImage); 

image.getLocationOnScreen(img_coordinates); 

I wtedy rzeczywiście mogę porównać te współrzędne z Touch- zdarzenie getRawX i getRawY.

Jeśli chcę, aby uzyskać punkt środkowy moim zdaniem po prostu trzeba to zrobić:

x_center = (double)img_coordinates[0] + image.getWidth()/2.0; 
y_center = (double)img_coordinates[1] + image.getHeight()/2.0; 

Mam nadzieję, że to pomoże innym ludziom też zajęło mi trochę czasu, aby znaleźć to podejście i jestem rzeczywiście nie jestem pewien, czy to jest najlepsze podejście, ale robi to dla mnie.