2013년 5월 13일 월요일

adb shell sendevent로 pinch zoom in/out

adb shell sendevent로 android에 input event를 가상으로 보낼 수 있습니다.

http://toors.tistory.com/entry/android-touch-move-event-%EC%83%9D%EC%84%B1

위에 링크처럼 하면 move와 같이 single  touch event는 만들 수 있습니다.

pinch zoom in/out과 같은 multi touch event도 만들 수 있습니다.

getevent에서 odroidx-ts가 touch screen device이고 node는 event1입니다.

# getevent                                                    
add device 1: /dev/input/event0                                              
  name:     "odroid-keypad"                                                  
add device 2: /dev/input/event2                                              
  name:     "Microsoft Microsoft 3-Button Mouse with IntelliEye(TM)"          
add device 3: /dev/input/event1                                              
  name:     "odroidx-ts"


저의 시스템에서 touch의 노드는 /dev/input/event3입니다.

sh로 만드실 경우 system을 없애고 "adb shell sendevent"로 고치시면 됩니다.


//첫번째 pointer의 ABS_MT_TRACKING_ID를 1로 설정한다.
system("sendevent /dev/input/event1 3 57 1");
system("sendevent /dev/input/event1 3 53 %d", X1);
system("sendevent /dev/input/event1 3 54 %d", Y1);
//ABS_MT_PRESSURE 8정도의 값을 보내서 press 되었다고 알려 줍니다.
system("sendevent /dev/input/event1 3 58 8");
//한 pointer에 대한 EV_SYN, SYN_REPORT를 보낸다.
system("sendevent /dev/input/event3 0 0 0");


//두번째 pointer 입력 전에 ABS_MT_SLOT을 보낸다.
system("sendevent /dev/input/event3 3 47 1");


//두번째 pointer의 위치를 정한다.
X1 = X2 + 50;
Y2 = Y2 + 50;


//두번째 pointer
//첫번째 pointer의 ABS_MT_TRACKING_ID를 2로 설정한다.
system("sendevent /dev/input/event1 3 57 2");
system("sendevent /dev/input/event1 3 53 %d", X2);
system("sendevent /dev/input/event1 3 54 %d", Y2);  
system("sendevent /dev/input/event1 3 58 8");
system("sendevent /dev/input/event1 0 0 0");


//여기서 ABS_MT_POSITION_X(53), ABS_MT_POSITION_Y(54), 그리고 SYN_REPORT를 한 묶음으로 이동하고 싶은 만큼 반복한다.
system("sendevent /dev/input/event1 3 53 %d", X2 += 20);
system("sendevent /dev/input/event1 3 54 %d", Y2 += 20);
system("sendevent /dev/input/event1 0 0 0");


//첫번째 pointer의 ABS_MT_TR두ACKING_ID를 -1을 초기화 한다.
system("sendevent /dev/input/event1 3 57 -1");
system("sendevent /dev/input/event1 0 0 0");
//ABS_MT_SLOT(47)은 0,1로 번갈아 입력된다. 앞에서 1로 보냈으니 0으로 보낸다.
system("sendevent /dev/input/event1 3 47 0");
//두번째 pointer의 ABS_MT_TRACKING_ID를 -1을 초기화 한다.
system("sendevent /dev/input/event1 3 57 -1");
system("sendevent /dev/input/event1 0 0 0");

--------------------------------------------------------------------------------------------------

bionic/libc/kernel/common/linux/input.h에 define 되어 있습니다.

#define EV_ABS 0x03
#define ABS_MT_POSITION_X 0x35  -> 57(십진수)

#define ABS_MT_POSITION_Y 0x36 - > 58(십진수)
#define ABS_MT_PRESSURE 0x3a



아래와 같이 getevent -l 로 event를 확인 할 수 있는데 Multi touch시에 event가 어떻게 들어 오는지 확인하여 pinch zoom을 구현해 봤습니다.


$ adb shell getevent -l
add device 1: /dev/input/event0
  name:     "odroid-keypad"
add device 2: /dev/input/event2
  name:     "Microsoft Microsoft 3-Button Mouse with IntelliEye(TM)"
add device 3: /dev/input/event1
  name:     "odroidx-ts"
/dev/input/event2: EV_REL       REL_X                ffffffff          
/dev/input/event2: EV_REL       REL_Y                00000001          
/dev/input/event2: EV_SYN       SYN_REPORT           00000000          
/dev/input/event2: EV_REL       REL_X                ffffffff          
/dev/input/event2: EV_REL       REL_Y                00000002          
/dev/input/event2: EV_SYN       SYN_REPORT           00000000          
/dev/input/event2: EV_REL       REL_X                ffffffff          
/dev/input/event2: EV_REL       REL_Y                00000002          
/dev/input/event2: EV_SYN       SYN_REPORT           00000000          
/dev/input/event2: EV_REL       REL_X                ffffffff          
/dev/input/event2: EV_REL       REL_Y                00000002          
/dev/input/event2: EV_SYN       SYN_REPORT           00000000          
/dev/input/event2: EV_REL       REL_X                ffffffff          
/dev/input/event2: EV_REL       REL_Y                00000002          
/dev/input/event2: EV_SYN       SYN_REPORT           00000000          
/dev/input/event2: EV_REL       REL_X                ffffffff          
/dev/input/event2: EV_REL       REL_Y                00000002  




댓글 쓰기