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();
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章