Android 在滚动视图中查找孩子的当前位置
我有一个ScrollView的子类,对它的子类进行分页,它是这样的 它不是这个类所做的唯一一件事,如果有任何子类能够处理它,它也会给出它的TouchEvents(返回true onTouchEvent) 但我的问题是,在方法centralizeContent()上,所有RectF都具有组件滚动的实际值。 在方法分派中,所有值都相同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;
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)