У меня есть построить собственный ViewGroup какПрием interceptTouchEvent в ViewGroup
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 TextViews динамически, так что Scrollview может фактически прокрутки.
С этой настройкой я ожидал бы, что interceptTouchEvent зарегистрирует даже touchhevent, что произойдет. Однако я обычно получаю DOWN и пару событий MOVE, затем он останавливается. Это правильное поведение, или я делаю что-то неправильно?
Я думаю, вы получаете перепутаны между поведением onTouch() и и onInterceptTouchEvent. Посмотрите на мой ответ ниже и дайте мне знать, что вы думаете – jiduvah
Да, вы правы ... Я фактически не проверял документы, просто писал из памяти. В действительности, возврат true в 'onInterceptTouchEvent' приведет к вызову 'onTouchEvent' из ViewGroup для исходного события DOWN и последующих. Btw, вот где вы должны обрабатывать события, а не в onInterceptTouchEvent. Сказав это, вы также можете использовать 'requestDisallowInterceptTouchEvent', чтобы получить обратные вызовы onInterceptTouchEvent. –