Как сделать MotionEvent для увеличения? - PullRequest
4 голосов
/ 10 июня 2011

У меня есть инструментальные средства, которые я хочу использовать для тестирования своего приложения, но мне кажется, что я не могу получить масштабирование пинч для правильной симуляции. Вот мой текущий код. Суть этого в следующем: опустите вниз оба пальца 1 и палец 2, переместите их ближе друг к другу, затем отпустите их обоих.

private void performZoomTest(int numUpdates) {
    long downTime = SystemClock.uptimeMillis();
    long eventTime = SystemClock.uptimeMillis();    

    float x1 = 0;
    float y1 = 0;

    Display main = activity.getWindowManager().getDefaultDisplay();

    float x2 = main.getWidth();
    float y2 = main.getHeight();

    float xstep = x2 / (2 * numUpdates);
    float ystep = y2 / (2 * numUpdates);

    int id1 = 0 << MotionEvent.ACTION_POINTER_ID_SHIFT;
    int id2 = 1 << MotionEvent.ACTION_POINTER_ID_SHIFT;

    MotionEvent event = 
        MotionEvent.obtain(downTime, eventTime, 
                   MotionEvent.ACTION_DOWN + id1,
                   x1, y1, 0);
    sendPointerSync(event);
    event = 
        MotionEvent.obtain(downTime, eventTime, 
                   MotionEvent.ACTION_DOWN + id2,
                   x2, y2, 0);
    sendPointerSync(event);

    waitForIdleSync();

    for (int i = 0; i < numUpdates; i++) {
        eventTime = SystemClock.uptimeMillis();

        Log.i("",Integer.toString(i));
        x1 += xstep;
        y1 += ystep;

        x2 -= xstep;
        y2 -= ystep;

        event = 
            MotionEvent.obtain(downTime, eventTime, 
                       MotionEvent.ACTION_MOVE + id1,
                       x1, y1, 0);
        Log.i("id1", Integer.toString(MotionEvent.ACTION_MOVE + id1));
        sendPointerSync(event);
        event = 
            MotionEvent.obtain(downTime, eventTime, 
                       MotionEvent.ACTION_MOVE + id2, 
                       x2, y2, 0);
        Log.i("id1", Integer.toString(MotionEvent.ACTION_MOVE + id2));
        sendPointerSync(event);

        waitForIdleSync();
    } 

    eventTime = SystemClock.uptimeMillis();

    event = 
        MotionEvent.obtain(downTime, eventTime, 
                   MotionEvent.ACTION_UP + id1, 
                   x1, y1, 0);
    sendPointerSync(event);
    event = 
        MotionEvent.obtain(downTime, eventTime, 
                   MotionEvent.ACTION_UP + id2, 
                   x2, y2, 0);
    sendPointerSync(event);

    waitForIdleSync();
}

В результате получается, что приложение обрабатывает два события как отдельные и не регистрирует их как одно событие. Есть ли лучший способ сделать это?

Ответы [ 4 ]

1 голос
/ 10 июня 2011

посмотрите здесь: https://stackoverflow.com/questions/522312/best-practices-for-unit-testing-android-apps

Я думаю, что мультитач-модульное тестирование невозможно со стандартной платформой Android.

0 голосов
/ 18 декабря 2013

Это вполне возможно, как показывает этот пост на stackoverflow . Решает проблему для моей установки.

0 голосов
/ 20 июля 2012

Я думаю, что Android API MotionEvent (ACTION_POINTER_DOWN, ACTION_MOVE, ACTION_POINTER_UP) решит проблему мультитач.Однако я не знаю, как получить параметр «numUpdates».

0 голосов
/ 10 июня 2011

Я не совсем уверен, что вы делаете неправильно, но я думаю, что есть некоторые статьи, которые могут вам помочь.

Это сообщение в блоге от Google о работе с мультитач, и даже показывает, как можно сделать жест масштабирования двумя пальцами (то есть масштаб), который можно отличить от жеста скольжения / прокрутки / перетаскивания одним пальцем.

Вот ссылка на код из примера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...