【问题标题】:How do I make a MotionEvent to zoom?如何使 MotionEvent 进行缩放?
【发布时间】:2011-06-10 19:13:02
【问题描述】:

我有一个仪器想用来测试我的应用程序,但我似乎无法正确模拟捏缩放。这是我当前的代码。它的要点是:按下手指 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();
}

结果似乎是应用程序将这两个事件视为不同的,并且没有将它们注册为单个事件。有没有更好的方法来做到这一点?

【问题讨论】:

    标签: android testing instrumentation


    【解决方案1】:

    看这里:https://stackoverflow.com/questions/522312/best-practices-for-unit-testing-android-apps

    我认为使用标准 Android 框架无法进行多点触控单元测试。

    【讨论】:

    • 这怎么可能?依赖它的应用这么多,怎么能不支持单元测试呢?
    【解决方案2】:

    我不确定你到底做错了什么,但我认为那里有一些文章可能对你有所帮助。

    This blog post from Google 是关于处理多点触控的,甚至展示了如何做出与单指滑动/滚动/拖动手势不同的两指缩放(即缩放)手势。

    这是示例中的link to the code

    【讨论】:

    • 我不是要对缩放事件做出反应,而是要发送一个。我想创建一个MotionEvent,与用户实际用两根手指进行缩放时触发的事件相同。
    • 我了解到您正在尝试使用两根手指创建“缩放”手势。我相信这正是我提供的链接正在做的事情。
    • @Alex 你找到解决方案了吗?即使我正在寻找一种在我的一个应用程序中生成捏/缩放事件的方法。
    【解决方案3】:

    我认为android API MotionEvent(ACTION_POINTER_DOWN,ACTION_MOVE, ACTION_POINTER_UP) 将解决多点触控问题。 但是,我不知道如何获取参数“numUpdates”。

    【讨论】:

      【解决方案4】:

      这是完全可能的,正如this post on stackoverflow 所展示的那样。解决了我的设置问题。

      【讨论】:

        猜你喜欢
        • 2013-07-10
        • 1970-01-01
        • 2016-10-29
        • 2011-03-18
        • 1970-01-01
        • 1970-01-01
        • 2021-01-24
        • 2013-11-08
        • 2012-06-03
        相关资源
        最近更新 更多