该类就一个execute方法,execute方法先判断传入的参数对象是坐标值还是元素值,是元素值直接调用AndroidElement中的click方法,;是坐标的话,会调用UiDevice的click方法,它是uiautomator包中的类。appium在android api16以上使用uiautomator机制。再分析一个touchDown命令,如果传过来的命令后缀是touchDown,那么它会调用TouchDown对象的execute方法。
map.put("touchDown", new TouchDown());
TouchDown.java
package io.appium.android.bootstrap.handler; import com.android.uiautomator.common.ReflectionUtils; import com.android.uiautomator.core.UiObjectNotFoundException; import io.appium.android.bootstrap.Logger; import java.lang.reflect.Method; /** * This handler is used to perform a touchDown event on an element in the * Android UI. * */ public class TouchDown extends TouchEvent { @Override protected boolean executeTouchEvent() throws UiObjectNotFoundException { printEventDebugLine("TouchDown"); try { final ReflectionUtils utils = new ReflectionUtils(); final Method touchDown = utils.getControllerMethod("touchDown", int.class, int.class); return (Boolean) touchDown.invoke(utils.getController(), clickX, clickY); } catch (final Exception e) { Logger.debug("Problem invoking touchDown: " + e); return false; } } }
该方法用到反射机制,调用uiautomator隐藏api执行操作