Google cam kết thúc đẩy công bằng chủng tộc cho Cộng đồng người da đen. Xem cách thực hiện.

Cảm ứng thiết bị

Android hỗ trợ nhiều loại màn hình cảm ứng và bàn di chuột, bao gồm cả máy tính bảng số hóa dựa trên bút stylus.

Màn hình cảm ứng là thiết bị cảm ứng được kết hợp với màn hình sao cho người dùng có cảm giác đang thao tác trực tiếp với các mục trên màn hình.

Bàn di chuột là thiết bị cảm ứng không được kết hợp với màn hình, chẳng hạn như máy tính bảng số hóa. Bàn di chuột thường được sử dụng để trỏ hoặc để định vị gián tiếp tuyệt đối hoặc điều khiển dựa trên cử chỉ của giao diện người dùng.

Thiết bị cảm ứng có thể có các nút có chức năng tương tự như nút chuột.

Các thiết bị cảm ứng đôi khi có thể được thao tác bằng nhiều công cụ khác nhau như ngón tay hoặc bút stylus tùy thuộc vào công nghệ cảm biến cảm ứng cơ bản.

Các thiết bị cảm ứng đôi khi được sử dụng để thực hiện các phím ảo. Ví dụ: trên một số thiết bị Android, vùng cảm biến của màn hình cảm ứng mở rộng ra ngoài mép của màn hình và phục vụ mục đích kép như một phần của bàn phím cảm ứng.

Do có rất nhiều thiết bị cảm ứng, Android dựa vào một số lượng lớn thuộc tính cấu hình để mô tả các đặc điểm và hành vi mong muốn của từng thiết bị.

Phân loại thiết bị cảm ứng

Thiết bị đầu vào được phân loại là thiết bị cảm ứng đa điểm nếu đáp ứng cả hai điều kiện sau:

  • Thiết bị đầu vào báo cáo sự hiện diện của các trục tuyệt đối ABS_MT_POSITION_XABS_MT_POSITION_Y .

  • Thiết bị đầu vào không có bất kỳ nút gamepad nào. Điều kiện này giải quyết sự mơ hồ với một số gamepad nhất định báo cáo các trục có mã trùng với mã của các trục MT.

Thiết bị đầu vào được phân loại là thiết bị một chạm nếu đáp ứng cả hai điều kiện sau:

  • Thiết bị đầu vào không được phân loại là thiết bị cảm ứng đa điểm. Thiết bị đầu vào được phân loại là thiết bị cảm ứng đơn hoặc thiết bị cảm ứng đa điểm, không bao giờ là cả hai.

  • Thiết bị đầu vào báo cáo sự hiện diện của các trục tuyệt đối ABS_XABS_Y và sự hiện diện của mã khóa BTN_TOUCH .

Sau khi thiết bị đầu vào đã được phân loại là thiết bị cảm ứng, sự hiện diện của các phím ảo được xác định bằng cách thử tải tệp sơ đồ phím ảo cho thiết bị. Nếu có sẵn bản đồ phím ảo thì tệp bố cục phím cho thiết bị cũng được tải.

Tham khảo phần bên dưới về vị trí và định dạng của các tệp sơ đồ phím ảo.

Tiếp theo, hệ thống tải tệp cấu hình thiết bị đầu vào cho thiết bị cảm ứng.

Tất cả các thiết bị cảm ứng tích hợp phải có tệp cấu hình thiết bị đầu vào. Nếu không có tệp cấu hình thiết bị đầu vào nào, hệ thống sẽ chọn cấu hình mặc định phù hợp với các thiết bị ngoại vi cảm ứng thông thường điển hình như màn hình cảm ứng USB hoặc Bluetooth HID bên ngoài hoặc bàn di chuột. Các giá trị mặc định này không được thiết kế cho màn hình cảm ứng tích hợp và rất có thể sẽ dẫn đến hành vi không chính xác.

Sau khi tải cấu hình thiết bị đầu vào, hệ thống sẽ phân loại thiết bị đầu vào là màn hình cảm ứng , bàn di chuột hoặc thiết bị con trỏ .

  • Một thiết bị màn hình cảm ứng được sử dụng để thao tác trực tiếp với các đối tượng trên màn hình. Vì người dùng đang trực tiếp chạm vào màn hình nên hệ thống không yêu cầu bất kỳ khả năng chi trả bổ sung nào để chỉ ra các đối tượng đang được thao tác.

  • Một thiết bị touch pad được sử dụng để cung cấp thông tin định vị tuyệt đối cho một ứng dụng về các thao tác chạm trên một vùng cảm biến nhất định. Nó có thể hữu ích cho máy tính bảng số hóa.

  • Một thiết bị con trỏ được sử dụng để thao tác gián tiếp các đối tượng trên màn hình bằng con trỏ. Các ngón tay được hiểu là cử chỉ con trỏ đa chạm. Các công cụ khác, chẳng hạn như bút stylus, được giải thích bằng cách sử dụng các vị trí tuyệt đối.

    Xem Các cử chỉ con trỏ đa chạm gián tiếp để biết thêm thông tin.

Các quy tắc sau được sử dụng để phân loại thiết bị đầu vào là màn hình cảm ứng , bàn di chuột hoặc thiết bị con trỏ .

  • Nếu thuộc tính touch.deviceType được đặt thì loại thiết bị sẽ được đặt như được chỉ định.

  • Nếu thiết bị đầu vào báo cáo sự hiện diện của thuộc tính đầu vào INPUT_PROP_DIRECT (thông qua EVIOCGPROP ioctl), thì loại thiết bị sẽ được đặt thành màn hình cảm ứng . Điều kiện này giả định rằng các thiết bị cảm ứng đầu vào trực tiếp được gắn vào màn hình cũng được kết nối.

  • Nếu thiết bị đầu vào báo cáo sự hiện diện của thuộc tính đầu vào INPUT_PROP_POINTER (thông qua EVIOCGPROP ioctl), thì loại thiết bị sẽ được đặt thành con trỏ .

  • Nếu thiết bị đầu vào báo cáo sự hiện diện của các trục tương đối REL_X hoặc REL_Y , thì loại thiết bị sẽ được đặt thành bàn di chuột . Điều kiện này giải quyết sự mơ hồ đối với các thiết bị đầu vào bao gồm cả chuột và bàn di chuột. Trong trường hợp này, bàn di chuột sẽ không được sử dụng để điều khiển con trỏ vì chuột đã điều khiển nó.

  • Nếu không, loại thiết bị sẽ được đặt thành con trỏ . Mặc định này đảm bảo rằng các miếng cảm ứng chưa được chỉ định cho bất kỳ mục đích đặc biệt nào khác sẽ dùng để điều khiển con trỏ.

nút

Các nút là các điều khiển tùy chọn có thể được các ứng dụng sử dụng để thực hiện các chức năng bổ sung. Các nút trên thiết bị cảm ứng hoạt động tương tự như nút chuột và chủ yếu được sử dụng với các thiết bị cảm ứng loại con trỏ hoặc bằng bút stylus.

Các nút sau được hỗ trợ:

  • BTN_LEFT : ánh xạ tới MotionEvent.BUTTON_PRIMARY .

  • BTN_RIGHT : ánh xạ tới MotionEvent.BUTTON_SECONDARY .

  • BTN_MIDDLE : ánh xạ tới MotionEvent.BUTTON_MIDDLE .

  • BTN_BACKBTN_SIDE : ánh xạ tới MotionEvent.BUTTON_BACK . Việc nhấn nút này cũng tổng hợp một lần nhấn phím với mã khóa KeyEvent.KEYCODE_BACK .

  • BTN_FORWARDBTN_EXTRA : ánh xạ tới MotionEvent.BUTTON_FORWARD . Việc nhấn nút này cũng tổng hợp một lần nhấn phím với mã khóa KeyEvent.KEYCODE_FORWARD .

  • BTN_STYLUS : ánh xạ tới MotionEvent.BUTTON_SECONDARY .

  • BTN_STYLUS2 : ánh xạ tới MotionEvent.BUTTON_TERTIARY .

Công cụ và các loại công cụ

Công cụ là ngón tay, bút stylus hoặc thiết bị khác được sử dụng để tương tác với thiết bị cảm ứng. Một số thiết bị cảm ứng có thể phân biệt giữa các loại công cụ khác nhau.

Ở những nơi khác trong Android, như trong API MotionEvent , một công cụ thường được gọi là con trỏ .

Các loại công cụ sau đây được hỗ trợ:

  • BTN_TOOL_FINGERMT_TOOL_FINGER : được ánh xạ tới MotionEvent.TOOL_TYPE_FINGER .

  • BTN_TOOL_PENMT_TOOL_PEN : được ánh xạ tới MotionEvent.TOOL_TYPE_STYLUS .

  • BTN_TOOL_RUBBER : được ánh xạ tới MotionEvent.TOOL_TYPE_ERASER .

  • BTN_TOOL_BRUSH : được ánh xạ tới MotionEvent.TOOL_TYPE_STYLUS .

  • BTN_TOOL_PENCIL : được ánh xạ tới MotionEvent.TOOL_TYPE_STYLUS .

  • BTN_TOOL_AIRBRUSH : được ánh xạ tới MotionEvent.TOOL_TYPE_STYLUS .

  • BTN_TOOL_MOUSE : được ánh xạ tới MotionEvent.TOOL_TYPE_MOUSE .

  • BTN_TOOL_LENS : được ánh xạ tới MotionEvent.TOOL_TYPE_MOUSE .

  • BTN_TOOL_DOUBLETAP , BTN_TOOL_TRIPLETAPBTN_TOOL_QUADTAP : được ánh xạ tới MotionEvent.TOOL_TYPE_FINGER .

Công cụ di chuột so với chạm

Các công cụ có thể tiếp xúc với thiết bị cảm ứng hoặc nằm trong phạm vi và lơ lửng bên trên thiết bị. Không phải tất cả các thiết bị cảm ứng đều có thể cảm nhận được sự hiện diện của một công cụ lơ lửng phía trên thiết bị cảm ứng. Những công cụ đó, chẳng hạn như bộ số hóa bút cảm ứng dựa trên RF, thường có thể phát hiện khi công cụ nằm trong phạm vi giới hạn của bộ số hóa.

Thành phần InputReader cẩn thận để phân biệt các công cụ cảm ứng với các công cụ di chuột. Tương tự như vậy, các công cụ chạm và công cụ di chuột được báo cáo cho các ứng dụng theo những cách khác nhau.

Các công cụ chạm được báo cáo cho ứng dụng dưới dạng sự kiện chạm bằng cách sử dụng MotionEvent.ACTION_DOWN , MotionEvent.ACTION_MOVE , MotionEvent.ACTION_DOWN , MotionEvent.ACTION_POINTER_DOWNMotionEvent.ACTION_POINTER_UP .

Các công cụ di chuột được báo cáo cho các ứng dụng dưới dạng các sự kiện chuyển động chung bằng cách sử dụng MotionEvent.ACTION_HOVER_ENTER , MotionEvent.ACTION_HOVER_MOVEMotionEvent.ACTION_HOVER_EXIT .

Yêu cầu trình điều khiển thiết bị cảm ứng

  1. Trình điều khiển thiết bị cảm ứng chỉ nên đăng ký các trục và mã phím cho các trục và nút mà chúng thực sự hỗ trợ. Việc đăng ký các trục hoặc mã khóa thừa có thể gây nhầm lẫn cho thuật toán phân loại thiết bị hoặc khiến hệ thống phát hiện sai khả năng của thiết bị.

    Ví dụ: nếu thiết bị báo mã phím BTN_TOUCH , hệ thống sẽ cho rằng BTN_TOUCH sẽ luôn được sử dụng để cho biết liệu công cụ có thực sự chạm vào màn hình hay không. Do đó, BTN_TOUCH không nên được sử dụng để chỉ ra rằng công cụ chỉ nằm trong phạm vi và lơ lửng.

  2. Các thiết bị một chạm sử dụng các sự kiện đầu vào Linux sau:

    • ABS_X : (BẮT BUỘC) Báo cáo tọa độ X của dao.

    • ABS_Y : (BẮT BUỘC) Báo cáo tọa độ Y của dao.

    • ABS_PRESSURE : (tùy chọn) Báo cáo áp suất vật lý tác dụng lên đầu dụng cụ hoặc cường độ tín hiệu của tiếp điểm cảm ứng.

    • ABS_TOOL_WIDTH : (tùy chọn) Báo cáo diện tích mặt cắt ngang hoặc chiều rộng của tiếp điểm cảm ứng hoặc của chính công cụ.

    • ABS_DISTANCE : (tùy chọn) Báo cáo khoảng cách của dụng cụ so với bề mặt của thiết bị cảm ứng.

    • ABS_TILT_X : (tùy chọn) Báo cáo độ nghiêng của dụng cụ so với bề mặt của thiết bị cảm ứng dọc theo trục X.

    • ABS_TILT_Y : (tùy chọn) Báo cáo độ nghiêng của dụng cụ so với bề mặt của thiết bị cảm ứng dọc theo trục Y.

    • BTN_TOUCH : (BẮT BUỘC) Cho biết liệu công cụ có chạm vào thiết bị hay không.

    • BTN_LEFT , BTN_RIGHT , BTN_MIDDLE , BTN_BACK , BTN_SIDE , BTN_FORWARD , BTN_EXTRA , BTN_STYLUS , BTN_STYLUS2 : (tùy chọn) Trạng thái nút báo cáo.

    • 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 : (tùy chọn) .

  3. Các thiết bị cảm ứng đa điểm sử dụng các sự kiện đầu vào Linux sau:

    • ABS_MT_POSITION_X : (BẮT BUỘC) Báo cáo tọa độ X của dụng cụ.

    • ABS_MT_POSITION_Y : (BẮT BUỘC) Báo cáo tọa độ Y của dụng cụ.

    • ABS_MT_PRESSURE : (tùy chọn) Báo cáo áp suất vật lý tác dụng lên đầu dụng cụ hoặc cường độ tín hiệu của tiếp điểm cảm ứng.

    • ABS_MT_TOUCH_MAJOR : (tùy chọn) Báo cáo diện tích mặt cắt ngang của tiếp điểm cảm ứng hoặc chiều dài của chiều dài hơn của tiếp điểm cảm ứng.

    • ABS_MT_TOUCH_MINOR : (tùy chọn) Báo cáo độ dài của kích thước ngắn hơn của tiếp điểm cảm ứng. Không nên sử dụng trục này nếu ABS_MT_TOUCH_MAJOR đang báo cáo phép đo diện tích.

    • ABS_MT_WIDTH_MAJOR : (tùy chọn) Báo cáo diện tích mặt cắt ngang của chính công cụ hoặc chiều dài của kích thước dài hơn của chính công cụ đó. Không nên sử dụng trục này nếu không biết kích thước của chính công cụ.

    • ABS_MT_WIDTH_MINOR : (tùy chọn) Báo cáo độ dài của kích thước ngắn hơn của chính công cụ. Không nên sử dụng trục này nếu ABS_MT_WIDTH_MAJOR đang báo cáo phép đo diện tích hoặc nếu không xác định được kích thước của bản thân công cụ.

    • ABS_MT_ORIENTATION : (tùy chọn) Báo cáo hướng của dụng cụ.

    • ABS_MT_DISTANCE : (tùy chọn) Báo cáo khoảng cách của dụng cụ với bề mặt của thiết bị cảm ứng.

    • ABS_MT_TOOL_TYPE : (tùy chọn) Báo cáo loại công cụMT_TOOL_FINGER hoặc MT_TOOL_PEN .

    • ABS_MT_TRACKING_ID : (tùy chọn) Báo cáo id theo dõi của công cụ. Id theo dõi là một số nguyên không âm tùy ý được sử dụng để xác định và theo dõi từng công cụ một cách độc lập khi nhiều công cụ đang hoạt động. Ví dụ: khi nhiều ngón tay cùng chạm vào thiết bị, mỗi ngón tay phải được gán một id theo dõi riêng biệt được sử dụng miễn là ngón tay đó vẫn tiếp xúc. ID theo dõi có thể được sử dụng lại khi các công cụ được liên kết của chúng vượt ra ngoài phạm vi.

    • ABS_MT_SLOT : (tùy chọn) Báo cáo id vị trí của công cụ, khi sử dụng giao thức cảm ứng đa điểm 'B' của Linux. Tham khảo tài liệu về giao thức cảm ứng đa điểm của Linux để biết thêm chi tiết.

    • BTN_TOUCH : (BẮT BUỘC) Cho biết liệu công cụ có chạm vào thiết bị hay không.

    • BTN_LEFT , BTN_RIGHT , BTN_MIDDLE , BTN_BACK , BTN_SIDE , BTN_FORWARD , BTN_EXTRA , BTN_STYLUS , BTN_STYLUS2 : (tùy chọn) Trạng thái nút báo cáo.

    • 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 : (tùy chọn) .

  4. Nếu các trục cho cả giao thức một chạm và đa chạm được xác định, thì chỉ các trục cảm ứng đa điểm sẽ được sử dụng và các trục một chạm sẽ bị bỏ qua.

  5. Các giá trị tối thiểu và tối đa của các ABS_X , ABS_Y , ABS_MT_POSITION_XABS_MT_POSITION_Y xác định giới hạn của vùng hoạt động của thiết bị trong các đơn vị bề mặt dành riêng cho thiết bị. Trong trường hợp màn hình cảm ứng, vùng hoạt động mô tả phần của thiết bị cảm ứng thực sự bao phủ màn hình.

    Đối với màn hình cảm ứng, hệ thống sẽ tự động nội suy các vị trí cảm ứng được báo cáo trong các đơn vị bề mặt để có được các vị trí cảm ứng trong pixel hiển thị theo phép tính sau:

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

    Màn hình cảm ứng có thể báo cáo các lần chạm bên ngoài vùng hoạt động được báo cáo.

    Các thao tác chạm được thực hiện bên ngoài vùng hoạt động sẽ không được gửi tới các ứng dụng nhưng có thể được sử dụng cho các phím ảo.

    Các thao tác chạm được bắt đầu bên trong khu vực hoạt động hoặc vào và ra khỏi khu vực hiển thị sẽ được gửi đến các ứng dụng. Do đó, nếu thao tác chạm bắt đầu trong giới hạn của ứng dụng và sau đó di chuyển ra ngoài vùng hoạt động, ứng dụng có thể nhận các sự kiện chạm có tọa độ hiển thị âm hoặc vượt ra ngoài giới hạn của màn hình. Đây là hành vi dự kiến.

    Thiết bị cảm ứng không bao giờ được kẹp tọa độ cảm ứng vào giới hạn của vùng hoạt động. Nếu một lần chạm thoát khỏi khu vực hoạt động, nó sẽ được báo cáo là nằm ngoài khu vực hoạt động hoặc hoàn toàn không được báo cáo.

    Ví dụ: nếu ngón tay của người dùng đang chạm vào gần góc trên cùng bên trái của màn hình cảm ứng, nó có thể báo cáo tọa độ là (minX, minY). Nếu ngón tay tiếp tục di chuyển ra ngoài vùng hoạt động, thì màn hình cảm ứng sẽ bắt đầu báo cáo tọa độ với các thành phần nhỏ hơn minX và minY, chẳng hạn như (minX - 2, minY - 3) hoặc màn hình sẽ ngừng báo cáo cảm ứng hoàn toàn. Nói cách khác, màn hình cảm ứng không được báo cáo (minX, minY) khi ngón tay của người dùng thực sự chạm bên ngoài vùng hoạt động.

    Kẹp tọa độ cảm ứng vào cạnh màn hình sẽ tạo ra một ranh giới cứng nhân tạo xung quanh cạnh của màn hình, ngăn hệ thống theo dõi trơn tru các chuyển động đi vào hoặc ra khỏi ranh giới của khu vực hiển thị.

  6. Các giá trị được báo cáo bởi ABS_PRESSURE hoặc ABS_MT_PRESSURE , nếu chúng được báo cáo, phải khác không khi công cụ đang chạm vào thiết bị và bằng 0 nếu không thì để cho biết rằng công cụ đang di chuyển.

    Báo cáo thông tin áp suất là tùy chọn nhưng được khuyến nghị mạnh mẽ. Các ứng dụng có thể sử dụng thông tin áp suất để thực hiện bản vẽ nhạy cảm với áp suất và các hiệu ứng khác.

  7. Các giá trị được báo cáo bởi ABS_TOOL_WIDTH , ABS_MT_TOUCH_MAJOR , ABS_MT_TOUCH_MINOR , ABS_MT_WIDTH_MAJOR hoặc ABS_MT_WIDTH_MINOR phải khác 0 khi dụng cụ chạm vào thiết bị và bằng 0 nếu không, nhưng điều này là không bắt buộc. Ví dụ: thiết bị cảm ứng có thể đo kích thước của các điểm tiếp xúc bằng ngón tay nhưng không đo được kích thước của các điểm tiếp xúc bằng bút stylus.

    Báo cáo thông tin về kích thước là tùy chọn nhưng được khuyến khích mạnh mẽ. Các ứng dụng có thể sử dụng thông tin áp suất để thực hiện bản vẽ nhạy cảm với kích thước và các hiệu ứng khác.

  8. Các giá trị được báo cáo bởi ABS_DISTANCE hoặc ABS_MT_DISTANCE sẽ tiến về 0 khi dụng cụ chạm vào thiết bị. Khoảng cách có thể khác không ngay cả khi dụng cụ tiếp xúc trực tiếp. Các giá trị chính xác được báo cáo phụ thuộc vào cách phần cứng đo khoảng cách.

    Báo cáo thông tin khoảng cách là tùy chọn nhưng được khuyến nghị cho các thiết bị bút stylus.

  9. Các giá trị được báo cáo bởi ABS_TILT_XABS_TILT_Y phải bằng 0 khi dụng cụ vuông góc với thiết bị. Độ nghiêng khác không được coi là dấu hiệu cho thấy dụng cụ được giữ ở độ nghiêng.

    Các góc nghiêng dọc theo trục X và Y được giả định là được chỉ định theo độ vuông góc. Điểm trung tâm (hoàn toàn vuông góc) được cho bởi (max + min) / 2 cho mỗi trục. Các giá trị nhỏ hơn điểm trung tâm biểu thị độ nghiêng lên hoặc sang trái, các giá trị lớn hơn điểm trung tâm biểu thị độ nghiêng xuống hoặc sang phải.

    InputReader chuyển đổi các thành phần nghiêng X và Y thành góc nghiêng vuông góc từ 0 đến PI / 2 radian và góc định hướng phẳng từ -PI đến PI radian. Biểu diễn này dẫn đến một mô tả về hướng tương thích với những gì được sử dụng để mô tả các lần chạm ngón tay.

    Báo cáo thông tin độ nghiêng là tùy chọn nhưng được khuyến nghị cho các thiết bị bút stylus.

  10. Nếu loại công cụ được báo cáo bởi ABS_MT_TOOL_TYPE , nó sẽ thay thế bất kỳ thông tin loại công cụ nào được báo cáo bởi BTN_TOOL_* . Nếu hoàn toàn không có thông tin về loại công cụ, loại công cụ sẽ mặc định là MotionEvent.TOOL_TYPE_FINGER .

  11. Một công cụ được xác định là đang hoạt động dựa trên các điều kiện sau:

    • Khi sử dụng giao thức một chạm, công cụ sẽ hoạt động nếu BTN_TOUCH hoặc BTN_TOOL_* là 1.

      Điều kiện này ngụ ý rằng InputReader cần có ít nhất một số thông tin về bản chất của công cụ, cho dù nó đang chạm vào hay ít nhất là loại công cụ của nó. Nếu không có thông tin, thì công cụ được coi là không hoạt động (ngoài phạm vi).

    • Khi sử dụng giao thức cảm ứng đa điểm 'A', công cụ sẽ hoạt động bất cứ khi nào nó xuất hiện trong báo cáo đồng bộ hóa gần đây nhất. Khi công cụ ngừng xuất hiện trong các báo cáo đồng bộ hóa, nó sẽ không còn tồn tại.

    • Khi sử dụng giao thức cảm ứng đa điểm 'B', công cụ sẽ hoạt động miễn là nó có một khe hoạt động. Khi nó xóa khe, công cụ sẽ không còn tồn tại.

  12. Một công cụ được xác định là lơ lửng dựa trên các điều kiện sau:

    • Nếu công cụ là BTN_TOOL_MOUSE hoặc BTN_TOOL_LENS , thì công cụ này không di chuột, ngay cả khi một trong các điều kiện sau là đúng.

    • Nếu công cụ đang hoạt động và trình điều khiển báo cáo thông tin áp suất và áp suất được báo cáo bằng 0, thì công cụ đang lơ lửng.

    • Nếu công cụ đang hoạt động và trình điều khiển hỗ trợ mã khóa BTN_TOUCHBTN_TOUCH có giá trị bằng 0, thì công cụ đang lơ lửng.

  13. InputReader hỗ trợ cả giao thức cảm ứng đa điểm 'A' và 'B'. Trình điều khiển mới nên sử dụng giao thức 'B' nhưng sẽ hoạt động.

  14. Kể từ Android Ice Cream Sandwich 4.0, trình điều khiển màn hình cảm ứng có thể cần được thay đổi để tuân thủ đặc tả giao thức đầu vào của Linux.

    Những thay đổi sau đây có thể được yêu cầu:

    • Khi một công cụ trở nên không hoạt động (ngón tay "lên"), công cụ đó sẽ ngừng xuất hiện trong các báo cáo đồng bộ hóa cảm ứng đa điểm tiếp theo. Khi tất cả các công cụ không hoạt động (tất cả các ngón tay đều "lên"), trình điều khiển sẽ gửi một gói báo cáo đồng bộ trống, chẳng hạn như SYN_MT_REPORT theo sau là SYN_REPORT .

      Các phiên bản trước của Android dự kiến ​​các sự kiện "lên" sẽ được báo cáo bằng cách gửi giá trị áp suất bằng 0. Hành vi cũ không tương thích với đặc tả giao thức đầu vào của Linux và không còn được hỗ trợ.

    • Thông tin về áp suất vật lý hoặc cường độ tín hiệu phải được báo cáo bằng cách sử dụng ABS_MT_PRESSURE .

      Các phiên bản trước của Android đã truy xuất thông tin áp suất từ ABS_MT_TOUCH_MAJOR . Hành vi cũ không tương thích với đặc tả giao thức đầu vào của Linux và không còn được hỗ trợ.

    • Thông tin kích thước cảm ứng phải được báo cáo bằng ABS_MT_TOUCH_MAJOR .

      Các phiên bản trước của Android đã truy xuất thông tin kích thước từ ABS_MT_TOOL_MAJOR . Hành vi cũ không tương thích với đặc tả giao thức đầu vào của Linux và không còn được hỗ trợ.

    Trình điều khiển thiết bị cảm ứng không còn cần các tùy chỉnh dành riêng cho Android. Bằng cách dựa vào giao thức đầu vào tiêu chuẩn của Linux, Android có thể hỗ trợ nhiều loại thiết bị ngoại vi cảm ứng hơn, chẳng hạn như màn hình cảm ứng đa chạm HID bên ngoài, sử dụng trình điều khiển chưa sửa đổi.

Hoạt động của thiết bị cảm ứng

Sau đây là tóm tắt ngắn gọn thao tác trên thiết bị cảm ứng trên Android.

  1. EventHub đọc các sự kiện thô từ trình điều khiển evdev .

  2. InputReader sử dụng các sự kiện thô và cập nhật trạng thái bên trong về vị trí và các đặc điểm khác của từng công cụ. Nó cũng theo dõi các trạng thái của nút.

  3. Nếu các nút BACK hoặc FORWARD được nhấn hoặc nhả, InputReader thông báo cho InputDispatcher về sự kiện quan trọng.

  4. InputReader xác định xem có xảy ra nhấn phím ảo hay không. Nếu vậy, nó sẽ thông báo cho InputDispatcher về sự kiện quan trọng.

  5. InputReader xác định xem thao tác chạm có được bắt đầu trong giới hạn của màn hình hay không. Nếu vậy, nó sẽ thông báo cho InputDispatcher về sự kiện chạm.

  6. Nếu không có công cụ chạm nhưng có ít nhất một công cụ di chuột, thì InputReader thông báo cho InputDispatcher về sự kiện di chuột.

  7. Nếu loại thiết bị cảm ứng là con trỏ , thì InputReader thực hiện phát hiện cử chỉ của con trỏ, di chuyển con trỏ và các điểm tương ứng, đồng thời thông báo cho InputDispatcher về sự kiện con trỏ.

  8. InputDispatcher sử dụng WindowManagerPolicy để xác định xem các sự kiện có nên được gửi đi hay không và liệu chúng có nên đánh thức thiết bị hay không. Sau đó, InputDispatcher cung cấp các sự kiện cho các ứng dụng thích hợp.

Cấu hình thiết bị cảm ứng

Hoạt động của thiết bị cảm ứng được xác định bởi các trục, nút, thuộc tính đầu vào, cấu hình thiết bị đầu vào, sơ đồ phím ảo và bố cục phím của thiết bị.

Tham khảo các phần sau để biết thêm chi tiết về các tệp tham gia cấu hình bàn phím:

Đặc tính

Hệ thống dựa trên nhiều thuộc tính cấu hình thiết bị đầu vào để định cấu hình và hiệu chỉnh hoạt động của thiết bị cảm ứng.

Một lý do cho điều này là trình điều khiển thiết bị cho thiết bị cảm ứng thường báo cáo các đặc điểm của lần chạm bằng cách sử dụng các đơn vị dành riêng cho thiết bị.

Ví dụ: nhiều thiết bị cảm ứng đo diện tích tiếp xúc của cảm ứng bằng thang đo nội bộ dành riêng cho thiết bị, chẳng hạn như tổng số nút cảm biến được kích hoạt khi chạm. Giá trị kích thước thô này sẽ không có ý nghĩa đối với các ứng dụng vì chúng sẽ cần biết về kích thước vật lý và các đặc điểm khác của các nút cảm biến thiết bị cảm ứng.

Hệ thống sử dụng các thông số hiệu chuẩn được mã hóa trong các tệp cấu hình thiết bị đầu vào để giải mã, biến đổi và chuẩn hóa các giá trị do thiết bị cảm ứng báo cáo thành một biểu diễn tiêu chuẩn đơn giản hơn mà các ứng dụng có thể hiểu được.

Công ước tài liệu

Đối với mục đích tài liệu, chúng tôi sẽ sử dụng các quy ước sau để mô tả các giá trị được hệ thống sử dụng trong quá trình hiệu chuẩn.

Giá trị trục thô

Các biểu thức sau biểu thị các giá trị thô do trình điều khiển thiết bị cảm ứng báo cáo dưới dạng sự kiện EV_ABS .

raw.x
Giá trị của trục ABS_X hoặc ABS_MT_POSITION_X .
raw.y
Giá trị của trục ABS_Y hoặc ABS_MT_POSITION_Y .
raw.pressure
Giá trị của trục ABS_PRESSURE hoặc ABS_MT_PRESSURE hoặc 0 nếu không có sẵn.
raw.touchMajor
Giá trị của trục ABS_MT_TOUCH_MAJOR hoặc 0 nếu không có.
raw.touchMinor
Giá trị của trục ABS_MT_TOUCH_MINOR hoặc raw.touchMajor nếu không có.
raw.toolMajor
Giá trị của trục ABS_TOOL_WIDTH hoặc ABS_MT_WIDTH_MAJOR hoặc 0 nếu không có sẵn.
raw.toolMinor
Giá trị của trục ABS_MT_WIDTH_MINOR hoặc raw.toolMajor nếu không có sẵn.
raw.orientation
Giá trị của trục ABS_MT_ORIENTATION hoặc 0 nếu không có.
raw.distance
Giá trị của trục ABS_DISTANCE hoặc ABS_MT_DISTANCE hoặc 0 nếu không có sẵn.
raw.tiltX
Giá trị của trục ABS_TILT_X hoặc 0 nếu không có.
raw.tiltY
Giá trị của trục ABS_TILT_Y hoặc 0 nếu không có.

Phạm vi trục thô

Các biểu thức sau biểu thị giới hạn của các giá trị thô. Chúng có được bằng cách gọi EVIOCGABS ioctl cho mỗi trục.

raw.*.min
Giá trị tối thiểu bao gồm của trục thô.
raw.*.max
Giá trị tối đa bao gồm của trục thô.
raw.*.range
Tương đương với raw.*.max - raw.*.min .
raw.*.fuzz
Độ chính xác của trục thô. ví dụ. fuzz = 1 ngụ ý các giá trị chính xác đến +/- 1 đơn vị.
raw.width
Chiều rộng bao gồm của vùng cảm ứng, tương đương với raw.x.range + 1 .
raw.height
Chiều cao bao gồm của vùng cảm ứng, tương đương với raw.y.range + 1 .

Phạm vi đầu ra

Các biểu thức sau biểu thị các đặc tính của hệ tọa độ đầu ra. Hệ thống sử dụng phép nội suy tuyến tính để dịch thông tin vị trí cảm ứng từ các đơn vị bề mặt được sử dụng bởi thiết bị cảm ứng thành các đơn vị đầu ra sẽ được báo cáo cho các ứng dụng như pixel hiển thị.

output.width
Chiều rộng đầu ra. Đối với màn hình cảm ứng (kết hợp với màn hình), đây là chiều rộng màn hình tính bằng pixel. Đối với bàn di chuột (không được kết hợp với màn hình), chiều rộng đầu ra bằng raw.width , cho biết rằng sẽ không có phép nội suy nào được thực hiện.
output.height
Chiều cao đầu ra. Đối với màn hình cảm ứng (kết hợp với màn hình), đây là chiều cao màn hình tính bằng pixel. Đối với bàn di chuột (không được kết hợp với màn hình), chiều cao đầu ra bằng raw.height , cho biết rằng sẽ không có phép nội suy nào được thực hiện.
output.diag
Độ dài đường chéo của hệ tọa độ đầu ra, tương đương với sqrt(output.width ^2 + output.height ^2) .

Cấu hình cơ bản

Trình ánh xạ đầu vào cảm ứng sử dụng nhiều thuộc tính cấu hình trong tệp cấu hình thiết bị đầu vào để chỉ định các giá trị hiệu chỉnh. Bảng sau đây mô tả một số thuộc tính cấu hình mục đích chung. Tất cả các thuộc tính khác được mô tả trong các phần sau cùng với các trường chúng được sử dụng để hiệu chỉnh.

touch.deviceType

Định nghĩa: touch.deviceType = touchScreen | touchPad | pointer | default

Chỉ định loại thiết bị cảm ứng.

  • Nếu giá trị là touchScreen , thiết bị cảm ứng là màn hình cảm ứng được liên kết với màn hình.

  • Nếu giá trị là touchPad , thì thiết bị cảm ứng là bàn di chuột không được liên kết với màn hình.

  • Nếu giá trị là pointer , thì thiết bị cảm ứng là bàn di chuột không được liên kết với màn hình và chuyển động của nó được sử dụng cho cử chỉ con trỏ đa chạm gián tiếp .

  • Nếu giá trị là default , hệ thống sẽ tự động phát hiện loại thiết bị theo thuật toán phân loại.

Tham khảo phần Phân loại để biết thêm chi tiết về cách loại thiết bị ảnh hưởng đến hoạt động của thiết bị cảm ứng.

Trước Honeycomb, tất cả các thiết bị cảm ứng đều được coi là màn hình cảm ứng.

touch.orientationAware

Định nghĩa: touch.orientationAware = 0 | 1

Chỉ định liệu thiết bị cảm ứng có phản ứng với các thay đổi về hướng hiển thị hay không.

  • Nếu giá trị là 1 , các vị trí cảm ứng do thiết bị cảm ứng báo cáo sẽ được xoay bất cứ khi nào hướng màn hình thay đổi.

  • Nếu giá trị là 0 , các vị trí cảm ứng do thiết bị cảm ứng báo cáo sẽ không bị thay đổi hướng hiển thị.

Giá trị mặc định là 1 nếu thiết bị là màn hình cảm ứng, 0 nếu không.

Hệ thống phân biệt giữa màn hình và màn hình cảm ứng bên trong và bên ngoài. Màn hình cảm ứng bên trong nhận biết hướng được xoay dựa trên hướng của màn hình bên trong. Màn hình cảm ứng bên ngoài nhận biết hướng được xoay dựa trên hướng của màn hình bên ngoài.

Nhận biết hướng được sử dụng để hỗ trợ xoay màn hình cảm ứng trên các thiết bị như Nexus One. Ví dụ: khi xoay thiết bị 90 độ theo chiều kim đồng hồ so với hướng tự nhiên của thiết bị, vị trí tuyệt đối của các lần chạm được ánh xạ lại sao cho một lần chạm ở góc trên cùng bên trái của hệ tọa độ tuyệt đối của màn hình cảm ứng được báo cáo là một lần chạm ở góc trên cùng bên trái góc của hệ tọa độ xoay của màn hình. Điều này được thực hiện sao cho các lần chạm được báo cáo bằng cùng một hệ tọa độ mà các ứng dụng sử dụng để vẽ các yếu tố hình ảnh của chúng.

Trước Honeycomb, tất cả các thiết bị cảm ứng được cho là có khả năng nhận biết định hướng.

touch.gestureMode

Định nghĩa: touch.gestureMode = pointer | spots | default

Chỉ định chế độ trình bày cho cử chỉ con trỏ. Thuộc tính cấu hình này chỉ phù hợp khi thiết bị cảm ứng thuộc loại con trỏ .

  • Nếu giá trị là pointer , các cử chỉ trên bàn di chuột được thể hiện bằng con trỏ tương tự như con trỏ chuột.

  • Nếu giá trị là spots , các cử chỉ trên bàn di chuột được thể hiện bằng một mỏ neo đại diện cho tâm của cử chỉ và một tập hợp các điểm tròn thể hiện vị trí của từng ngón tay.

Giá trị mặc định là pointer khi thuộc tính đầu vào INPUT_PROP_SEMI_MT được đặt hoặc spots khác.

Trường XY

Các trường X và Y cung cấp thông tin vị trí cho tâm của vùng tiếp xúc.

Phép tính

Việc tính toán rất đơn giản: thông tin vị trí từ trình điều khiển cảm ứng được nội suy tuyến tính với hệ tọa độ đầu ra.

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 , Trường Size

Các TouchMajorTouchMinor mô tả kích thước gần đúng của vùng tiếp xúc theo đơn vị đầu ra (pixel).

Các ToolMajorToolMinor mô tả kích thước gần đúng của chính công cụ đó theo đơn vị đầu ra (pixel).

Trường Size mô tả kích thước chuẩn hóa của lần chạm so với lần chạm lớn nhất có thể mà thiết bị cảm ứng có thể cảm nhận được. Kích thước chuẩn hóa nhỏ nhất có thể là 0,0 (không tiếp xúc hoặc không thể đo lường được) và kích thước chuẩn hóa lớn nhất có thể là 1,0 (vùng cảm biến bão hòa).

Khi có thể đo được cả chiều dài và chiều rộng gần đúng, thì trường TouchMajor chỉ định kích thước dài hơn và trường TouchMinor chỉ định kích thước ngắn hơn của vùng tiếp xúc. Khi chỉ có thể đo đường kính gần đúng của vùng tiếp xúc, thì trường TouchMajorTouchMinor sẽ bằng nhau.

Tương tự như vậy, trường ToolMajor chỉ định kích thước dài hơn và trường ToolMinor chỉ định kích thước ngắn hơn của khu vực mặt cắt ngang của công cụ.

Nếu không có kích thước cảm ứng nhưng có sẵn kích thước công cụ, thì kích thước công cụ sẽ được đặt bằng với kích thước cảm ứng. Ngược lại, nếu kích thước công cụ không khả dụng nhưng kích thước cảm ứng khả dụng, thì kích thước cảm ứng sẽ được đặt bằng với kích thước dao.

Thiết bị cảm ứng đo hoặc báo cáo kích thước cảm ứng và kích thước công cụ theo nhiều cách khác nhau. Việc triển khai hiện tại hỗ trợ ba loại phép đo khác nhau: đường kính, diện tích và hộp giới hạn hình học trong các đơn vị bề mặt.

touch.size.calibration

Định nghĩa: touch.size.calibration = none | geometric | diameter | area | default

Chỉ định loại phép đo được sử dụng bởi trình điều khiển cảm ứng để báo cáo kích thước cảm ứng và kích thước công cụ.

  • Nếu giá trị là none , kích thước được đặt thành không.

  • Nếu giá trị là geometric , thì kích thước được giả định là được chỉ định trong cùng đơn vị bề mặt với vị trí, do đó, nó được chia tỷ lệ theo cách tương tự.

  • Nếu giá trị là diameter , kích thước được coi là tỷ lệ thuận với đường kính (chiều rộng) của cảm ứng hoặc dụng cụ.

  • Nếu giá trị là area , thì kích thước được coi là tỷ lệ thuận với diện tích của cảm ứng hoặc công cụ.

  • Nếu giá trị là default , thì hệ thống sẽ sử dụng hiệu chỉnh geometric nếu trục raw.touchMajor hoặc raw.toolMajor khả dụng, nếu không, hệ thống sẽ sử dụng none hiệu chuẩn nào.

touch.size.scale

Định nghĩa: touch.size.scale = <số dấu phẩy động không âm>

Chỉ định hệ số tỷ lệ không đổi được sử dụng trong hiệu chuẩn.

Giá trị mặc định là 1.0 .

touch.size.bias

Định nghĩa: touch.size.bias = <số dấu phẩy động không âm>

Chỉ định một giá trị sai lệch không đổi được sử dụng trong hiệu chuẩn.

Giá trị mặc định là 0.0 .

touch.size.isSummed

Định nghĩa: touch.size.isSummed = 0 | 1

Chỉ định xem kích thước được báo cáo là tổng kích thước của tất cả các liên hệ đang hoạt động hay được báo cáo riêng lẻ cho từng liên hệ.

  • Nếu giá trị là 1 , kích thước được báo cáo sẽ được chia cho số lượng liên hệ trước khi sử dụng.

  • Nếu giá trị là 0 , thì kích thước được báo cáo sẽ được sử dụng nguyên trạng.

Giá trị mặc định là 0 .

Một số thiết bị cảm ứng, đặc biệt là thiết bị "Semi-MT" không thể phân biệt các kích thước riêng lẻ của nhiều liên hệ để chúng báo cáo phép đo kích thước đại diện cho tổng diện tích hoặc chiều rộng của chúng. Chỉ nên đặt thuộc tính này thành 1 cho các thiết bị như vậy. Nếu nghi ngờ, hãy đặt giá trị này thành 0 .

Phép tính

Việc tính toán các trường TouchMajor , TouchMinor , ToolMajor , ToolMinorSize phụ thuộc vào các tham số hiệu chuẩn đã chỉ định.

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

Trường Pressure

Trường Pressure mô tả áp suất vật lý gần đúng được áp dụng cho thiết bị cảm ứng dưới dạng giá trị chuẩn hóa trong khoảng từ 0,0 (không chạm) đến 1,0 (toàn lực).

Áp suất bằng 0 cho biết dụng cụ đang lơ lửng.

touch.pressure.calibration

Định nghĩa: touch.pressure.calibration = none | physical | amplitude | default

Chỉ định loại phép đo được trình điều khiển cảm ứng sử dụng để báo cáo áp suất.

  • Nếu giá trị là none , áp suất không xác định nên được đặt thành 1.0 khi chạm và 0.0 khi di chuột.

  • Nếu giá trị là physical , thì trục áp suất được giả định để đo cường độ vật lý thực tế của áp suất tác dụng lên bàn di chuột.

  • 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