레이블이 pinch인 게시물을 표시합니다. 모든 게시물 표시
레이블이 pinch인 게시물을 표시합니다. 모든 게시물 표시

2013년 5월 17일 금요일

Pinch to zoom with mouse wheel.

Pinch to Zoom with mouse wheel.





You can test it.
download libinput.so here.


$adb remount
$adb push libinput.so /system/lib/
$adb shell sync
$adb shell reboot

settings -> Developer options -> Show touches(check)

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