在ViewGroup中接收interceptTouchEvent

时间:2015-04-07 13:01:31

标签: android

我已经构建了一个像

这样的自定义视图组
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事件然后停止。这是正确的行为还是我做错了什么?

2 个答案:

答案 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) {
}