Если я знаю координаты (X, Y) пикселей (по методу OnTouchEvent и getX(), getY), как я могу найти элемент ex. кнопку или текст и т.д. с помощью X, Y
Как найти элемент в режиме просмотра по координатам x, y Android
Ответ 1
Вы можете использовать getHitRect(outRect)
каждого дочернего вида и проверить, находится ли точка в полученном прямоугольнике. Вот быстрый пример.
for(int _numChildren = getChildCount(); --_numChildren)
{
View _child = getChildAt(_numChildren);
Rect _bounds = new Rect();
_child.getHitRect(_bounds);
if (_bounds.contains(x, y)
// In View = true!!!
}
Надеюсь, что это поможет,
FuzzicalLogic
Ответ 2
Несколько более полный ответ, который принимает любой ViewGroup
и будет рекурсивно искать представление при заданных x, y.
private View findViewAt(ViewGroup viewGroup, int x, int y) {
for(int i = 0; i < viewGroup.getChildCount(); i++) {
View child = viewGroup.getChildAt(i);
if (child instanceof ViewGroup) {
View foundView = findViewAt((ViewGroup) child, x, y);
if (foundView != null && foundView.isShown()) {
return foundView;
}
} else {
int[] location = new int[2];
child.getLocationOnScreen(location);
Rect rect = new Rect(location[0], location[1], location[0] + child.getWidth(), location[1] + child.getHeight());
if (rect.contains(x, y)) {
return child;
}
}
}
return null;
}
Ответ 3
Android использует dispatchKeyEvent/dispatchTouchEvent, чтобы найти правильное представление для обработки события key/touch, это сложная процедура. Поскольку может быть много видов, охватывающих точку (x, y).
Но это просто, если вы просто хотите найти самое верхнее представление, которое покрывает точку (x, y).
1 Используйте getLocationOnScreen(), чтобы получить позицию absoulte.
2 Используйте getWidth(), getHeight(), чтобы выяснить, охватывает ли представление точку (x, y).
3 Сбросьте уровень просмотра в дереве всего представления. (Вызывайте getParent() рекурсивно или используйте какой-либо метод поиска)
4 Найдите представление, которое охватывает точку и имеет самый большой уровень.
Ответ 4
То же самое решение, что fooobar.com/info/480607/..., но в kotlin:
fun getViewByCoordinates(viewGroup: ViewGroup, x: Float, y: Float) : View? {
(0 until viewGroup.childCount)
.map { viewGroup.getChildAt(it) }
.forEach {
val bounds = Rect()
it.getHitRect(bounds)
if (bounds.contains(x.toInt(), y.toInt())) {
return it
}
}
return null
}