2015.04.12 16:19


[Android] onTouchEvent 에서의 MotionEvent 터치 구분



@Override

public boolean onTouchEvent(MotionEvent event) {

int action = event.getAction();

int touch_id = ((action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> 8 );

int actionEvent = action & MotionEvent.ACTION_MASK; // MotionEvent.ACTION_MASK = 0xff

pointerCount = event.getPointerCount();


switch (actionEvent) {

case MotionEvent.ACTION_DOWN: {

...

}


위와 같이 action 값을 받게 되면 해당 action 값에는 Touch 동작 관련 HEX 값이 들어가게 된다

Integer.toHexString(action) 를 통해 int 값을 HEX 로 출력하면 16진수로 다음과같은 값으로 터치를 구분할 수 있다

0x___

세번째 두번째 첫번째


첫번째 값은 터치의 Up, Down, Move 를 판별 가능하며, 첫번째 터치인경우와 두번째 터치 이후의 터치의 경우 Up 과 Down 구분 값이 다음과 같이 달라진다.

     Primary Finger DOWN = 0        Primary Finger UP     = 1

non-Primary Finger DOWN 5   non-Primary Finger UP     = 6

All Finger MOVE             = 2


두번째 값은 0 이 입력되고 0 이외의 값은 본적이 없다. (나중에 추가로 조사를 해봐야 할듯)


세번째 값은 touch ID 값으로 첫번째 터치인경우 0의 값 두번째 터치인 경우 1의값 세번째 터치인 경우 2의 값이 들어가며 멀티 터치를 지원하는 최대 값까지 입력된다. 한개의 터치가 Release 되는 경우에는 아직 터치상태인 나머지 터치의 action 의 세번째 Hex 값은 첫번째 터치 값인 0부터 다시 차례대로 터치한 상태로 매겨지게 된다. 자세한 사항은 아래 참고의 예를 확인

- 참고 : 첫번째 터치시에 값은 0 두번째 터치시에 값은 1, 세번째 터치시에 값은 2 이다.

이상태에서 터치를 Release 하는 경우에는 해당 터치 ID 의 값이 입력된다.

예를 들면 3번째까지 터치한 상태에서 두번째 터치한 손가락을 Release 하는 경우에는 action의 세번째 Hex 값은 1이된다.

또한 이상태에서 현재 터치한 Count 값은 총 2개이다. 그리고 나머지 첫번째 터치한 action의 세번째 Hex 값은 그대로 0이고 세번째 터치한 action 의 세번째 Hex 값은 기존의 2에서 1로 변경되게 된다.





나같은 경우에는 위 코드와 같이 action 값을 세번째 Hex 값, 첫번째 두번째 Hex 값으로 아래와 같이 저장하여 이용한다.

int action = event.getAction();

int touch_id = ((action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> 8 );

int actionEvent = action & MotionEvent.ACTION_MASK; // MotionEvent.ACTION_MASK = 0xff






신고


Posted by injunech
2015.04.11 11:01


Android에서 'Android library projects cannot be launched' 에러가 발생 할 수 있다. 이 문제는 project를 application이 아닌 Library로 인식하기 때문에 발생할 수 있다. 다음을 체크해 보자


Project Properties > Android > Is Library 가 체크되어 있는지를 확인한다.

만약 체크되어 있다면 체크해제 후 재 실행하면 해결 할 수 있다.

신고


Posted by injunech
2015.04.10 22:47



디바이스는 하드웨어를 말한다. 

드라이버는 하드웨어를 다루는 소프트웨어를 말한다.

예를 들어보자.

UART 칩이 16개 달려있다고 했을 때 이를 제어하는 드라이버는 하나이다.

하지만 UART 칩이 16개 이니 디바이스는 16개 이다.

 

이제 리눅스 커널로 확장해 보자

arm 코아의 커널을 다루게 되면 항상 수정하거나 참고하는 파일이 있다.

EM-S5PV210  기준으로

arch/arm/mach-s5pv210/mach-ezs5pv210.c  파일이다.

 

이곳에서 보면 struct platform_device  구조체를 흔히 볼수 있다.

이 구조체의 몇몇 멤버를  보자

  • name           문자열 이름
  • id                 정수형 아이디
  • resource      리소스 구조체 포인터 (리소스 구조체는 하드웨의 주소나 인터럽트 정보가 나열된다.)   
  • num_resources    리소스 구조체 개수

다신한번 이 구조체의 이름이 struct platform_device 이다.   즉 디바이스인 것이다.

이 구조체는  아래의 함수를 통해 등록된다.

  • platform_add_devices()       여러개의 디바이스들을 한번에 등록
  • platform_device_register()  하나의 디바이스를 등록

 

 

이제  커널의 driver  디렉토리의 무수한 소스파일들을 보자 

모두다  struct platform_driver  구조체를 품고 있다.

이제 struct platform_driver 구조체의 주요한 멤버를 보자

  • probe         초기 실행함수
  • remove       드라이버 제거시 실행되는 함수
  • driver  =  {  .name       드라이버 이름

이 구조체는  platform_driver_register() 함수를 통해 등록된다.

 

 

이제 흐름을 따라가 보자

커널 시작시 디바이스들이 등록된다.  리소스가 등록되는 것이다.  UART칩이  16개 있다면 디바이스가 16 등록된다.

잠시후에 커널 드라이버가 등록된다.  이때 드라이버의 이름과 동일한 디바이스의 이름이 발견되면 probe() 함수가 호출된다.

동일한 이름의 디바이스가 16개 있다면 이 probe() 함수가 16번 호출된다.

 

참고해야 할것은 struct platform_device 구조체의 id 이다.

디바이스가 하나만 있다면 이값은 -1 로 설정한다.  하지만 2개 이상일 경우 id 는 0 부터 시작해서 각 디바이스마다  고유한 값을 넣는다.,

대게 1씩 순서대로 값을 넣는다.

 

struct platform_device 의 멤버 name 과  struct platform_driver 의  멤버 driver.name 은 동일한 값을 갖는다.

디바이스가 하나일 경우 디바이스의 이름과  드라이버의 이름은 같다.

하지만 디바이스가 여러개 일 경우  드라이버 이름은 보이는 대로의 이름이지만

디바이스의 경우   uart.0   uart.1  이렇게  숫자를 달고 나온다.   id 로 확장된 것이다.

아래의 매크로를 이용하여 디바이스 이름을 얻는다.

  • dev_name(&platform_device->dev)

이제 디바이스 드라이버가  한결 쉬워질 것이다.

신고


Posted by injunech

티스토리 툴바