2012-11-08 7 views
22

なぜViewGrouponInterceptTouchEventACTION_DOWNしか得られませんか?ドキュメントによると、falseが返される限り、すべてのイベントタイプを受け取る必要があります。 http://developer.android.com/reference/android/view/ViewGroup.html#onInterceptTouchEvent%28android.view.MotionEvent%29 ポイント#3。onInterceptTouchEventはACTION_DOWNだけを取得します

サンプルコード:

public class MainActivity extends Activity { 

    private static final String TAG = MainActivity.class.getSimpleName(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(new Container(this)); 
    } 

    private class Container extends LinearLayout { 

     public Container(Context context) { 
      super(context); 
      setBackgroundColor(0xFF0000FF); 
     } 

     @Override 
     public boolean onInterceptTouchEvent(MotionEvent ev) { 
      Log.i(TAG, "onInterceptTouchEvent"); 
      int action = ev.getActionMasked(); 
      switch (action) { 
      case MotionEvent.ACTION_DOWN: 
       Log.i(TAG, "onInterceptTouchEvent.ACTION_DOWN"); 
       break; 
      case MotionEvent.ACTION_MOVE: 
       Log.i(TAG, "onInterceptTouchEvent.ACTION_MOVE"); 
       break; 
      case MotionEvent.ACTION_CANCEL: 
      case MotionEvent.ACTION_UP: 
       Log.i(TAG, "onInterceptTouchEvent.ACTION_UP"); 
       break; 
      } 
      return super.onInterceptTouchEvent(ev); 
     } 
    } 
} 

答えて

45

私は自分の質問にお答えします:親はonTouchEventから「真」を返し、子ビューを持っている場合にのみ呼び出されますonInterceptTouchEvent。子が真を返すと、親はそのイベントを傍受する機会を得ます。

enter image description here

+0

どのように親ができ:

@Override public boolean dispatchTouchEvent(MotionEvent event) { MyLog.d(MyLog.DEBUG, "dispatchTouchEvent(): "+event.getAction()); if (isEnabled()) { MyLog.d(MyLog.DEBUG, "dispatchTouchEvent()2: "+event.getAction()); processEvent(event);//here you get all events include move & up super.dispatchTouchEvent(event); return true; //to keep receive event that follow down event } return super.dispatchTouchEvent(event); } 

を私は、実行可能なコードを持っています子供が既にそれを派遣した場合、イベントを傍受するか? –

+0

子供はタッチイベント(通常)を送信しません。タッチイベントは親から子へ反復的にバブルします。下に行くとonInterceptTouchEventが呼び出され、それがonTouchEventになります。それは誰かが真実を返すまで泡立ち続ける。 – user123321

+0

onTouchListenerを持つViewをViewGroupに追加すると、それがViewGroupに追加されます。このリスナーは呼び出され、何らかの動作を開始してからfalseを返します。その後、ViewGroupはイベントを「インターセプト」できますか?ハンドラのコードがすでに実行されている場合は? –

5

同じ問題が発生します。私はそれについて多くの記事読んでいた:すべての答えが同じである
http://developer.android.com/training/gestures/viewgroup.html
http://developer.android.com/reference/android/view/ViewGroup.html#onInterceptTouchEvent(android.view.MotionEvent)


onInterceptTouchEvent only gets ACTION_DOWN
onInterceptTouchEvent's ACTION_UP and ACTION_MOVE never gets called
onInterceptTouchEvent, onTouchEvent only see ACTION_DOWN
onInterceptTouchEvent never receives action_move

を私はまた、Androidのドキュメントを読んでいました。私は何度も試してみましたが、常にonInterceptTouchEventを取得しないでください。 ()はダウンイベントではなく呼び出されます。

は、私は、私は何かが変更されていることを推測するソースコードを読む:

@Override 
public boolean dispatchTouchEvent(MotionEvent ev) { 
    if (mInputEventConsistencyVerifier != null) { 
     mInputEventConsistencyVerifier.onTouchEvent(ev, 1); 
    } 

    boolean handled = false; 
    if (onFilterTouchEventForSecurity(ev)) { 
     final int action = ev.getAction(); 
     final int actionMasked = action & MotionEvent.ACTION_MASK; 

     // Handle an initial down. 
     if (actionMasked == MotionEvent.ACTION_DOWN) { 
      // Throw away all previous state when starting a new touch gesture. 
      // The framework may have dropped the up or cancel event for the previous gesture 
      // due to an app switch, ANR, or some other state change. 
      cancelAndClearTouchTargets(ev); 
      resetTouchState(); 
     } 

     // Check for interception. 
     final boolean intercepted; 
     if (actionMasked == MotionEvent.ACTION_DOWN 
       || mFirstTouchTarget != null) { 
      final boolean disallowIntercept = (mGroupFlags & FLAG_DISALLOW_INTERCEPT) != 0; 
      if (!disallowIntercept) { 
       intercepted = onInterceptTouchEvent(ev); 
       ev.setAction(action); // restore action in case it was changed 
      } else { 
       intercepted = false; 
      } 
     } else { 
      // There are no touch targets and this action is not an initial down 
      // so this view group continues to intercept touches. 
      intercepted = true; 
     } 


コードの上によればMotionEvent.ACTION_DOWNonInterceptTouchEvent(ev)のみが呼び出されている、これは我々がしようと、見つけたものです。それで、私が推測するのは、コードは変更されていますが、ドキュメントは変更されていません。

あなたがスパイをしたいか、すべてのイベントが、それらは、子ビューに送信されて含ま監視する場合、あなたはこのようなdispatchTouchEvent()上書きすることができます:https://github.com/maxyou/gesturebutton/blob/master/src/com/maxproj/gesturebutton/GestureButtonLayout.java

+0

私はソースコードを読んでこの点も見つけました。 –

+0

ありがとう!私は3時間かけて別の解決策を試しましたが、この1つは本当に素晴らしいです! –

関連する問題