Próbuję uzyskać bezwzględne współrzędne pikseli ekranu w lewym górnym rogu widoku. Jednak wszystkie metody, które mogę znaleźć, takie jak getLeft()
i getRight()
nie działają, ponieważ wszystkie wydają się być względne względem rodzica widoku, co daje mi 0
. Jak to zrobić w odpowiedni sposób?
Jeśli to pomaga, jest to gra „przywróć porządek”. Chcę, aby użytkownik mógł narysować ramkę, aby wybrać wiele elementów. Zakładam, że najłatwiej to zrobić do getRawX()
iz getRawY()
tych, MotionEvent
a następnie porównać te wartości z lewym górnym rogiem układu zawierającego elementy. Znając rozmiar kawałków, mogę ustalić, ile kawałków zostało wybranych. Zdaję sobie sprawę, że mogę używać getX()
i getY()
na MotionEvent
, ale ponieważ to zwraca względną pozycję, która utrudnia ustalenie, które kawałki zostały wybrane. (Wiem, że nie jest to niemożliwe, ale wydaje się to niepotrzebnie skomplikowane).
Edycja: jest to kod, którego użyłem, aby uzyskać rozmiar pojemnika do przechowywania, zgodnie z jednym z pytań. TableLayout
jest stołem, który zawiera wszystkie elementy układanki.
TableLayout tableLayout = (TableLayout) findViewById(R.id.tableLayout);
Log.d(LOG_TAG, "Values " + tableLayout.getTop() + tableLayout.getLeft());
Edycja 2: Oto kod, który wypróbowałem, podążając za sugerowanymi odpowiedziami.
public int[] tableLayoutCorners = new int[2];
(...)
TableLayout tableLayout = (TableLayout) findViewById(R.id.tableLayout);
tableLayout.requestLayout();
Rect corners = new Rect();
tableLayout.getLocalVisibleRect(corners);
Log.d(LOG_TAG, "Top left " + corners.top + ", " + corners.left + ", " + corners.right
+ ", " + corners.bottom);
cells[4].getLocationOnScreen(tableLayoutCorners);
Log.d(LOG_TAG, "Values " + tableLayoutCorners[0] + ", " + tableLayoutCorners[1]);
Ten kod został dodany po zakończeniu całej inicjalizacji. Obraz został podzielony na tablicę ImageViews (tablica komórek []) zawartą w TableLayout
. Komórki [0] znajdują się w lewym górnym rogu ImageView
, a ja wybrałem komórki [4], ponieważ są one gdzieś pośrodku i zdecydowanie nie powinny mieć współrzędnych (0,0).
Kod pokazany powyżej wciąż daje mi wszystkie zera w logach, czego tak naprawdę nie rozumiem, ponieważ różne elementy układanki są poprawnie wyświetlane. (Próbowałem public int dla tableLayoutCorners i domyślnej widoczności, obie dały ten sam wynik).
Nie wiem, czy to jest znaczące, ale ImageView
początkowo nie podano rozmiaru. Rozmiar ImageView
s jest określany podczas inicjalizacji automatycznie przez View, gdy daję mu obraz do wyświetlenia. Czy może to przyczynić się do tego, że ich wartości są równe 0, nawet jeśli kod rejestrowania następuje po tym, jak otrzymali obraz i automatycznie zmienili rozmiar? Aby potencjalnie temu przeciwdziałać, dodałem kod tableLayout.requestLayout()
jak pokazano powyżej, ale to nie pomogło.