ScrollView должен всегда перехватывать onInterceptTouch родителя

Имеется кастомный класс FrameLayout. В нём я делаю перехват MotionEvent в методе onInterceptTouchEvent, чтобы реализовать движение моего FrameLayout'a. Всё работает, но есть одна проблема. Когда один из дочерних элементов является ScrollView (или другой подобный по реализации ViewGroup), то начинаются постоянные перебивания. ScrollView перестал плавно работать, как раньше. Возникает вопрос: возможно ли сделать так, чтобы ScrollView перехватывал все MotionEvent'ы перед тем, как это сделает FrameLayout?


Ответы (1 шт):

Автор решения: Snuiper228

Смог найти способ возможно он не такой хороший как мог быть, но работает.

private boolean isTouchOnScrollView(MotionEvent event, ViewGroup viewGroup) {
    for (int i = 0; i < viewGroup.getChildCount(); i++) {
        View child = viewGroup.getChildAt(i);

        if (child instanceof ViewGroup) {
            if (child instanceof ScrollView) {
                int[] location = new int[2];
                child.getLocationOnScreen(location);
                Rect bounds = new Rect(location[0], location[1], location[0] + child.getWidth(), location[1] + child.getHeight());
                if (inBounds(bounds, event.getRawX(), event.getRawY())) {
                    return true;
                }
            }
            if (isTouchOnScrollView(event, (ViewGroup) child)) {
                return true;
            }
        }
    }
    return false;
}

private boolean inBounds(Rect bounds, float x, float y) {
    if (bounds.left < x && bounds.right > x && bounds.top < y && bounds.bottom > y) {
        return true;
    } else {
        return false;
    }
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    if (isTouchOnScrollView(ev, this)) {
        return false;
    }

    ...
    
    return shouldIntercept;
}
→ Ссылка