我已经构建了一个像
这样的自定义视图组public class InterceptorView extends ViewGroup {
public InterceptorView(Context context) {
super(context);
}
public InterceptorView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public InterceptorView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
View view = getChildAt(0);
view.layout(l, t, r, b);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
Log.d(InterceptorView.class.getCanonicalName(), "y: " + ev.getY());
return super.onInterceptTouchEvent(ev);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int wspec = MeasureSpec.makeMeasureSpec(getMeasuredWidth(), MeasureSpec.EXACTLY);
int hspec = MeasureSpec.makeMeasureSpec(getMeasuredHeight(), MeasureSpec.EXACTLY);
int childCount = getChildCount();
for (int i = 0; i < childCount; i++) {
View view = getChildAt(i);
view.measure(wspec, hspec);
}
}
}
并夸大以下xml
<?xml version="1.0" encoding="utf-8"?>
<test.com.viewgroupexamples.InterceptorView xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:id="@+id/contentView"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
</LinearLayout>
</ScrollView>
</test.com.viewgroupexamples.InterceptorView>
我动态添加了100个文本视图,因此scrollview实际上可以滚动。
通过这种设置,我希望interceptTouchEvent能够记录发生的事件。但是我通常会得到DOWN和一些MOVE事件然后停止。这是正确的行为还是我做错了什么?
答案 0 :(得分:0)
你会注意到'onInterceptTouchEvent()'返回一个布尔值。这表示您对该事件感兴趣(它已被“截获”)。如果对于初始DOWN事件没有返回true,则不会为后续事件调用此方法。但是要小心,因为如果这样做,层次结构中较低的视图将不会接收这些事件。简而言之,替换
return super.onInterceptTouchEvent(ev);
带
return true;
答案 1 :(得分:0)
因此,发现ViewGroup中有一个名为requestDisallowInterceptTouchEvent的方法。这将阻止当前手势的返回onInterceptTouchEvent。这意味着InterceptorView.onInterceptTouchEvent()接收DOWN事件然后接收几个MOVE事件,直到触摸slop被克服,然后Scrollview实际上调用requestDisallowInterceptTouchEvent,当IT收到它时触摸它。
我能够通过覆盖requestDisallowInterceptTouchEvent方法来解决这个问题......
@Override
public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}