2015-04-07 4 views
0

У меня есть построить собственный 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, затем он останавливается. Это правильное поведение, или я делаю что-то неправильно?

ответ

0

Вы заметите, что 'onInterceptTouchEvent()' возвращает логическое значение. Это означает, что вас интересует событие (оно было «перехвачено»). Если вы не вернете true для начального события DOWN, этот метод не будет вызываться для последующих событий. Осторожно, потому что, если вы сделаете это, представления ниже в иерархии не получат эти события. В двух словах, заменить

return super.onInterceptTouchEvent(ev); 

с

return true; 
+0

Я думаю, вы получаете перепутаны между поведением onTouch() и и onInterceptTouchEvent. Посмотрите на мой ответ ниже и дайте мне знать, что вы думаете – jiduvah

+0

Да, вы правы ... Я фактически не проверял документы, просто писал из памяти. В действительности, возврат true в 'onInterceptTouchEvent' приведет к вызову 'onTouchEvent' из ViewGroup для исходного события DOWN и последующих. Btw, вот где вы должны обрабатывать события, а не в onInterceptTouchEvent. Сказав это, вы также можете использовать 'requestDisallowInterceptTouchEvent', чтобы получить обратные вызовы onInterceptTouchEvent. –

0

Так Выясняется, что существует метод в ViewGroup называется requestDisallowInterceptTouchEvent. Это блокирует возврат onInterceptTouchEvent для текущего жеста. Это означает, что InterceptorView.onInterceptTouchEvent() получал событие DOWN, а затем пару событий MOVE до тех пор, пока сенсорный slop не был преодолен, а затем Scrollview фактически вызывает requestDisallowInterceptTouchEvent, когда IT получил MOVE в его ontouch.

мне удалось преодолеть эту проблему путем перезаписи метод requestDisallowInterceptTouchEvent как так ...

@Override 
public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) { 
} 
Смежные вопросы