Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在滚动视图中查找孩子的当前位置_Android_Event Handling_Android Scroll - Fatal编程技术网

Android 在滚动视图中查找孩子的当前位置

Android 在滚动视图中查找孩子的当前位置,android,event-handling,android-scroll,Android,Event Handling,Android Scroll,我有一个ScrollView的子类,对它的子类进行分页,它是这样的 它不是这个类所做的唯一一件事,如果有任何子类能够处理它,它也会给出它的TouchEvents(返回true onTouchEvent) 但我的问题是,在方法centralizeContent()上,所有RectF都具有组件滚动的实际值。 在方法分派中,所有值都相同 public class ScrollViewVertical extends ScrollView { private boolean paging;

我有一个ScrollView的子类,对它的子类进行分页,它是这样的

它不是这个类所做的唯一一件事,如果有任何子类能够处理它,它也会给出它的TouchEvents(返回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;
            }
        }
    }
}
但在dispatch方法中,它是这样的(有任何滚动量):


如果不知道孩子的确切位置,我无法正确处理事件。

出于好奇,您是否尝试过getLocationInWindow或getLocationOnScreen以查看它们是否返回可用值(两者都将返回视图左上角像素的位置,因此您还需要获得宽度和高度来计算矩形)
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)