2016-04-22 5 views
0

У меня два мероприятия: ActivityA & ActivityB. ActivityA прослушивает события движения. Когда происходит событие прокрутки, немедленно запускается ActivityB.Продолжить прокрутку из одной активности в другую

ActivityB содержит прокручиваемый контент внутри, и я хочу, чтобы он начал прокрутку этого содержимого сразу, , не заставляя пользователей поднимать палец вверх. Переход должен быть прозрачным, жестом прокрутки не следует останавливаться между действиями, но продолжайте гладко.

Другими словами, проблема заключается в том, что ActivityB не реагирует на события движения, если пользователь не поднимет палец и не коснется экрана снова.

Как я могу это решить?

+0

Не можете ли вы передать последнюю информацию о MotionEvent от A до B, а затем смоделировать ' ACTION_DOWN' после запуска B? – NSimon

+0

@NicolasSimon Я думаю, что это правильное направление, и я изучал его, пока безуспешно. – EyesClear

+0

См. Мой ответ ниже – NSimon

ответ

1

Хорошо, я постараюсь предоставить здесь больше информации, чем в моем первом комментарии. Итак, прежде всего, система не должна допускать такое поведение, как описано в этой теме: https://groups.google.com/forum/#!topic/android-platform/d6Kt1DhCAtw

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

Вот фрагмент, который вы могли бы потенциально применить к Activity B:

Шаг 1: Пропустите X и Y координаты последнего MotionEvent от Activity A к Activity B

Шаг 2: Получить эти значения в Activity B и затем примените:

private void continueScrolling(int posX, int posY) { 
    long downTime = SystemClock.uptimeMillis(); 
    long eventTime = SystemClock.uptimeMillis(); 

    MotionEvent.PointerCoords[] pointerCoords = new MotionEvent.PointerCoords[1]; 
    MotionEvent.PointerCoords pc1 = new MotionEvent.PointerCoords(); 
    pc1.x = posX; 
    pc1.y = posY; 
    pc1.pressure = 1; 
    pc1.size = 1; 
    pointerCoords[0] = pc1; 

    MotionEvent.PointerProperties[] pointerProperties = new MotionEvent.PointerProperties[1]; 
    MotionEvent.PointerProperties pp1 = new MotionEvent.PointerProperties(); 
    pp1.id = 0; 
    pp1.toolType = MotionEvent.TOOL_TYPE_FINGER; 
    pointerProperties[0] = pp1; 

    MotionEvent event; 
    // send the initial touches (this seems to be to "wake up" the view, you might not need it in a non-testing context though) 
    event = MotionEvent.obtain(downTime, eventTime, 
      MotionEvent.ACTION_DOWN, 1, pointerProperties, pointerCoords, 
      0, 0, // metaState, buttonState 
      1, // x precision 
      1, // y precision 
      0, 0, // deviceId, edgeFlags 
      InputDevice.SOURCE_TOUCHSCREEN, 0); // source, flags 
    theViewYouWantTomove.dispatchGenericMotionEvent(event); 

    event = MotionEvent.obtain(downTime, eventTime, 
      MotionEvent.ACTION_DOWN, 
      1, pointerProperties, pointerCoords, 0, 0, 1, 1, 0, 0, 
      InputDevice.SOURCE_TOUCHSCREEN, 0); 
    theViewYouWantTomove.dispatchGenericMotionEvent(event); 
} 
+0

Спасибо. Я не вижу, как связанная вами ссылка связана с этой проблемой. Во всяком случае, я пытался следовать твоей идее, но без везения. – EyesClear

+0

Ну, OP ссылки пытается достичь того же, что и вы: имитирует клики по просмотрам. – NSimon

Смежные вопросы