微信跳一跳的辅助实现方案

思路

计算当前位置和目标位置,通过adb命令实现长按操作。
通过WindowManager addView 将辅助View添加到屏幕最顶层。
辅助view是计算起始的两个点。然后算出距离

需要注意:Android 模拟应用点击需要root

效果

Bupt.gif

底部有下载链接

核心代码

  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下载地址


微信跳一跳的辅助实现方案_第1张图片
1514709064.png

你可能感兴趣的:(微信跳一跳的辅助实现方案)