UiAutomator 有没有办法修改 UiObject 类 longclick () 长按的时间呢?

Action · 2015年12月19日 · 最后由 UDLD 回复于 2016年08月17日 · 2753 次阅读

看到百度贴吧有网友在问这个问题,我去看了一下 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 一起讨论。

共收到 6 条回复 时间 点赞
UiObject button = new UiObject(new UiSelector().text("button"));
Rect buttonRect = button.getBounds();
getUiDevice().swipe(buttonRect.centerX(), buttonRect.centerY(),  buttonRect.centerX(), buttonRect.centerY(), 2000);

#1 楼 @sanlengjingvv 哈哈哈,你真是太聪明了!这种办法都能想得到。我去试一下

#1 楼 @sanlengjingvv 试验成功。不过那个时间不好掌握,根据 api 文档 1 step 等于 5ms,但我那个虚拟机好像等于 15ms 左右。以前看过文章说这个时间会根据系统的不同而不同。

用反射就可以调到 InteractionController

可以,重写 longclick ,自己传个参数进去 想长按多久就多久
/**
* 重写控件长按操作
* @param ud
* @param uiObject
* @param steps
* @throws UiObjectNotFoundException
*/
public void longClick(UiDevice ud, UiObject uiObject,int steps) throws UiObjectNotFoundException{
ud.swipe(uiObject.getBounds().centerX(), uiObject.getBounds().centerY(),
uiObject.getBounds().centerX(), uiObject.getBounds().centerY(), steps);
}

例如:longClick(getUiDevice(), sw, 100);

反射

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册