Instrumentation 模擬物理鍵盤 組合鍵(SHIFT + 1)的按鍵事件 模擬滑動事件

android  下列代碼實現物理鍵同時按下“Shift”與“1”鍵盤的效果,打出效果就是“!”,
     new Thread() {
                    public void run() {

                        try {
                            if (instru == null) {
                                instru = new Instrumentation();
                            }

                            // 通過keycode來執行相應操作
                            long  downTime= SystemClock.uptimeMillis();
                            long  eventTime= downTime;
                            instru.sendKeySync(new KeyEvent(downTime,eventTime,KeyEvent.ACTION_DOWN,keyc ,0, KeyEvent.META_SHIFT_ON));
                            instru.sendKeySync(new KeyEvent(downTime,eventTime,KeyEvent.ACTION_UP, keyc,0, KeyEvent.META_SHIFT_ON));

                        } catch (Exception e) {
                            Log.e("wxception when onEvent:", e.toString());
                        }
                    }

                }.start();

這裏用到了keyevent構造函數裏的元狀態值實現,一般android都用不到,所以基本上都傳的none,但其實是可以傳入shift的。

當然還有其他的鍵位

        "META_SHIFT_ON",
        "META_ALT_ON",
        "META_SYM_ON",
        "META_FUNCTION_ON",

 

模擬滑動事件

private void sendHover(final float x,final float y,final int isup){
        new Thread(new Runnable() {
            @Override
            public void run() {
                //Log.e("nodes","sendhover");
                Instrumentation iso=new Instrumentation();
                iso.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis(),MotionEvent.ACTION_DOWN, x, y, 0));
                iso.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis(),MotionEvent.ACTION_MOVE, x, y, 0));
                iso.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis()+20,MotionEvent.ACTION_MOVE, x, y-30*isup, 0));
                iso.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis()+40,MotionEvent.ACTION_MOVE, x, y-60*isup, 0));
                iso.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis()+60,MotionEvent.ACTION_MOVE, x, y-90*isup, 0));
                iso.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis()+60,MotionEvent.ACTION_UP, x, y-90*isup, 0));
            }
        }).start();
    }

 模擬點擊事件

private void sendEvent(final float x,final float y){
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Instrumentation inst = new Instrumentation();
                    inst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, x, y, 0));
                    inst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, x, y, 0));
                }catch (Exception ex){
                    ex.printStackTrace();
                }
            }
        }).start();
        inputBox.setSelectAllOnFocus(true);
        if(inputBox.hasFocus()){
            inputBox.selectAll();
        }
    }

 模擬長按事件

private void sendLongTouch(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                Instrumentation iso=new Instrumentation();
                float x = imgMouse.getX();
                float y = imgMouse.getY();
                iso.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis(),MotionEvent.ACTION_DOWN, x, y, 0));
                iso.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis(),MotionEvent.ACTION_MOVE, x, y, 0));
                iso.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis()+1000,MotionEvent.ACTION_UP, x, y, 0));
            }
        }).start();
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章