터치 장치

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

Android는 스타일러스 기반 디지타이저 태블릿을 포함하여 다양한 터치 스크린과 터치 패드를 지원합니다.

터치 스크린은 사용자가 화면에서 항목을 직접 조작하는 느낌을 갖도록 디스플레이와 연결된 터치 장치입니다.

터치 패드는 디지타이저 태블릿과 같이 디스플레이와 연결되지 않은 터치 장치입니다. 터치 패드는 일반적으로 사용자 인터페이스의 포인팅 또는 절대적 간접 포지셔닝 또는 제스처 기반 제어에 사용됩니다.

터치 장치에는 마우스 버튼과 기능이 유사한 버튼이 있을 수 있습니다.

기본 터치 센서 기술에 따라 손가락이나 스타일러스와 같은 다양한 도구를 사용하여 터치 장치를 조작할 수 있습니다.

터치 장치는 때때로 가상 키를 구현하는 데 사용됩니다. 예를 들어 일부 Android 장치에서 터치 스크린 센서 영역은 디스플레이 가장자리를 넘어 확장되어 터치 감지 키패드의 일부로 이중 용도로 사용됩니다.

매우 다양한 터치 장치로 인해 Android는 많은 구성 속성에 의존하여 각 장치의 특성과 원하는 동작을 설명합니다.

터치 디바이스 분류

입력 장치는 다음 조건이 모두 충족되는 경우 멀티터치 장치로 분류됩니다.

  • 입력 장치는 ABS_MT_POSITION_XABS_MT_POSITION_Y 절대 축의 존재를 보고합니다.

  • 입력 장치에 게임 패드 버튼이 없습니다. 이 조건은 MT 축과 겹치는 코드로 축을 보고하는 특정 게임 패드의 모호성을 해결합니다.

입력 장치는 다음 조건이 모두 충족되는 경우 원터치 장치로 분류됩니다.

  • 입력 장치가 멀티터치 장치로 분류되지 않습니다. 입력 장치는 단일 터치 장치 또는 다중 터치 장치로 분류되며 둘 다로 분류되지는 않습니다.

  • 입력 장치는 ABS_XABS_Y 절대 축의 존재와 BTN_TOUCH 키 코드의 존재를 보고합니다.

입력 장치가 터치 장치로 분류되면 장치에 대한 가상 키 맵 파일 로드를 시도하여 가상 키의 존재 여부를 확인합니다. 가상 키 맵을 사용할 수 있는 경우 장치의 키 레이아웃 파일도 로드됩니다.

가상 키 맵 파일의 위치 및 형식에 대해서는 아래 섹션을 참조하십시오.

다음으로 시스템은 터치 장치에 대한 입력 장치 구성 파일을 로드합니다.

모든 내장 터치 장치에는 입력 장치 구성 파일이 있어야 합니다. 입력 장치 구성 파일이 없는 경우 시스템은 외부 USB 또는 Bluetooth HID 터치 스크린 또는 터치 패드와 같은 일반적인 범용 터치 주변 장치에 적합한 기본 구성을 선택합니다. 이러한 기본값은 내장형 터치 스크린용으로 설계되지 않았으며 대부분 잘못된 동작을 유발할 수 있습니다.

입력 장치 구성이 로드된 후 시스템은 입력 장치를 터치 스크린 , 터치 패드 또는 포인터 장치로 분류합니다.

  • 터치 스크린 장치는 화면의 개체를 직접 조작하는 데 사용됩니다. 사용자가 화면을 직접 만지고 있기 때문에 시스템은 조작 중인 개체를 나타내기 위해 추가 어포던스가 필요하지 않습니다.

  • 터치 패드 장치는 지정된 센서 영역의 터치에 대한 앱에 절대 위치 정보를 제공하는 데 사용됩니다. 디지타이저 태블릿에 유용할 수 있습니다.

  • 포인터 장치는 커서를 사용하여 화면의 개체를 간접적으로 조작하는 데 사용됩니다. 손가락은 멀티 터치 포인터 제스처로 해석됩니다. 스타일러스와 같은 다른 도구는 절대 위치를 사용하여 해석됩니다.

    자세한 내용은 간접 멀티터치 포인터 제스처 를 참조하십시오.

다음 규칙은 입력 장치를 터치 스크린 , 터치 패드 또는 포인터 장치로 분류하는 데 사용됩니다.

  • touch.deviceType 속성이 설정되면 장치 유형이 표시된 대로 설정됩니다.

  • 입력 장치가 EVIOCGPROP ioctl을 통해 INPUT_PROP_DIRECT 입력 속성의 존재를 보고하면 장치 유형이 터치 스크린 으로 설정됩니다. 이 조건은 직접 입력 터치 장치가 연결된 디스플레이에 연결되어 있다고 가정합니다.

  • 입력 장치가 EVIOCGPROP ioctl을 통해 INPUT_PROP_POINTER 입력 속성의 존재를 보고하면 장치 유형이 포인터 로 설정됩니다.

  • 입력 장치가 REL_X 또는 REL_Y 상대 축의 존재를 보고하면 장치 유형이 터치 패드 로 설정됩니다. 이 조건은 마우스와 터치 패드로 구성된 입력 장치에 대한 모호성을 해결합니다. 이 경우 마우스가 이미 포인터를 제어하고 있기 때문에 터치 패드는 포인터를 제어하는 ​​데 사용되지 않습니다.

  • 그렇지 않으면 장치 유형이 포인터 로 설정됩니다. 이 기본값은 다른 특별한 용도로 지정되지 않은 터치 패드가 포인터를 제어하는 ​​역할을 하도록 합니다.

버튼

버튼은 추가 기능을 수행하기 위해 응용 프로그램에서 사용할 수 있는 선택적 컨트롤입니다. 터치 장치의 버튼은 마우스 버튼과 유사하게 작동하며 주로 포인터 유형 터치 장치 또는 스타일러스와 함께 사용됩니다.

다음 버튼이 지원됩니다.

  • BTN_LEFT : MotionEvent.BUTTON_PRIMARY 에 매핑됩니다.

  • BTN_RIGHT : MotionEvent.BUTTON_SECONDARY 에 매핑됩니다.

  • BTN_MIDDLE : MotionEvent.BUTTON_MIDDLE 에 매핑됩니다.

  • BTN_BACKBTN_SIDE : MotionEvent.BUTTON_BACK 에 매핑됩니다. 이 버튼을 누르면 키 코드가 KeyEvent.KEYCODE_BACK 인 키 누름도 합성됩니다.

  • BTN_FORWARDBTN_EXTRA : MotionEvent.BUTTON_FORWARD 에 매핑됩니다. 이 버튼을 누르면 키 코드가 KeyEvent.KEYCODE_FORWARD 인 키 누름도 합성됩니다.

  • BTN_STYLUS : MotionEvent.BUTTON_SECONDARY 에 매핑됩니다.

  • BTN_STYLUS2 : MotionEvent.BUTTON_TERTIARY 에 매핑됩니다.

도구 및 도구 유형

도구 는 터치 장치와 상호 작용하는 데 사용되는 손가락, 스타일러스 또는 기타 장치입니다. 일부 터치 장치는 서로 다른 유형의 도구를 구분할 수 있습니다.

Android의 다른 곳에서는 MotionEvent API에서와 같이 도구 를 종종 포인터 라고 합니다.

다음 도구 유형이 지원됩니다.

  • BTN_TOOL_FINGERMT_TOOL_FINGER : MotionEvent.TOOL_TYPE_FINGER 에 매핑됩니다.

  • BTN_TOOL_PENMT_TOOL_PEN : MotionEvent.TOOL_TYPE_STYLUS 에 매핑됩니다.

  • BTN_TOOL_RUBBER : MotionEvent.TOOL_TYPE_ERASER 에 매핑됩니다.

  • BTN_TOOL_BRUSH : MotionEvent.TOOL_TYPE_STYLUS 에 매핑됩니다.

  • BTN_TOOL_PENCIL : MotionEvent.TOOL_TYPE_STYLUS 에 매핑됩니다.

  • BTN_TOOL_AIRBRUSH : MotionEvent.TOOL_TYPE_STYLUS 에 매핑됩니다.

  • BTN_TOOL_MOUSE : MotionEvent.TOOL_TYPE_MOUSE 에 매핑됩니다.

  • BTN_TOOL_LENS : MotionEvent.TOOL_TYPE_MOUSE 에 매핑됩니다.

  • BTN_TOOL_DOUBLETAP , BTN_TOOL_TRIPLETAPBTN_TOOL_QUADTAP : MotionEvent.TOOL_TYPE_FINGER 에 매핑됩니다.

호버링 대 터치 도구

도구는 터치 장치와 접촉하거나 범위 내에 있고 그 위에 떠 있을 수 있습니다. 모든 터치 장치가 터치 장치 위에 떠 있는 도구의 존재를 감지할 수 있는 것은 아닙니다. RF 기반 스타일러스 디지타이저와 같이 그렇게 하는 것들은 도구가 디지타이저의 제한된 범위 내에 있을 때 종종 감지할 수 있습니다.

InputReader 구성 요소는 터치 도구와 가리키기 도구를 구분하는 데 주의를 기울입니다. 마찬가지로 터치 도구와 가리키기 도구는 서로 다른 방식으로 애플리케이션에 보고됩니다.

터치 도구는 MotionEvent.ACTION_DOWN , MotionEvent.ACTION_MOVE , MotionEvent.ACTION_DOWN , MotionEvent.ACTION_POINTER_DOWNMotionEvent.ACTION_POINTER_UP 를 사용하여 애플리케이션에 터치 이벤트로 보고됩니다.

호버링 도구는 MotionEvent.ACTION_HOVER_ENTER , MotionEvent.ACTION_HOVER_MOVEMotionEvent.ACTION_HOVER_EXIT 를 사용하여 애플리케이션에 일반 모션 이벤트로 보고됩니다.

터치 장치 드라이버 요구 사항

  1. 터치 장치 드라이버는 실제로 지원하는 축과 버튼에 대한 축과 키 코드만 등록해야 합니다. 과도한 축 또는 키 코드를 등록하면 장치 분류 알고리즘을 혼동하거나 시스템이 장치의 기능을 잘못 감지할 수 있습니다.

    예를 들어 장치가 BTN_TOUCH 키 코드를 보고하면 시스템은 BTN_TOUCH 가 항상 도구가 실제로 화면을 터치하고 있는지 여부를 나타내는 데 사용된다고 가정합니다. 따라서 BTN_TOUCH 는 도구가 단순히 범위 내에 있고 가리키고 있음을 나타내기 위해 사용해서는 안 됩니다.

  2. 원터치 장치는 다음 Linux 입력 이벤트를 사용합니다.

    • ABS_X : (필수) 도구의 X 좌표를 보고합니다.

    • ABS_Y : (필수) 도구의 Y 좌표를 보고합니다.

    • ABS_PRESSURE : (선택 사항) 도구 끝에 적용된 물리적 압력 또는 터치 접촉의 신호 강도를 보고합니다.

    • ABS_TOOL_WIDTH : (선택 사항) 터치 접촉 또는 도구 자체의 단면적 또는 너비를 보고합니다.

    • ABS_DISTANCE : (선택 사항) 터치 장치 표면에서 도구까지의 거리를 보고합니다.

    • ABS_TILT_X : (선택 사항) X축을 따라 터치 장치의 표면에서 도구의 기울기를 보고합니다.

    • ABS_TILT_Y : (선택 사항) Y축을 따라 터치 장치 표면에서 도구의 기울기를 보고합니다.

    • BTN_TOUCH : (필수) 도구가 장치에 닿았는지 여부를 나타냅니다.

    • BTN_LEFT , BTN_RIGHT , BTN_MIDDLE , BTN_BACK , BTN_SIDE , BTN_FORWARD , BTN_EXTRA , BTN_STYLUS , BTN_STYLUS2 : (선택 사항) 버튼 상태를 보고합니다.

    • BTN_TOOL_FINGER , BTN_TOOL_PEN , BTN_TOOL_RUBBER , BTN_TOOL_BRUSH , BTN_TOOL_PENCIL , BTN_TOOL_AIRBRUSH , BTN_TOOL_MOUSE , BTN_TOOL_LENS , BTN_TOOL_DOUBLETAP , BTN_TOOL_TRIPLETAP , BTN_TOOL_QUADTAP : (선택 사항) 도구 유형 을 보고합니다.

  3. 멀티터치 장치는 다음 Linux 입력 이벤트를 사용합니다.

    • ABS_MT_POSITION_X : (필수) 도구의 X 좌표를 보고합니다.

    • ABS_MT_POSITION_Y : (필수) 도구의 Y 좌표를 보고합니다.

    • ABS_MT_PRESSURE : (선택 사항) 도구 끝에 적용된 물리적 압력 또는 터치 접촉의 신호 강도를 보고합니다.

    • ABS_MT_TOUCH_MAJOR : (선택 사항) 터치 접촉의 단면적 또는 터치 접촉의 더 긴 치수의 길이를 보고합니다.

    • ABS_MT_TOUCH_MINOR : (선택 사항) 터치 접점의 더 짧은 치수의 길이를 보고합니다. ABS_MT_TOUCH_MAJOR 가 면적 측정을 보고하는 경우 이 축을 사용하면 안 됩니다.

    • ABS_MT_WIDTH_MAJOR : (선택 사항) 도구 자체의 단면적 또는 도구 자체의 긴 치수 길이를 보고합니다. 공구 자체의 치수를 알 수 없는 경우 이 축을 사용하면 안 됩니다.

    • ABS_MT_WIDTH_MINOR : (선택 사항) 도구 자체의 짧은 치수 길이를 보고합니다. ABS_MT_WIDTH_MAJOR 가 영역 측정을 보고하거나 도구 자체의 치수를 알 수 없는 경우 이 축을 사용하면 안 됩니다.

    • ABS_MT_ORIENTATION : (선택 사항) 도구의 방향을 보고합니다.

    • ABS_MT_DISTANCE : (선택 사항) 터치 장치 표면에서 도구까지의 거리를 보고합니다.

    • ABS_MT_TOOL_TYPE : (선택 사항) 도구 유형MT_TOOL_FINGER 또는 MT_TOOL_PEN 으로 보고합니다.

    • ABS_MT_TRACKING_ID : (선택 사항) 도구의 추적 ID를 보고합니다. 추적 ID는 여러 도구가 활성화된 경우 각 도구를 독립적으로 식별하고 추적하는 데 사용되는 임의의 음이 아닌 정수입니다. 예를 들어 여러 손가락이 장치를 터치하는 경우 각 손가락에는 손가락이 접촉한 상태로 유지되는 동안 사용되는 고유한 추적 ID가 할당되어야 합니다. 관련 도구가 범위를 벗어나면 추적 ID를 재사용할 수 있습니다.

    • ABS_MT_SLOT : (선택 사항) Linux 멀티 터치 프로토콜 'B'를 사용할 때 도구의 슬롯 ID를 보고합니다. 자세한 내용은 Linux 멀티 터치 프로토콜 설명서를 참조하십시오.

    • BTN_TOUCH : (필수) 도구가 장치에 닿았는지 여부를 나타냅니다.

    • BTN_LEFT , BTN_RIGHT , BTN_MIDDLE , BTN_BACK , BTN_SIDE , BTN_FORWARD , BTN_EXTRA , BTN_STYLUS , BTN_STYLUS2 : (선택 사항) 버튼 상태를 보고합니다.

    • BTN_TOOL_FINGER , BTN_TOOL_PEN , BTN_TOOL_RUBBER , BTN_TOOL_BRUSH , BTN_TOOL_PENCIL , BTN_TOOL_AIRBRUSH , BTN_TOOL_MOUSE , BTN_TOOL_LENS , BTN_TOOL_DOUBLETAP , BTN_TOOL_TRIPLETAP , BTN_TOOL_QUADTAP : (선택 사항) 도구 유형 을 보고합니다.

  4. 싱글터치 및 멀티터치 프로토콜에 대한 축이 모두 정의된 경우 멀티터치 축만 사용되고 싱글터치 축은 무시됩니다.

  5. ABS_X , ABS_Y , ABS_MT_POSITION_XABS_MT_POSITION_Y 축의 최소값과 최대값은 장치별 표면 단위로 장치의 활성 영역 범위를 정의합니다. 터치 스크린의 경우 활성 영역은 실제로 디스플레이를 덮는 터치 장치 부분을 나타냅니다.

    터치 스크린의 경우 시스템은 다음 계산에 따라 디스플레이 픽셀의 터치 위치를 얻기 위해 표면 단위로 보고된 터치 위치를 자동으로 보간합니다.

    displayX = (x - minX) * displayWidth / (maxX - minX + 1)
    displayY = (y - minY) * displayHeight / (maxY - minY + 1)
    

    터치 스크린은 보고된 활성 영역 외부의 터치를 보고할 수 있습니다.

    활성 영역 외부에서 시작된 터치는 애플리케이션에 전달되지 않지만 가상 키에 사용될 수 있습니다.

    활성 영역 내에서 시작된 터치 또는 디스플레이 영역에 들어가고 나오는 터치는 애플리케이션에 전달됩니다. 결과적으로 터치가 애플리케이션 범위 내에서 시작된 다음 활성 영역 밖으로 이동하는 경우 애플리케이션은 디스플레이 좌표가 음수이거나 디스플레이 범위를 벗어나는 터치 이벤트를 수신할 수 있습니다. 이것은 예상되는 동작입니다.

    터치 장치는 활성 영역의 경계에 터치 좌표를 고정해서는 안 됩니다. 터치가 활성 영역을 벗어나면 활성 영역 외부에 있는 것으로 보고되거나 전혀 보고되지 않아야 합니다.

    예를 들어 사용자의 손가락이 터치 스크린의 왼쪽 상단 근처를 터치하는 경우 (minX, minY)의 좌표를 보고할 수 있습니다. 손가락이 계속 활성 영역 밖으로 더 멀리 이동하면 터치 스크린은 (minX - 2, minY - 3)과 같이 minX 및 minY보다 작은 구성 요소로 좌표 보고를 시작하거나 터치 보고를 모두 중지해야 합니다. 즉, 사용자의 손가락이 실제로 활성 영역 외부에 닿을 때 터치 스크린이 보고(minX, minY) 하지 않아야 합니다.

    디스플레이 가장자리에 터치 좌표를 클램핑하면 화면 가장자리 주위에 인위적인 단단한 경계가 생성되어 시스템이 디스플레이 영역의 경계에 들어오거나 나가는 동작을 원활하게 추적하지 못합니다.

  6. ABS_PRESSURE 또는 ABS_MT_PRESSURE 에 의해 보고되는 값은 보고되는 경우 도구가 장치에 닿을 때 0이 아니어야 하고 그렇지 않으면 도구가 가리키고 있음을 나타내기 위해 0이어야 합니다.

    압력 정보 보고는 선택 사항 이지만 강력하게 권장됩니다. 애플리케이션은 압력 정보를 사용하여 압력에 민감한 그리기 및 기타 효과를 구현할 수 있습니다.

  7. ABS_TOOL_WIDTH , ABS_MT_TOUCH_MAJOR , ABS_MT_TOUCH_MINOR , ABS_MT_WIDTH_MAJOR 또는 ABS_MT_WIDTH_MINOR 에 의해 보고된 값은 도구가 장치에 닿을 때 0이 아니어야 하고 그렇지 않으면 0이어야 하지만 필수 사항은 아닙니다. 예를 들어, 터치 장치는 손가락 터치 접촉의 크기를 측정할 수 있지만 스타일러스 터치 접촉은 측정할 수 없습니다.

    보고 크기 정보는 선택 사항 이지만 강력하게 권장됩니다. 응용 프로그램은 압력 정보를 사용하여 크기에 민감한 그리기 및 기타 효과를 구현할 수 있습니다.

  8. ABS_DISTANCE 또는 ABS_MT_DISTANCE 에 의해 보고된 값은 도구가 장치에 닿을 때 0에 가까워야 합니다. 도구가 직접 접촉하는 경우에도 거리가 0이 아닌 상태로 유지될 수 있습니다. 보고되는 정확한 값은 하드웨어가 거리를 측정하는 방식에 따라 다릅니다.

    거리 정보 보고는 선택 사항 이지만 스타일러스 장치에 권장됩니다.

  9. 도구가 장치에 수직일 때 ABS_TILT_XABS_TILT_Y 에서 보고하는 값은 0이어야 합니다. 0이 아닌 기울기는 공구가 기울어져 있음을 나타냅니다.

    X축과 Y축을 따른 기울기 각도는 수직으로부터의 각도로 지정되는 것으로 가정합니다. 중심점(완전 수직)은 각 축에 대해 (max + min) / 2 로 지정됩니다. 중심점보다 작은 값은 위쪽 또는 왼쪽으로 기울기를 나타내고 중심점보다 큰 값은 아래쪽 또는 오른쪽으로 기울기를 나타냅니다.

    InputReader 는 X 및 Y 기울기 구성 요소를 0에서 PI / 2 라디안 범위의 수직 기울기 각도와 -PI 에서 PI 라디안 범위의 평면 방향 각도로 변환합니다. 이 표현은 손가락 터치를 설명하는 데 사용되는 것과 호환되는 방향 설명으로 이어집니다.

    기울기 정보 보고는 선택 사항 이지만 스타일러스 장치에 권장됩니다.

  10. 공구 유형이 ABS_MT_TOOL_TYPE 에 의해 보고되는 BTN_TOOL_* 에 의해 보고되는 모든 공구 유형 정보를 대체합니다. 도구 유형 정보를 전혀 사용할 수 없는 경우 도구 유형의 기본값은 MotionEvent.TOOL_TYPE_FINGER 입니다.

  11. 도구는 다음 조건에 따라 활성으로 결정됩니다.

    • 원터치 프로토콜을 사용할 때 BTN_TOUCH 또는 BTN_TOOL_* 이 1이면 도구가 활성화됩니다.

      이 조건은 InputReader 가 접촉하고 있는지 또는 최소한 도구 유형인지 여부에 관계없이 도구의 특성에 대한 최소한의 정보가 필요함을 의미합니다. 사용 가능한 정보가 없으면 도구가 비활성(범위 밖)인 것으로 간주됩니다.

    • 멀티 터치 프로토콜 'A'를 사용하는 경우 가장 최근의 동기화 보고서에 나타날 때마다 도구가 활성화됩니다. 도구가 동기화 보고서에 나타나지 않으면 더 이상 존재하지 않습니다.

    • 멀티 터치 프로토콜 'B'를 사용하는 경우 활성 슬롯이 있는 한 도구가 활성화됩니다. 슬롯이 지워지면 도구가 더 이상 존재하지 않습니다.

  12. 도구는 다음 조건에 따라 호버링하는 것으로 결정됩니다.

    • 도구가 BTN_TOOL_MOUSE 또는 BTN_TOOL_LENS 인 경우 다음 조건 중 하나가 참인 경우에도 도구가 가리키지 않습니다.

    • 도구가 활성화되어 있고 드라이버가 압력 정보를 보고하고 보고된 압력이 0이면 도구가 떠 있는 것입니다.

    • 도구가 활성화되어 있고 드라이버가 BTN_TOUCH 키 코드를 지원하고 BTN_TOUCH 의 값이 0이면 도구가 가리키고 있는 것입니다.

  13. InputReader 는 멀티터치 프로토콜 'A'와 'B'를 모두 지원합니다. 새 드라이버는 'B' 프로토콜을 사용해야 하지만 둘 중 하나가 작동합니다.

  14. Android Ice Cream Sandwich 4.0부터는 Linux 입력 프로토콜 사양을 준수하도록 터치 스크린 드라이버를 변경해야 할 수 있습니다.

    다음과 같은 변경이 필요할 수 있습니다.

    • 도구가 비활성화되면(손가락이 "위로" 이동) 후속 멀티 터치 동기화 보고서에 더 이상 나타나지 않아야 합니다. 모든 도구가 비활성화되면(모든 손가락이 "위로" 이동) 드라이버는 SYN_MT_REPORT 다음에 SYN_REPORT 와 같은 빈 동기화 보고 패킷을 보내야 합니다.

      Android의 이전 버전에서는 압력 값 0을 전송하여 "up" 이벤트가 보고될 것으로 예상했습니다. 이전 동작은 Linux 입력 프로토콜 사양과 호환되지 않으며 더 이상 지원되지 않습니다.

    • 물리적 압력 또는 신호 강도 정보는 ABS_MT_PRESSURE 를 사용하여 보고해야 합니다.

      이전 버전의 Android는 ABS_MT_TOUCH_MAJOR 에서 압력 정보를 검색했습니다. 이전 동작은 Linux 입력 프로토콜 사양과 호환되지 않았으며 더 이상 지원되지 않습니다.

    • ABS_MT_TOUCH_MAJOR 를 사용하여 터치 크기 정보를 보고해야 합니다.

      이전 버전의 Android는 ABS_MT_TOOL_MAJOR 에서 크기 정보를 검색했습니다. 이전 동작은 Linux 입력 프로토콜 사양과 호환되지 않았으며 더 이상 지원되지 않습니다.

    터치 장치 드라이버는 더 이상 Android 관련 사용자 지정이 필요하지 않습니다. 표준 Linux 입력 프로토콜에 의존함으로써 Android는 수정되지 않은 드라이버를 사용하여 외부 HID 멀티 터치 터치 스크린과 같은 다양한 터치 주변 장치를 지원할 수 있습니다.

터치 장치 작동

다음은 Android에서 터치 장치 작동에 대한 간략한 요약입니다.

  1. EventHubevdev 드라이버에서 원시 이벤트를 읽습니다.

  2. InputReader 는 원시 이벤트를 사용하고 각 도구의 위치 및 기타 특성에 대한 내부 상태를 업데이트합니다. 또한 버튼 상태를 추적합니다.

  3. BACK 또는 FORWARD 버튼을 누르거나 InputDispatcher 는 키 이벤트에 대해 InputReader 에 알립니다.

  4. InputReader 는 가상 키 누름이 발생했는지 여부를 결정합니다. 그렇다면 키 이벤트에 대해 InputDispatcher 에 알립니다.

  5. InputReader 는 터치가 디스플레이 범위 내에서 시작되었는지 여부를 결정합니다. 그렇다면 터치 이벤트에 대해 InputDispatcher 에 알립니다.

  6. 터치 도구는 없지만 하나 이상의 마우스 오버 도구가 있는 경우 InputReader는 마우스 InputDispatcher 이벤트에 대해 InputReader 에 알립니다.

  7. 터치 장치 유형이 포인터 인 경우 InputReader 는 포인터 제스처 감지를 수행하고 그에 따라 포인터와 스팟을 이동하고 포인터 이벤트에 대해 InputDispatcher 에 알립니다.

  8. InputDispatcherWindowManagerPolicy 를 사용하여 이벤트를 발송해야 하는지 여부와 장치를 깨워야 하는지 여부를 결정합니다. 그런 다음 InputDispatcher 는 적절한 응용 프로그램에 이벤트를 전달합니다.

터치 장치 구성

터치 장치 동작은 장치의 축, 버튼, 입력 속성, 입력 장치 구성, 가상 키 맵 및 키 레이아웃에 의해 결정됩니다.

키보드 구성에 참여하는 파일에 대한 자세한 내용은 다음 섹션을 참조하십시오.

속성

시스템은 많은 입력 장치 구성 속성에 의존하여 터치 장치 동작을 구성하고 보정합니다.

이에 대한 한 가지 이유는 터치 장치용 장치 드라이버가 종종 장치별 단위를 사용하여 터치의 특성을 보고하기 때문입니다.

예를 들어 많은 터치 장치는 터치에 의해 트리거된 총 센서 노드 수와 같은 내부 장치별 척도를 사용하여 터치 접촉 영역을 측정합니다. 이 원시 크기 값은 터치 장치 센서 노드의 물리적 크기 및 기타 특성에 대해 알아야 하기 때문에 응용 프로그램에 의미가 없습니다.

시스템은 입력 장치 구성 파일에 인코딩된 보정 매개변수를 사용하여 터치 장치에서 보고된 값을 응용 프로그램이 이해할 수 있는 더 간단한 표준 표현으로 디코딩, 변환 및 정규화합니다.

문서화 규칙

문서화를 위해 다음 규칙을 사용하여 보정 프로세스 중에 시스템에서 사용하는 값을 설명합니다.

원시 축 값

다음 식은 터치 장치 드라이버가 EV_ABS 이벤트로 보고한 원시 값을 나타냅니다.

raw.x
ABS_X 또는 ABS_MT_POSITION_X 축의 값입니다.
raw.y
ABS_Y 또는 ABS_MT_POSITION_Y 축의 값입니다.
raw.pressure
ABS_PRESSURE 또는 ABS_MT_PRESSURE 축의 값 또는 사용할 수 없는 경우 0입니다.
raw.touchMajor
ABS_MT_TOUCH_MAJOR 축의 값 또는 사용할 수 없는 경우 0입니다.
raw.touchMinor
ABS_MT_TOUCH_MINOR 축의 값 또는 사용할 수 없는 경우 raw.touchMajor 입니다.
raw.toolMajor
ABS_TOOL_WIDTH 또는 ABS_MT_WIDTH_MAJOR 축의 값 또는 사용할 수 없는 경우 0입니다.
raw.toolMinor
ABS_MT_WIDTH_MINOR 축의 값 또는 사용할 수 없는 경우 raw.toolMajor 입니다.
raw.orientation
ABS_MT_ORIENTATION 축의 값 또는 사용할 수 없는 경우 0입니다.
raw.distance
ABS_DISTANCE 또는 ABS_MT_DISTANCE 축의 값 또는 사용할 수 없는 경우 0입니다.
raw.tiltX
ABS_TILT_X 축의 값 또는 사용할 수 없는 경우 0입니다.
raw.tiltY
ABS_TILT_Y 축의 값 또는 사용할 수 없는 경우 0입니다.

원시 축 범위

다음 식은 원시 값의 범위를 나타냅니다. 각 축에 대해 EVIOCGABS ioctl을 호출하여 얻습니다.

raw.*.min
원시 축의 포함 최소값입니다.
raw.*.max
원시 축의 포함 최대값입니다.
raw.*.range
raw.*.max - raw.*.min 과 같습니다.
raw.*.fuzz
원시 축의 정확도입니다. 예. fuzz = 1은 값이 +/- 1단위까지 정확함을 의미합니다.
raw.width
raw.x.range + 1 에 해당하는 터치 영역의 포함 너비입니다.
raw.height
raw.y.range + 1 에 해당하는 터치 영역의 포함 높이입니다.

출력 범위

다음 식은 출력 좌표계의 특성을 나타냅니다. 시스템은 선형 보간법을 사용하여 터치 장치에서 사용하는 표면 단위의 터치 위치 정보를 디스플레이 픽셀과 같은 애플리케이션에 보고되는 출력 단위로 변환합니다.

output.width
출력 너비입니다. 터치 스크린(디스플레이와 연결됨)의 경우 픽셀 단위의 디스플레이 너비입니다. 터치 패드(디스플레이와 연결되지 않음)의 경우 출력 너비는 raw.width 와 같으며 보간이 수행되지 않음을 나타냅니다.
output.height
출력 높이입니다. 터치 스크린(디스플레이와 연결됨)의 경우 디스플레이 높이(픽셀)입니다. 터치 패드(디스플레이와 연결되지 않음)의 경우 출력 높이는 raw.height 와 같으며 보간이 수행되지 않음을 나타냅니다.
output.diag
sqrt(output.width ^2 + output.height ^2) 와 동일한 출력 좌표계의 대각선 길이입니다.

기본 구성

터치 입력 매퍼는 입력 장치 구성 파일의 많은 구성 속성을 사용하여 보정 값을 지정합니다. 다음 표에서는 몇 가지 범용 구성 속성에 대해 설명합니다. 다른 모든 속성은 보정에 사용되는 필드와 함께 다음 섹션에 설명되어 있습니다.

touch.deviceType

정의: touch.deviceType = touchScreen | touchPad | pointer | default

터치 장치 유형을 지정합니다.

  • 값이 touchScreen 이면 터치 장치는 디스플레이와 연결된 터치 스크린입니다.

  • 값이 touchPad 인 경우 터치 장치는 디스플레이와 연결되지 않은 터치 패드입니다.

  • 값이 pointer 인 경우 터치 장치는 디스플레이와 연결되지 않은 터치 패드이며 해당 동작은 간접 멀티 터치 포인터 제스처 에 사용됩니다.

  • 값이 default 인 경우 시스템은 분류 알고리즘에 따라 장치 유형을 자동으로 감지합니다.

장치 유형이 터치 장치의 동작에 미치는 영향에 대한 자세한 내용은 분류 섹션을 참조하십시오.

Honeycomb 이전에는 모든 터치 장치가 터치 스크린으로 간주되었습니다.

touch.orientationAware

정의: touch.orientationAware = 0 | 1

터치 장치가 디스플레이 방향 변경에 반응해야 하는지 여부를 지정합니다.

  • 값이 1 이면 디스플레이 방향이 변경될 때마다 터치 장치에서 보고하는 터치 위치가 회전합니다.

  • 값이 0 이면 터치 장치에서 보고하는 터치 위치는 디스플레이 방향 변경에 영향을 받지 않습니다.

장치가 터치 스크린이면 기본값은 1 이고 그렇지 않으면 0 입니다.

시스템은 내부 및 외부 터치 스크린과 디스플레이를 구분합니다. 방향 인식 내부 터치 스크린은 내부 디스플레이의 방향에 따라 회전합니다. 방향 인식 외부 터치 스크린은 외부 디스플레이의 방향에 따라 회전됩니다.

방향 인식은 Nexus One과 같은 기기에서 터치 스크린 회전을 지원하는 데 사용됩니다. 예를 들어 장치가 원래 방향에서 시계 방향으로 90도 회전하면 터치 스크린의 절대 좌표계의 왼쪽 상단 모서리에 있는 터치가 왼쪽 상단에 있는 터치로 보고되도록 터치의 절대 위치가 다시 매핑됩니다. 디스플레이의 회전된 좌표계의 모서리입니다. 이는 애플리케이션이 시각적 요소를 그리는 데 사용하는 것과 동일한 좌표계로 터치가 보고되도록 수행됩니다.

Honeycomb 이전에는 모든 터치 장치가 방향을 인식한다고 가정했습니다.

touch.gestureMode

정의: touch.gestureMode = pointer | spots | default

포인터 제스처의 프레젠테이션 모드를 지정합니다. 이 구성 속성은 터치 장치가 포인터 유형인 경우에만 관련이 있습니다.

  • 값이 pointer 인 경우 터치 패드 제스처는 마우스 포인터와 유사한 커서 방식으로 표시됩니다.

  • 값이 spots 인 경우 터치 패드 제스처는 제스처의 중심을 나타내는 앵커와 개별 손가락의 위치를 ​​나타내는 일련의 원형 지점으로 표시됩니다.

기본값은 INPUT_PROP_SEMI_MT 입력 속성이 설정된 경우 pointer 이고 그렇지 않은 경우 spots 입니다.

XY 필드

X 및 Y 필드는 접촉 영역의 중심에 대한 위치 정보를 제공합니다.

계산

계산은 간단합니다. 터치 드라이버의 위치 정보는 출력 좌표계에 선형적으로 보간됩니다.

xScale = output.width / raw.width
yScale = output.height / raw.height

If not orientation aware or screen rotation is 0 degrees:
output.x = (raw.x - raw.x.min) * xScale
output.y = (raw.y - raw.y.min) * yScale
Else If rotation is 90 degrees:
    output.x = (raw.y - raw.y.min) * yScale
    output.y = (raw.x.max - raw.x) * xScale
Else If rotation is 180 degrees:
    output.x = (raw.x.max - raw.x) * xScale
    output.y = (raw.y.max - raw.y) * yScale
Else If rotation is 270 degrees:
    output.x = (raw.y.max - raw.y) * yScale
    output.y = (raw.x - raw.x.min) * xScale
End If

TouchMajor , TouchMinor , ToolMajor , ToolMinor , Size 필드

TouchMajorTouchMinor 필드는 접촉 영역의 대략적인 크기를 출력 단위(픽셀)로 설명합니다.

ToolMajorToolMinor 필드는 도구 자체의 대략적인 크기를 출력 단위(픽셀)로 설명합니다.

Size 필드는 터치 장치가 감지할 수 있는 가장 큰 터치에 상대적인 정규화된 터치 크기를 설명합니다. 가능한 가장 작은 정규화 크기는 0.0(접촉이 없거나 측정할 수 없음)이고 가능한 가장 큰 정규화 크기는 1.0(센서 영역이 포화됨)입니다.

대략적인 길이와 너비를 모두 측정할 수 있는 경우 TouchMajor 필드는 접촉 영역의 더 긴 치수를 지정하고 TouchMinor 필드는 더 짧은 치수를 지정합니다. 접촉 영역의 대략적인 직경만 측정할 수 있는 경우 TouchMajorTouchMinor 필드는 동일합니다.

마찬가지로 ToolMajor 필드는 더 긴 치수를 지정하고 ToolMinor 필드는 도구 단면 영역의 더 짧은 치수를 지정합니다.

터치 크기는 사용할 수 없지만 도구 크기는 사용할 수 있는 경우 도구 크기는 터치 크기와 동일하게 설정됩니다. 반대로 도구 크기를 사용할 수 없지만 터치 크기를 사용할 수 있는 경우 터치 크기는 도구 크기와 동일하게 설정됩니다.

터치 장치는 다양한 방식으로 터치 크기와 도구 크기를 측정하거나 보고합니다. 현재 구현은 표면 단위의 직경, 면적 및 기하학적 경계 상자의 세 가지 다른 종류의 측정을 지원합니다.

touch.size.calibration

정의: touch.size.calibration = none | geometric | diameter | area | default

터치 크기 및 도구 크기를 보고하기 위해 터치 드라이버에서 사용하는 측정 종류를 지정합니다.

  • 값이 none 이면 크기가 0으로 설정됩니다.

  • 값이 geometric 인 경우 크기는 위치와 동일한 표면 단위로 지정된 것으로 간주되므로 동일한 방식으로 크기가 조정됩니다.

  • 값이 diameter 인 경우 크기는 터치 또는 도구의 지름(너비)에 비례하는 것으로 간주됩니다.

  • 값이 area 인 경우 크기는 터치 또는 도구의 영역에 비례하는 것으로 간주됩니다.

  • 값이 default 인 경우 시스템은 raw.touchMajor 또는 raw.toolMajor 축을 사용할 수 있으면 geometric 보정을 사용하고, 그렇지 않으면 none 보정을 사용합니다.

touch.size.scale

정의: touch.size.scale = <음이 아닌 부동 소수점 숫자>

보정에 사용되는 상수 축척 비율을 지정합니다.

기본값은 1.0 입니다.

touch.size.bias

정의: touch.size.bias = <음수가 아닌 부동 소수점 숫자>

보정에 사용되는 상수 바이어스 값을 지정합니다.

기본값은 0.0 입니다.

touch.size.isSummed

정의: touch.size.isSummed = 0 | 1

크기가 모든 활성 연락처 크기의 합계로 보고되는지 또는 각 연락처에 대해 개별적으로 보고되는지 여부를 지정합니다.

  • 값이 1 이면 보고된 크기를 사용 전 연락처 수로 나눕니다.

  • 값이 0 이면 보고된 크기가 그대로 사용됩니다.

기본값은 0 입니다.

일부 터치 장치, 특히 "Semi-MT" 장치는 여러 접촉의 개별 치수를 구분할 수 없으므로 총 면적 또는 너비를 나타내는 크기 측정을 보고합니다. 이 속성은 이러한 장치에 대해서만 1 로 설정해야 합니다. 확실하지 않은 경우 이 값을 0 으로 설정하십시오.

계산

TouchMajor , TouchMinor , ToolMajor , ToolMinorSize 필드의 계산은 지정된 보정 매개변수에 따라 다릅니다.

If raw.touchMajor and raw.toolMajor are available:
    touchMajor = raw.touchMajor
    touchMinor = raw.touchMinor
    toolMajor = raw.toolMajor
    toolMinor = raw.toolMinor
Else If raw.touchMajor is available:
    toolMajor = touchMajor = raw.touchMajor
    toolMinor = touchMinor = raw.touchMinor
Else If raw.toolMajor is available:
    touchMajor = toolMajor = raw.toolMajor
    touchMinor = toolMinor = raw.toolMinor
Else
    touchMajor = toolMajor = 0
    touchMinor = toolMinor = 0
    size = 0
End If

size = avg(touchMajor, touchMinor)

If touch.size.isSummed == 1:
    touchMajor = touchMajor / numberOfActiveContacts
    touchMinor = touchMinor / numberOfActiveContacts
    toolMajor = toolMajor / numberOfActiveContacts
    toolMinor = toolMinor / numberOfActiveContacts
    size = size / numberOfActiveContacts
End If

If touch.size.calibration == "none":
    touchMajor = toolMajor = 0
    touchMinor = toolMinor = 0
    size = 0
Else If touch.size.calibration == "geometric":
    outputScale = average(output.width / raw.width, output.height / raw.height)
    touchMajor = touchMajor * outputScale
    touchMinor = touchMinor * outputScale
    toolMajor = toolMajor * outputScale
    toolMinor = toolMinor * outputScale
Else If touch.size.calibration == "area":
    touchMajor = sqrt(touchMajor)
    touchMinor = touchMajor
    toolMajor = sqrt(toolMajor)
    toolMinor = toolMajor
Else If touch.size.calibration == "diameter":
    touchMinor = touchMajor
    toolMinor = toolMajor
End If

If touchMajor != 0:
    output.touchMajor = touchMajor * touch.size.scale + touch.size.bias
Else
    output.touchMajor = 0
End If

If touchMinor != 0:
    output.touchMinor = touchMinor * touch.size.scale + touch.size.bias
Else
    output.touchMinor = 0
End If

If toolMajor != 0:
    output.toolMajor = toolMajor * touch.size.scale + touch.size.bias
Else
    output.toolMajor = 0
End If

If toolMinor != 0:
    output.toolMinor = toolMinor * touch.size.scale + touch.size.bias
Else
    output.toolMinor = 0
End If

output.size = size

Pressure

Pressure 필드는 터치 장치에 적용되는 대략적인 물리적 압력을 0.0(터치 없음)과 1.0(최대 힘) 사이의 정규화된 값으로 설명합니다.

압력이 0이면 도구가 호버링 중임을 나타냅니다.

touch.pressure.calibration

정의: touch.pressure.calibration = none | physical | amplitude | default

압력을 보고하기 위해 터치 드라이버가 사용하는 측정 종류를 지정합니다.

  • 값이 none 이면 압력을 알 수 없으므로 터치 시 1.0, 호버링 시 0.0으로 설정됩니다.

  • 값이 physical 인 경우 압력 축은 터치 패드에 적용된 압력의 실제 물리적 강도를 측정하는 것으로 가정합니다.

  • If the value is amplitude , the pressure axis is assumed to measure the signal amplitude, which is related to the size of the contact and the pressure applied.

  • If the value is default , the system uses the physical calibration if the pressure axis available, otherwise uses none .

touch.pressure.scale

Definition: touch.pressure.scale = <a non-negative floating point number>

Specifies a constant scale factor used in the calibration.

The default value is 1.0 / raw.pressure.max .

Calculation

The calculation of the Pressure field depends on the specified calibration parameters.

If touch.pressure.calibration == "physical" or "amplitude":
    output.pressure = raw.pressure * touch.pressure.scale
Else
    If hovering:
        output.pressure = 0
    Else
        output.pressure = 1
    End If
End If

Orientation and Tilt Fields

The Orientation field describes the orientation of the touch and tool as an angular measurement. An orientation of 0 indicates that the major axis is oriented vertically, -PI/2 indicates that the major axis is oriented to the left, PI/2 indicates that the major axis is oriented to the right. When a stylus tool is present, the orientation range may be described in a full circle range from -PI or PI .

The Tilt field describes the inclination of the tool as an angular measurement. A tilt of 0 indicates that the tool is perpendicular to the surface. A tilt of PI/2 indicates that the tool is flat on the surface.

touch.orientation.calibration

Definition: touch.orientation.calibration = none | interpolated | vector | default

Specifies the kind of measurement used by the touch driver to report the orientation.

  • If the value is none , the orientation is unknown so it is set to 0.

  • If the value is interpolated , the orientation is linearly interpolated such that a raw value of raw.orientation.min maps to -PI/2 and a raw value of raw.orientation.max maps to PI/2 . The center value of (raw.orientation.min + raw.orientation.max) / 2 maps to 0 .

  • If the value is vector , the orientation is interpreted as a packed vector consisiting of two signed 4-bit fields. This representation is used on Atmel Object Based Protocol parts. When decoded, the vector yields an orientation angle and confidence magnitude. The confidence magnitude is used to scale the size information, unless it is geometric.

  • If the value is default , the system uses the interpolated calibration if the orientation axis available, otherwise uses none .

Calculation

The calculation of the Orientation and Tilt fields depends on the specified calibration parameters and available input.

If touch.tiltX and touch.tiltY are available:
    tiltXCenter = average(raw.tiltX.min, raw.tiltX.max)
    tiltYCenter = average(raw.tiltY.min, raw.tiltY.max)
    tiltXAngle = (raw.tiltX - tiltXCenter) * PI / 180
    tiltYAngle = (raw.tiltY - tiltYCenter) * PI / 180
    output.orientation = atan2(-sin(tiltXAngle), sinf(tiltYAngle))
    output.tilt = acos(cos(tiltXAngle) * cos(tiltYAngle))
Else If touch.orientation.calibration == "interpolated":
    center = average(raw.orientation.min, raw.orientation.max)
    output.orientation = PI / (raw.orientation.max - raw.orientation.min)
    output.tilt = 0
Else If touch.orientation.calibration == "vector":
    c1 = (raw.orientation & 0xF0) >> 4
    c2 = raw.orientation & 0x0F

    If c1 != 0 or c2 != 0:
        If c1 >= 8 Then c1 = c1 - 16
        If c2 >= 8 Then c2 = c2 - 16
        angle = atan2(c1, c2) / 2
        confidence = sqrt(c1*c1 + c2*c2)

        output.orientation = angle

        If touch.size.calibration == "diameter" or "area":
            scale = 1.0 + confidence / 16
            output.touchMajor *= scale
            output.touchMinor /= scale
            output.toolMajor *= scale
            output.toolMinor /= scale
        End If
    Else
        output.orientation = 0
    End If
    output.tilt = 0
Else
    output.orientation = 0
    output.tilt = 0
End If

If orientation aware:
    If screen rotation is 90 degrees:
        output.orientation = output.orientation - PI / 2
    Else If screen rotation is 270 degrees:
        output.orientation = output.orientation + PI / 2
    End If
End If

Distance Field

The Distance field describes the distance between the tool and the touch device surface. A value of 0.0 indicates direct contact and larger values indicate increasing distance from the surface.

touch.distance.calibration

Definition: touch.distance.calibration = none | scaled | default

Specifies the kind of measurement used by the touch driver to report the distance.

  • If the value is none , the distance is unknown so it is set to 0.

  • If the value is scaled , the reported distance is multiplied by a constant scale factor.

  • If the value is default , the system uses the scaled calibration if the distance axis available, otherwise uses none .

touch.distance.scale

Definition: touch.distance.scale = <a non-negative floating point number>

Specifies a constant scale factor used in the calibration.

The default value is 1.0 .

Calculation

The calculation of the Distance field depends on the specified calibration parameters.

If touch.distance.calibration == "scaled":
    output.distance = raw.distance * touch.distance.scale
Else
    output.distance = 0
End If

Example

# Input device configuration file for a touch screen that supports pressure,
# size and orientation.  The pressure and size scale factors were obtained
# by measuring the characteristics of the device itself and deriving
# useful approximations based on the resolution of the touch sensor and the
# display.
#
# Note that these parameters are specific to a particular device model.
# Different parameters will need to be used for other devices.

# Basic Parameters
touch.deviceType = touchScreen
touch.orientationAware = 1

# Size
# Based on empirical measurements, we estimate the size of the contact
# using size = sqrt(area) * 28 + 0.
touch.size.calibration = area
touch.size.scale = 28
touch.size.bias = 0
touch.size.isSummed = 0

# Pressure
# Driver reports signal strength as pressure.
#
# A normal index finger touch typically registers about 80 signal strength
# units although we don't expect these values to be accurate.
touch.pressure.calibration = amplitude
touch.pressure.scale = 0.0125

# Orientation
touch.orientation.calibration = vector

Compatibility Notes

The configuration properties for touch devices changed significantly in Android Ice Cream Sandwich 4.0. All input device configuration files for touch devices must be updated to use the new configuration properties.

Older touch device drivers may also need to be updated.

Virtual Key Map Files

Touch devices are often used to implement virtual keys.

There are several ways of doing this, depending on the capabilities of the touch controller. Some touch controllers can be directly configured to implement soft keys by setting firmware registers. Other times it is desirable to perform the mapping from touch coordinates to key codes in software.

When virtual keys are implemented in software, the kernel must export a virtual key map file called virtualkeys.<devicename> as a board property. For example, if the touch screen device drivers reports its name as "touchyfeely" then the virtual key map file must have the path /sys/board_properties/virtualkeys.touchyfeely .

A virtual key map file describes the coordinates and Linux key codes of virtual keys on the touch screen.

In addition to the virtual key map file, there must be a corresponding key layout file and key character map file to map the Linux key codes to Android key codes and to specify the type of the keyboard device (usually SPECIAL_FUNCTION ).

Syntax

A virtual key map file is a plain text file consisting of a sequence of virtual key layout descriptions either separated by newlines or by colons.

Comment lines begin with '#' and continue to the end of the line.

Each virtual key is described by 6 colon-delimited components:

  • 0x01 : A version code. Must always be 0x01 .
  • <Linux key code>: The Linux key code of the virtual key.
  • <centerX>: The X pixel coordinate of the center of the virtual key.
  • <centerY>: The Y pixel coordinate of the center of the virtual key.
  • <width>: The width of the virtual key in pixels.
  • <height>: The height of the virtual key in pixels.

All coordinates and sizes are specified in terms of the display coordinate system.

Here is a virtual key map file all written on one line.

# All on one line
0x01:158:55:835:90:55:0x01:139:172:835:125:55:0x01:102:298:835:115:55:0x01:217:412:835:95:55

The same virtual key map file can also be written on multiple lines.

# One key per line
0x01:158:55:835:90:55
0x01:139:172:835:125:55
0x01:102:298:835:115:55
0x01:217:412:835:95:55

In the above example, the touch screen has a resolution of 480x800. Accordingly, all of the virtual keys have a <centerY> coordinate of 835, which is a little bit below the visible area of the touch screen.

The first key has a Linux scan code of 158 ( KEY_BACK ), centerX of 55 , centerY of 835 , width of 90 and height of 55 .

Example

Virtual key map file: /sys/board_properties/virtualkeys.touchyfeely .

0x01:158:55:835:90:55
0x01:139:172:835:125:55
0x01:102:298:835:115:55
0x01:217:412:835:95:55

Key layout file: /system/usr/keylayout/touchyfeely.kl .

key 158 BACK
key 139 MENU
key 172 HOME
key 217 SEARCH

Key character map file: /system/usr/keychars/touchyfeely.kcm .

type SPECIAL_FUNCTION

Indirect Multi-touch Pointer Gestures

In pointer mode, the system interprets the following gestures:

  1. Single finger tap: click.

  2. Single finger motion: move the pointer.

  3. Single finger motion plus button presses: drag the pointer.

  4. Two finger motion both fingers moving in the same direction: drag the area under the pointer in that direction. The pointer itself does not move.

  5. Two finger motion both fingers moving towards each other or apart in different directions: pan/scale/rotate the area surrounding the pointer. The pointer itself does not move.

  6. Multiple finger motion: freeform gesture.

Palm rejection

As of Android 13, the system can automatically reject inputs from palms when the built-in framework is enabled. In-house, custom-built solutions are still supported, though they might need to be modified to return the TOOL_TYPE_PALM flag when a palm is detected. The built-in framework also works in conjunction with custom solutions.

The actual model looks at the first 90 ms of gesture data, at the current pointer, and at the surrounding pointers, then considers how far away from the edge of the display the touches are. It then determines, on a per-pointer basis, which of the pointers are palms. It also takes into account the size of each contact, as reported by TouchMajor and TouchMinor . The Android framework then removes the pointers that are marked as palms from the touch stream.

If a pointer was already sent to the apps, then the system either:

  • (If there are other active pointers) Cancels the pointer with ACTION_POINTER_UP and FLAG_CANCELED set.
  • (If this is the only pointer) Cancels the pointer with ACTION_CANCEL .

A public API, MotionEvent.FLAG_CANCELED , indicates that the current event shouldn't trigger user action. This flag is set for both ACTION_CANCEL and ACTION_POINTER_UP .

If the palm pointer wasn't sent to apps, then the system simply drops the pointer.

Enable palm rejection

  1. In your touch driver, use the input_abs_set_res macro to set the resolutions for the following fields (units are pixels per mm ):
    • ABS_MT_POSITION_X
    • ABS_MT_POSITION_Y
    • ABS_MT_TOUCH_MAJOR
    • ABS_MT_TOUCH_MINOR

    Support for ABS_MT_TOUCH_MINOR is optional. However, if your device does support it, make sure the resolution is set correctly.

  2. To confirm the fields are set correctly, run:
        $ adb shell getevent -li
    
  3. To enable the feature during runtime, run:
        $ adb shell device_config put input_native_boot palm_rejection_enabled 1
    
  4. Restart the system_server process.
         $ adb shell stop && adb shell start
        
  5. Confirm that adb shell dumpsys input shows that there are palm rejectors inside UnwantedInteractionBlocker . If it doesn't, check the input-related logs to find clues on what might be misconfigured.

    See the following example for reference:

    UnwantedInteractionBlocker:
      mEnablePalmRejection: true
      isPalmRejectionEnabled (flag value): true
      mPalmRejectors:
        deviceId = 3:
          mDeviceInfo:
            max_x = 
            max_y = 
            x_res = 11.00
            y_res = 11.00
            major_radius_res = 1.00
            minor_radius_res = 1.00
            minor_radius_supported = true
            touch_major_res = 1
            touch_minor_res = 1
          mSlotState:
            mSlotsByPointerId:
    
            mPointerIdsBySlot:
    
          mSuppressedPointerIds: {}
    
  6. To permanently enable the feature, add the corresponding sysprop command in your init**rc file:

    setprop persist.device_config.input_native_boot.palm_rejection_enabled 1
    

Further Reading

  1. Linux multi-touch protocol
  2. ENAC list of available multitouch devices on Linux