Как найти элемент в режиме просмотра по координатам x, y Android

Если я знаю координаты (X, Y) пикселей (по методу OnTouchEvent и getX(), getY), как я могу найти элемент ex. кнопку или текст и т.д. с помощью X, Y

Ответ 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
}