看到百度贴吧有网友在问这个问题,我去看了一下 api 文档中的 configurator 类,没找到设置的方法。又去看了一下 longclick() 的源码:

public boolean longClick() throws UiObjectNotFoundException  {
        Tracer.trace();
        AccessibilityNodeInfo node = findAccessibilityNodeInfo(mConfig.getWaitForSelectorTimeout());
        if(node == null) {
            throw new UiObjectNotFoundException(getSelector().toString());
        }
        Rect rect = getVisibleBounds(node);
        return getInteractionController().longTapNoSync(rect.centerX(), rect.centerY());
    }

我原本是希望通过重写 longclick() 方法来解决这个问题,但从它的源码看,似乎是调用了 getInteractionController().longTapNoSync(rect.centerX(), rect.centerY()) 这个方法来实现的,getInteractionController() 是获取到一个 InteractionController 类的对象,然后再调用其长按的方法:

public boolean longTapNoSync(int x, int y) {
        if (DEBUG) {
            Log.d(LOG_TAG, "longTapNoSync (" + x + ", " + y + ")");
        }

        if (touchDown(x, y)) {
            SystemClock.sleep(mUiAutomatorBridge.getSystemLongPressTime());
            if(touchUp(x, y)) {
                return true;
            }
        }
        return false;
    }

也就是说如果能重写这个 longTapNoSync 方法,将它的 mUiAutomatorBridge.getSystemLongPressTime() 替换成自己所需要的时间就行了。所以我想写一个类去继承 InteractionController 类并重写他的 longTapNoSync 方法,但我发现 InteractionController 类无法被继承,因为不是公共类。

谁有办法实现这个自定义时间的长按功能吗?

=======================================================================
谢谢@sanlengjingvv所提供的答案,无须去修改底层,而是想办法用 uia 本身的 api 来实现。后来在一个群里讨论的时候,有朋友提供了更简便的解决方法,那就是用 UiObject 类所提供的 dragTo(UiObject destObj, int steps) 方法。欢迎对 uiautomator 感兴趣的朋友加入 qq 群 193286151 一起讨论。


↙↙↙阅读原文可查看相关链接,并与作者交流