Узнайте текущее положение дочерних элементов в ScrollView - PullRequest
1 голос
/ 13 сентября 2011

У меня есть подкласс ScrollView, который разбивает на дочерние элементы, это что-то вроде этого.

Это не единственное, что делает этот класс, он также дает ему TouchsEvents, если какой-либо ребенок смог обработать его (возвращает true onTouchEvent) Но моя проблема заключается в том, что в методе centralizeContent () все RectF имеют фактическое значение с прокруткой компонента. В диспетчере методов все значения одинаковы.

public class ScrollViewVertical extends ScrollView {
    private boolean paging;

    public ScrollViewVertical(Context context) {
        super(context);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {          
        if(dispatch((ViewGroup)getChildAt(0), ev))
            return true;

        return onTouchEvent(ev);
    }

    public boolean dispatch(ViewGroup view, MotionEvent ev) {
        for (int i = 0; i < view.getChildCount();i++) {
            View v = view.getChildAt(i);
            RectF viewBounds = new RectF(v.getLeft(), v.getTop(), v.getRight(), v.getBottom());
            System.out.println(viewBounds);
            if (viewBounds.contains(ev.getX(), ev.getY()))
                return v.dispatchTouchEvent(ev);
        }
        return false;
    }

    public boolean onTouchEvent(MotionEvent evt) {
        if (evt.getAction() == MotionEvent.ACTION_UP)
            if (isPaging())
                centralizeContent();

        return super.onTouchEvent(evt);
    }

    private void centralizeContent() {
        int currentY = getScrollY() + getHeight() / 2;
        ViewGroup content = (ViewGroup) getChildAt(0);
        for (int i = 0; i < content.getChildCount(); i++) {
            View child = content.getChildAt(i);
            System.out.println(BoundsUtils.from(child));
            if (child.getTop() < currentY && child.getBottom() > currentY) {
                smoothScrollTo(0, child.getTop());
                break;
            }
        }
    }
}

Обратите внимание, что я получаю ребенка (0) в обоих случаях.

Просто чтобы уточнить, предположим, у меня есть 3 ImageViews, которые имеют ширину 1000 и высоту 500

в centralizeContent (), у меня будут эти значения (скажем, мы прокрутили 90):

RectF(0.0, 0.0, 1000.0, 500.0)
RectF(0.0, 90.0, 1000.0, 500.0)
RectF(0.0, 180.0, 1000.0, 500.0)

Но в способе отправки это получается так (с любой суммой прокрутки):

RectF(0.0, 0.0, 1000.0, 500.0)
RectF(0.0, 0.0, 1000.0, 500.0)
RectF(0.0, 0.0, 1000.0, 500.0)

Я не могу правильно обработать события, не зная точно положение детей.

...