Android: ловите MotionEvent во всех действиях

У меня есть два действия A и B. Я хотел бы, чтобы событие MotionEvent.ACTION_DOWN с одним касанием было перехвачено в A, все еще удерживая нажатой, запустить B, а затем событие выпуска MotionEvent.ACTION_UP было перехвачено в B.

В A есть View v, который имеет OnTouchListener со следующим обратным вызовом:

@Override
public boolean onTouch(View v, MotionEvent event) {
    switch (event.getAction() & MotionEvent.ACTION_MASK) {
    case MotionEvent.ACTION_DOWN:
        startActivity(new Intent(A.this, B.class));
        break;
    case MotionEvent.ACTION_UP:
        // not called
        break;
    }
    // false doesn't work either
    return true;
}

В B есть перекрывающийся View v2 (по сравнению с исходным v) с тем же типом OnTouchListener, но B "onTouch" не вызывается, когда начинается действие, если я не шевелю пальцем (восстановление событий касания).

Проще говоря, я делаю приложение, в котором новое действие будет появляться при удерживании на экране и завершаться, когда я отпускаю палец.

Нельзя ли передать состояние MotionEvent.ACTION_DOWNed из одного вида в другой? Или новое действие B очищает все текущие «слушатели касания экрана», доступные только для A, потому что оно было инициировано там?

Спасибо за любое объяснение того, как эти MotionEvents отправляются в действия и / или любое решение / взлом моей проблемы.


person Eric Chen    schedule 06.10.2011    source источник
comment
Вы нашли решение этой проблемы?   -  person MM.    schedule 10.02.2013
comment
Вы нашли решение?   -  person ClassA    schedule 21.09.2018


Ответы (1)


   @Override
   public boolean onTouch(View v, MotionEvent event) {
    switch (event.getAction() & MotionEvent.ACTION_MASK) {
    case MotionEvent.ACTION_DOWN:
        startActivity(new Intent(A.this, B.class));
        break;
    case MotionEvent.ACTION_UP:

          // Obtain MotionEvent object
          long downTime = SystemClock.uptimeMillis();
          long eventTime = SystemClock.uptimeMillis() + 100;
          float x = 0.0f;
          float y = 0.0f;
          // List of meta states found here:               developer.android.com/reference/android/view/KeyEvent.html#getMetaState()
          int metaState = 0;
          MotionEvent motionEvent = MotionEvent.obtain(
             downTime, 
             eventTime, 
             MotionEvent.ACTION_UP, 
             x, 
             y, 
             metaState
            );

            // Dispatch touch event to activity (make B static or get the activity var some other way)

            B.OnTouchEvent(motionEvent);
       break;
    }
    // false doesn't work either
    return true;
}

И в B Activity Override OnTouchEvent (заставьте B реализовать OnTouchListener) следующим образом:

@Override
public bool OnTouchEvent( MotionEvent e )
{
    return someview.OnTouchEvent( e );
}

И помните, someview должен быть представлением, чтобы поймать онтоучвент, потому что Activity на самом деле не знает, что с ним делать.

person A.Quiroga    schedule 06.10.2011
comment
Проблема в том, что часть случая MotionEvent.ACTION_UP не вызывается, когда я отпускаю палец; если бы это было так, было бы не слишком сложно отправить событие в действие B (например, как вы это сделали). - person Eric Chen; 07.10.2011