Android: поймайте MotionEvent в разных видах деятельности - PullRequest
4 голосов
/ 07 октября 2011

У меня есть два действия A и B. Я хотел бы, чтобы одно событие касания MotionEvent.ACTION_DOWN было перехвачено в A, при этом удерживая нажатой кнопку запуска B, затем событие 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 отправляются на действия и / или любое решение / взломатьк моей проблеме.

1 Ответ

1 голос
/ 07 октября 2011
   @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 (make B реализует OnTouchListener) примерно так:

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

И помните, someview должно быть представлением для того, чтобы перехватить ontouchevent, потому что действия не 'я действительно знаю, что с этим делать.

...