HTC Sensation Android 原生的命令input 不支持move操作.因此需要通过 IWindowManager进行move操作.
IWindowManager.Stub.asInterface(ServiceManager.getService("window")).injectPointerEvent(motionEvent, true);
/**
* 划屏操作
* @param startX 起始点x
* @param startY 起始点y
* @param endX 结束点x
* @param endY 结束点y
*/
private static void move(String startX,String startY,String endX,String endY){
MotionEvent motionEvent=MotionEvent.obtain(SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(),MotionEvent.ACTION_DOWN,Float.parseFloat(startX),
Float.parseFloat(startY),0);
sendPointerSync(motionEvent);
motionEvent=MotionEvent.obtain(SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(),MotionEvent.ACTION_MOVE,Float.parseFloat(startX),
Float.parseFloat(startY),0);
sendPointerSync(motionEvent);
motionEvent=MotionEvent.obtain(SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(),MotionEvent.ACTION_MOVE,Float.parseFloat(startX),
Float.parseFloat(startY),0);
sendPointerSync(motionEvent);
motionEvent=MotionEvent.obtain(SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(),MotionEvent.ACTION_MOVE,Float.parseFloat(endX),
Float.parseFloat(endY),0);
sendPointerSync(motionEvent);
motionEvent=MotionEvent.obtain(SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(),MotionEvent.ACTION_MOVE,Float.parseFloat(endX),
Float.parseFloat(endY),0);
sendPointerSync(motionEvent);
motionEvent=MotionEvent.obtain(SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(),MotionEvent.ACTION_UP,Float.parseFloat(endX),
Float.parseFloat(endY),0);
sendPointerSync(motionEvent);
}
通过上面的一串代码模拟划屏,使用过程中遇到一个问题.
x坐标变化过大,会导致屏幕的不停旋转.无法友好的执行划屏动作.一般x坐标跨度大于100会引发问题。
通过减小移动跨度解决划屏的问题.
322 156 262 206 右移动
322 156 382 206 左移动
通过减小x坐标的跨度可以避免屏幕不断旋转的问题.
对于划屏的动作可以进行决策,分成 左右2类动作,通过固定的点动作解决划屏不断旋转的问题