思路
计算当前位置和目标位置,通过adb命令实现长按操作。
通过WindowManager addView 将辅助View添加到屏幕最顶层。
辅助view是计算起始的两个点。然后算出距离
需要注意:Android 模拟应用点击需要root
效果

底部有下载链接
核心代码
public class TouchView extends View {
public final static String TAG = "TouchView";
private boolean mOntouch = false;
private long mTouchTimeStamp;
private Paint mPaint;
private float mX;
private float mY;
public final static int PARAM_Y = 0;
private int mInterval;
private AtomicInteger mAtomicInteger = new AtomicInteger(0);
private Point[] mPoint = new Point[2];
public TouchView(Context context) {
super(context);
}
public TouchView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}
public TouchView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setColor(Color.parseColor("#FF0000"));
}
@Override
protected void onDraw(Canvas canvas) {
if (mAtomicInteger.intValue() == 1) {
int y = mPoint[0].y - PARAM_Y;
canvas.drawCircle(mPoint[0].x, y, 20, mPaint);
}else if (mAtomicInteger.intValue() == 2) {
int y1 = mPoint[0].y - PARAM_Y;
canvas.drawCircle(mPoint[0].x, y1, 20, mPaint);
int y2 = mPoint[1].y - PARAM_Y;
canvas.drawCircle(mPoint[1].x, y2, 20, mPaint);
}
super.onDraw(canvas);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
final int action = MotionEventCompat.getActionMasked(event);
switch (action) {
case MotionEvent.ACTION_DOWN: {
mOntouch = true;
mTouchTimeStamp = System.currentTimeMillis();
float x = MotionEventCompat.getX(event, 0);
float y = MotionEventCompat.getY(event, 0);
postInvalidate();
if (mRunnable != null) {
removeCallbacks(mRunnable);
}
Point point = new Point((int) x, (int) y);
mPoint[mAtomicInteger.intValue()] = point;
postInvalidate();
break;
}
case MotionEvent.ACTION_MOVE: {
float x = MotionEventCompat.getX(event, 0);
float y = MotionEventCompat.getY(event, 0);
mPoint[mAtomicInteger.intValue()].set((int) x, (int) y);
postInvalidate();
break;
}
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
mAtomicInteger.incrementAndGet();
if (mAtomicInteger.intValue() == 2) {
mInterval = (int) (Math.sqrt(Math.pow(mPoint[0].y -mPoint[1].y, 2) + Math.pow(mPoint[0].x -mPoint[1].x, 2)) * 1.39);
Log.d(TAG, mInterval + "");
postDelayed(mRunnable, 100);
}
postInvalidate();
break;
}
return false;
}
private Runnable mRunnable = new Runnable() {
@Override
public void run() {
new Thread(new Runnable() {
@Override
public void run() {
mAtomicInteger.set(0);
execShellClickCmd();
postInvalidate();
}
}).start();
}
};
private void execShellClickCmd() {
try {
ShellUtils.execCommand("input swipe 400 400 400 500 " + mInterval, true);
} catch (Throwable t) {
t.printStackTrace();
}
}
github 地址:
https://github.com/ccyingzi2009/JumpHelper.git
apk下载地址

网友评论