Thiết bị cảm ứng

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ố hoá dựa trên bút cảm ứng.

Màn hình cảm ứng là thiết bị cảm ứng được liên kết với màn hình sao cho người dùng có cảm giác như đang trực tiếp thao tác 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 liên kết với màn hình, chẳng hạn như máy tính bảng số hoá. Bàn di chuột thường được dùng để trỏ hoặc để định vị gián tiếp tuyệt đối hoặc điều khiển giao diện người dùng dựa trên cử chỉ.

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.

Đôi khi, bạn có thể thao tác trên thiết bị cảm ứng bằng nhiều công cụ khác nhau, chẳng hạn như ngón tay hoặc bút cảm ứng, tuỳ thuộc vào công nghệ cảm biến cảm ứng cơ bản.

Thiết bị cảm ứng đôi khi được dùng để triển khai các phím ảo. Ví dụ: trên một số thiết bị Android, vùng cảm biến màn hình cảm ứng mở rộng ra ngoài cạnh màn hình và đóng vai trò kép như một phần của bàn phím cảm ứng.

Do có nhiều loại thiết bị cảm ứng, Android dựa vào một số lượng lớn các 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ị đa chạ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_X và ABS_MT_POSITION_Y.
  • Thiết bị đầu vào không có nút tay điều khiển trò chơi nào. Điều kiện này giải quyết sự không rõ ràng với một số tay điều khiển trò chơi báo cáo các trục có mã trùng lặp 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 lần 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ị một chạm hoặc thiết bị đa chạ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_X và ABS_Y, cũng như sự hiện diện của mã phím BTN_TOUCH.

Khi một 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 cố gắng tải tệp bản đồ phím ảo cho thiết bị. Nếu có bản đồ phím ảo, thì tệp bố cục phím cho thiết bị cũng sẽ được tải. Tham khảo [Tệp ánh xạ phím ảo](#virtual-key-map-files) để biết thông tin về vị trí và định dạng của các tệp này.

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

Tất cả thiết bị cảm ứng tích hợp đều 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, hệ thống sẽ chọn một cấu hình mặc định phù hợp với các thiết bị ngoại vi cảm ứng đa năng, chẳng hạn như màn hình cảm ứng HID hoặc bàn di chuột USB hoặc Bluetooth bên ngoài. 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à có thể 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ỏ.

  • Thiết bị có màn hình cảm ứng được dùng để thao tác trực tiếp với các đối tượng trên màn hình. Người dùng chạm trực tiếp vào màn hình, vì vậy, hệ thống không yêu cầu bất kỳ khả năng bổ sung nào để cho biết các đối tượng đang được thao tác.
  • Thiết bị bàn di chuột được 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. Điều này có thể hữu ích cho máy tính bảng số hoá.
  • Thiết bị con trỏ được dùng để thao tác gián tiếp với các đối tượng trên màn hình bằng con trỏ. Ngón tay được hiểu là cử chỉ con trỏ nhiều điểm chạm. Các công cụ khác, chẳng hạn như bút cảm ứng, được diễn giải bằng cách sử dụng vị trí tuyệt đối. Hãy xem phần Cử chỉ con trỏ nhiều điểm chạm gián tiếp để biết thêm thông tin.

Các quy tắc sau đây được 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ị trỏ.

  • Nếu thuộc tính touch.deviceType được đặt, thì loại thiết bị sẽ được đặt như đã 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ột 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 pointer.
  • 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ự không rõ ràng đố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 không được dùng để điều khiển con trỏ vì chuột đã điều khiển con trỏ.
  • Nếu không, loại thiết bị sẽ được đặt thành pointer. Chế độ mặc định này đảm bảo rằng bàn di chuột chưa được chỉ định bất kỳ mục đích đặc biệt nào khác sẽ điều khiển con trỏ.

Nút

Nút là các thành phần điều khiển không bắt buộc mà ứng dụng có thể 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 dùng với thiết bị cảm ứng loại con trỏ hoặc với bút cảm ứng.

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

  • BTN_LEFT: Được liên kết với MotionEvent.BUTTON_PRIMARY.
  • BTN_RIGHT: Được liên kết với MotionEvent.BUTTON_SECONDARY.
  • BTN_MIDDLE: Được liên kết với MotionEvent.BUTTON_MIDDLE.
  • BTN_BACK và BTN_SIDE: Được liên kết với MotionEvent.BUTTON_BACK. Thao tác nhấn nút này cũng tổng hợp một thao tác nhấn phím bằng mã phím KeyEvent.KEYCODE_BACK.
  • BTN_FORWARD và BTN_EXTRA: Được liên kết với MotionEvent.BUTTON_FORWARD. Thao tác nhấn nút này cũng tổng hợp một thao tác nhấn phím bằng mã phím KeyEvent.KEYCODE_FORWARD.
  • BTN_STYLUS: Được liên kết với MotionEvent.BUTTON_SECONDARY.
  • BTN_STYLUS2: Được liên kết với MotionEvent.BUTTON_TERTIARY.

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

Công cụ là ngón tay, bút cảm ứng hoặc thiết bị khác 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, chẳng hạn như trong API MotionEvent, một công cụ thường được gọi là con trỏ.

Chúng tôi hỗ trợ các loại công cụ sau:

  • BTN_TOOL_FINGER và MT_TOOL_FINGER: Được liên kết với MotionEvent.TOOL_TYPE_FINGER.
  • BTN_TOOL_PEN và MT_TOOL_PEN: Được liên kết với MotionEvent.TOOL_TYPE_STYLUS.
  • BTN_TOOL_RUBBER: Được liên kết với MotionEvent.TOOL_TYPE_ERASER.
  • BTN_TOOL_BRUSH: Được liên kết với MotionEvent.TOOL_TYPE_STYLUS.
  • BTN_TOOL_PENCIL: Được liên kết với MotionEvent.TOOL_TYPE_STYLUS.
  • BTN_TOOL_AIRBRUSH: Được liên kết với MotionEvent.TOOL_TYPE_STYLUS.
  • BTN_TOOL_MOUSE: Được liên kết với MotionEvent.TOOL_TYPE_MOUSE.
  • BTN_TOOL_LENS: Được liên kết với MotionEvent.TOOL_TYPE_MOUSE.
  • BTN_TOOL_DOUBLETAP, BTN_TOOL_TRIPLETAP và BTN_TOOL_QUADTAP: Được liên kết với MotionEvent.TOOL_TYPE_FINGER.

Công cụ di chuột và công cụ chạm

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à di chuột lên trên thiết bị đó. Không phải thiết bị cảm ứng nào cũng có thể cảm nhận được sự hiện diện của một công cụ di chuột phía trên thiết bị cảm ứng. Những thiết bị có hỗ trợ, chẳng hạn như bộ số hoá bút cảm ứng dựa trên tần số vô tuyế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ố hoá.

Thành phần InputReader phân biệt công cụ chạm với công cụ di chuột. Tương tự, các công cụ chạm và công cụ di chuột được báo cáo cho ứng dụng theo nhiều cách.

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_DOWN và MotionEvent.ACTION_POINTER_UP.

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

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

  • 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 hỗ trợ. Việc đăng ký các trục hoặc mã phím không được hỗ trợ 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 không chính xác các chức năng của thiết bị. Ví dụ: nếu thiết bị báo cáo mã phím BTN_TOUCH, thì hệ thống sẽ giả định rằng BTN_TOUCH luôn được dùng để cho biết liệu công cụ có đang chạm vào màn hình hay không. Do đó, bạn không nên dùng BTN_TOUCH để cho biết công cụ chỉ nằm trong phạm vi và đang di chuột.
  • 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 toạ độ X của công cụ.
    • ABS_Y: (BẮT BUỘC) Báo cáo toạ độ Y của công cụ.
    • ABS_PRESSURE: (không bắt buộc) Báo cáo áp lực vật lý tác động lên đầu công cụ hoặc cường độ tín hiệu của điểm tiếp xúc.
    • ABS_TOOL_WIDTH: (không bắt buộc) Báo cáo diện tích mặt cắt ngang hoặc chiều rộng của điểm tiếp xúc hoặc của chính công cụ.
    • ABS_DISTANCE: (không bắt buộc) Báo cáo khoảng cách của công cụ so với bề mặt của thiết bị cảm ứng.
    • ABS_TILT_X: (không bắt buộc) Báo cáo độ nghiêng của cô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: (không bắt buộc) Báo cáo độ nghiêng của cô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ó đang 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: (không bắt buộc) Báo cáo trạng thái nút.
    • 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: (không bắt buộc) Báo cáo loại công 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 toạ độ X của công cụ.
    • ABS_MT_POSITION_Y: (BẮT BUỘC) Báo cáo toạ độ Y của công cụ.
    • ABS_MT_PRESSURE: (không bắt buộc) Báo cáo áp lực vật lý tác động lên đầu công cụ hoặc cường độ tín hiệu của điểm tiếp xúc.
    • ABS_MT_TOUCH_MAJOR: (không bắt buộc) Báo cáo diện tích mặt cắt ngang của điểm tiếp xúc hoặc chiều dài của kích thước dài hơn của điểm tiếp xúc.
    • ABS_MT_TOUCH_MINOR: (không bắt buộc) Báo cáo chiều dài của kích thước ngắn hơn của điểm tiếp xúc. Không nên sử dụng trục này nếu ABS_MT_TOUCH_MAJOR đang báo cáo số đo diện tích.
    • ABS_MT_WIDTH_MAJOR: (không bắt buộc) 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ụ. Đừng sử dụng trục này trừ phi bạn biết kích thước của chính công cụ đó.
    • ABS_MT_WIDTH_MINOR: (không bắt buộc) Báo cáo chiều dài của kích thước ngắn hơn của chính công cụ đó. Bạn 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 chính công cụ đó.
    • ABS_MT_ORIENTATION: (không bắt buộc) Báo cáo hướng của công cụ.
    • ABS_MT_DISTANCE: (không bắt buộc) Báo cáo khoảng cách của công cụ từ bề mặt của thiết bị cảm ứng.
    • ABS_MT_TOOL_TYPE: (không bắt buộc) Báo cáo loại công cụ là MT_TOOL_FINGER hoặc MT_TOOL_PEN.
    • ABS_MT_TRACKING_ID: (không bắt buộc) Báo cáo mã theo dõi của công cụ. Mã theo dõi là một số nguyên không âm tuỳ ý, được dùng để xác định và theo dõi riêng từng công cụ khi có nhiều công cụ đang hoạt động. Ví dụ: khi nhiều ngón tay chạm vào thiết bị, mỗi ngón tay phải được chỉ định một mã theo dõi riêng biệt được sử dụng miễn là ngón tay đó vẫn tiếp xúc. Bạn có thể sử dụng lại mã theo dõi khi các công cụ liên quan nằm ngoài phạm vi.
    • ABS_MT_SLOT: (không bắt buộc) Báo cáo mã nhận dạng vùng của công cụ khi sử dụng giao thức cảm ứng đa điểm "B" của Linux. Hãy tham khảo tài liệu về giao thức cảm ứng đa điểm của Linux để biết thêm thông tin chi tiết.
    • BTN_TOUCH: (BẮT BUỘC) Cho biết liệu công cụ có đang 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: (không bắt buộc) Báo cáo trạng thái nút.
    • 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: (không bắt buộc) Báo cáo loại công cụ.
  • Nếu bạn xác định trục cho cả giao thức một lần chạm và đa điểm chạm, thì chỉ có trục đa điểm chạm được sử dụng và trục một lần chạm sẽ bị bỏ qua.
  • Giá trị tối thiểu và tối đa của các trục ABS_X, ABS_Y, ABS_MT_POSITION_X và ABS_MT_POSITION_Y xác định ranh giới của vùng hoạt động trên thiết bị theo đơ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 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í chạm được báo cáo trong đơn vị bề mặt để lấy vị trí chạm theo pixel hiển thị theo cách 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 thao tác chạm bên ngoài vùng hoạt động được báo cáo.

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

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

    Thiết bị cảm ứng không bao giờ được kẹp toạ độ chạm vào ranh giới của vùng hoạt động. Nếu một thao tác chạm thoát khỏi vùng hoạt động, thì thao tác đó phải được báo cáo là nằm ngoài vùng hoạt động hoặc 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, thì màn hình có thể báo cáo toạ độ (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 toạ độ có các thành phần nhỏ hơn minX và minY, chẳng hạn như (minX - 2, minY - 3) hoặc ngừng báo cáo hoàn toàn thao tác chạm. 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 vào bên ngoài vùng hoạt động.

    Việc kẹp toạ độ chạm 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 màn hình, ngăn hệ thống theo dõi mượt mà các chuyển động đi vào hoặc ra khỏi ranh giới của vùng hiển thị.

  • Giá trị do ABS_PRESSURE hoặc ABS_MT_PRESSURE báo cáo (nếu có) phải khác 0 khi công cụ chạm vào thiết bị và bằng 0 khi công cụ đang di chuột.

    Bạn không bắt buộc phải báo cáo thông tin về áp suất nhưng bạn nên làm vậy. Ứng dụng có thể sử dụng thông tin về áp lực để triển khai bản vẽ nhạy áp lực và các hiệu ứng khác.

  • Các giá trị do ABS_TOOL_WIDTH, ABS_MT_TOUCH_MAJOR, ABS_MT_TOUCH_MINOR, ABS_MT_WIDTH_MAJOR hoặc ABS_MT_WIDTH_MINOR báo cáo phải khác 0 khi công cụ đang chạm vào thiết bị và bằng 0 khi không chạm, nhưng điều này 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 các điểm tiếp xúc bằng bút cảm ứng.

    Bạn không bắt buộc phải báo cáo thông tin về kích thước, nhưng bạn nên làm việc này. Ứng dụng có thể sử dụng thông tin về áp lực để triển khai bản vẽ nhạy cảm với kích thước và các hiệu ứng khác.

  • Giá trị do ABS_DISTANCE hoặc ABS_MT_DISTANCE báo cáo phải gần bằng 0 khi công cụ chạm vào thiết bị. Khoảng cách có thể vẫn khác 0 ngay cả khi dụng cụ tiếp xúc trực tiếp. 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.

    Việc báo cáo thông tin về khoảng cách là không bắt buộc nhưng bạn nên thực hiện đối với thiết bị bút cảm ứng.

  • Giá trị do ABS_TILT_X và ABS_TILT_Y báo cáo phải bằng 0 khi công cụ vuông góc với thiết bị. Độ nghiêng khác 0 cho biết công cụ được giữ ở một góc nghiêng.

    Góc nghiêng dọc theo trục X và Y được giả định là được chỉ định theo độ từ vuông góc. Điểm trung tâm (vuông góc hoàn hảo) được cho bởi (max + min) / 2 cho mỗi trục. Giá trị nhỏ hơn điểm trung tâm thể hiện độ nghiêng lên hoặc sang trái, giá trị lớn hơn điểm trung tâm thể hiện độ 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 hướng phẳng từ -PI đến PI radian. Cách biểu thị này tạo ra nội dung mô tả về hướng tương thích với nội dung dùng để mô tả thao tác chạm bằng ngón tay.

    Việc báo cáo thông tin về độ nghiêng là không bắt buộc nhưng bạn nên thực hiện đối với thiết bị bút cảm ứng.

  • Nếu loại công cụ được ABS_MT_TOOL_TYPE báo cáo, thì loại công cụ đó sẽ thay thế mọi thông tin về loại công cụ do BTN_TOOL_* báo cáo. Nếu không có thông tin nào về loại công cụ, thì loại công cụ sẽ mặc định là MotionEvent.TOOL_TYPE_FINGER.

  • 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 lần 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ù công cụ đó có đang chạm hay không, hoặc ít nhất là loại công cụ. Nếu không có thông tin, thì công cụ được giả định 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ụ này sẽ hoạt động bất cứ khi nào xuất hiện trong báo cáo đồng bộ hoá gần đây nhất. Khi công cụ này ngừng xuất hiện trong báo cáo đồng bộ hoá, công cụ này 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ụ này sẽ hoạt động miễn là có một khe hoạt động. Khi ô đó bị xoá, công cụ sẽ không còn tồn tại.
  • Một công cụ được xác định là đang di chuột 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ụ đó sẽ không di chuột, ngay cả khi một trong hai đ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 về áp lực, đồng thời áp lực được báo cáo là 0, thì công cụ đang di chuột.
    • Nếu công cụ đang hoạt động và trình điều khiển hỗ trợ mã phím BTN_TOUCH và BTN_TOUCH có giá trị bằng 0, thì công cụ đang di chuột.
  • 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 cả hai đều hoạt động.
  • Kể từ Android 4.0, có thể bạn cần thay đổi trình điều khiển màn hình cảm ứng để tuân thủ thông số kỹ thuật của giao thức đầu vào Linux.

    Bạn có thể phải thực hiện những thay đổi sau:

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

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

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

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

    • Thông tin về kích thước tiếp xúc phải được báo cáo bằng ABS_MT_TOUCH_MAJOR.

      Các phiên bản Android trước đây truy xuất thông tin về kích thước từ ABS_MT_TOOL_MAJOR. Hành vi cũ không tương thích với quy cách 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 tuỳ chỉnh dành riêng cho Android nữa. Bằng cách dựa vào giao thức nhập Linux tiêu chuẩn, Android có thể hỗ trợ nhiều thiết bị ngoại vi cảm ứng hơn, chẳng hạn như màn hình cảm ứng đa điểm HID bên ngoài, bằng cách sử dụng trình điều khiển chưa sửa đổi.

Thao tác trên thiết bị cảm ứng

Sau đây là thông tin tóm tắt ngắn gọn về thao tác trên thiết bị cảm ứng trong 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 nội bộ về vị trí cũng như các đặc điểm khác của từng công cụ. Nó cũng theo dõi trạng thái nút.
  3. Nếu BACK hoặc FORWARD được nhấn hoặc thả, InputReader sẽ thông báo cho InputDispatcher về sự kiện phím.
  4. InputReader xác định xem có xảy ra thao tác nhấn phím ảo hay không. Nếu có, thì lớp này sẽ thông báo cho InputDispatcher về sự kiện chính.
  5. InputReader xác định xem thao tác chạm có được bắt đầu trong ranh giới của màn hình hay không. Nếu có, thì lớp này sẽ thông báo cho InputDispatcher về sự kiện chạm.
  6. Nếu không có công cụ chạm nào nhưng có ít nhất một công cụ di chuột, thì InputReader sẽ 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 sẽ thực hiện phát hiện cử chỉ 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ó nên gửi sự kiện hay không và liệu sự kiện có nên đánh thức thiết bị hay không. Sau đó, InputDispatcher sẽ phân phối các sự kiện đến ứng dụng thích hợp.

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

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

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

Thuộc tính

Hệ thống dựa vào 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 hành vi của thiết bị cảm ứng.

Một lý do cho việc 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 thao tác chạm bằng đơn vị dành riêng cho thiết bị.

Ví dụ: nhiều thiết bị cảm ứng đo lường vùng tiếp xúc cảm ứng bằng cách sử dụ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 bằng thao tác 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 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 tham số hiệu chỉnh được mã hoá trong tệp cấu hình thiết bị đầu vào để giải mã, biến đổi và chuẩn hoá các giá trị do thiết bị cảm ứng báo cáo thành một bản trình bày chuẩn đơn giản hơn mà ứng dụng có thể hiểu được.

Quy ước về tài liệu

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

Giá trị trục thô

Các biểu thức sau đây biểu thị 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ó.
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ó.
raw.toolMinor
Giá trị của trục ABS_MT_WIDTH_MINOR hoặc raw.toolMajor nếu không có.
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ó.
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 đây biểu thị ranh giới của các giá trị thô. Bạn có thể lấy các giá trị này 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ả giá trị này) của trục thô.
raw.*.max
Giá trị tối đa (bao gồm cả giá trị này) 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 nghĩa là các giá trị chính xác đến +/- 1 đơn vị.
raw.width
Chiều rộng bao gồm cả vùng chạm, tương đương với raw.x.range + 1.
raw.height
Chiều cao bao gồm cả vùng chạm, tương đương với raw.y.range + 1.

Phạm vi đầu ra

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

output.width
Chiều rộng đầu ra. Đối với màn hình cảm ứng (liên kết 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 liên kết với màn hình), chiều rộng đầu ra bằng raw.width, cho biết 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 (liên kết 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 liên kết với màn hình), chiều cao đầu ra bằng raw.height, cho biết 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ệ toạ độ đầ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ạ nhập bằng cách chạm 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 giá trị hiệu chỉnh. Bảng sau đây mô tả một số thuộc tính cấu hình 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 mà chúng được dùng để hiệu chỉnh.

touch.deviceType

Khai báo: touch.deviceType = touchScreen | touchPad | pointer | default

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

  • Nếu giá trị là touchScreen, thì 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 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 liên kết với màn hình và các chuyển động của thiết bị này được dùng cho các cử chỉ con trỏ cảm ứng đa điể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.

Hãy tham khảo phần Phân loại để biết thêm thông tin chi tiết về cách loại thiết bị ảnh hưởng đến hành vi của thiết bị cảm ứng.

Trong Android 3 trở xuống, tất cả thiết bị cảm ứng đều được giả định là màn hình cảm ứng.

touch.orientationAware

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

Chỉ định xem 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, thì vị trí chạm do thiết bị cảm ứng báo cáo sẽ được xoay bất cứ khi nào hướng hiển thị thay đổi.

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

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

Hệ thống phân biệt giữa màn hình cảm ứng và màn hình hiển thị bên trong và bên ngoài. Màn hình cảm ứng bên trong nhận biết hướng sẽ 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 sẽ xoay dựa trên hướng của màn hình bên ngoài.

Nhận biết hướng được 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 thiết bị được xoay theo chiều kim đồng hồ 90 độ so với hướng tự nhiên, vị trí tuyệt đối của các thao tác chạm sẽ được ánh xạ lại sao cho thao tác chạm ở góc trên cùng bên trái của hệ toạ độ tuyệt đối của màn hình cảm ứng được báo cáo là thao tác chạm ở góc trên cùng bên trái của hệ toạ độ xoay của màn hình. Việc này được thực hiện để các thao tác chạm được báo cáo bằng cùng một hệ toạ độ mà ứng dụng dùng để vẽ các thành phần hình ảnh.

Trước Honeycomb, tất cả thiết bị cảm ứng đều được giả định là có nhận biết hướng.

touch.gestureMode

Khai báo: 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 pointer.

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

  • Nếu giá trị là spots, thì cử chỉ trên bàn di chuột sẽ được biểu thị bằng một điể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 đại diện cho 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, nếu không thì giá trị mặc định là spots.

Trường X và Y

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.

Cách tính

Cách 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ào hệ toạ độ đầ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, size fields

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

Trường toolMajor và toolMinor 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 hoá của thao tác chạm so với thao tác 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 hoá nhỏ nhất có thể là 0 (không tiếp xúc hoặc không đo lường được) và kích thước chuẩn hoá lớn nhất có thể là 1 (vùng cảm biến đã bão hoà).

Khi có thể đo lường cả chiều dài và chiều rộng gần đúng, thì trường touchMajor sẽ chỉ định kích thước dài hơn và trường touchMinor sẽ 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ì các trường touchMajor và touchMinor sẽ bằng nhau.

Tương tự, 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 diện tích mặt cắt ngang của công cụ.

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

Thiết bị cảm ứng đo lường 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. Cách triển khai hiện tại hỗ trợ 3 loại phép đo: đườ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< h4=""></touch.size.calibration<>

Khai báo: touch.size.calibration = none | geometric | diameter | area | default

Chỉ định loại phép đo mà trình điều khiển cảm ứng sử dụ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, thì kích thước sẽ được đặt thành 0.

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

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

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

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

touch.size.scale

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

Chỉ định hệ số tỷ lệ không đổi được dùng trong quá trình hiệu chỉnh.

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

touch.size.bias

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

Chỉ định giá trị độ lệch không đổi được dùng trong quá trình hiệu chỉnh.

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ả người liên hệ đang hoạt động hay được báo cáo riêng cho từng người liên hệ.

  • Nếu giá trị là 1, thì kích thước được báo cáo sẽ được chia cho số lượng người 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 điểm tiếp xúc, vì vậy, các thiết bị này báo cáo số đo kích thước đại diện cho tổng diện tích hoặc chiều rộng của các điểm tiếp xúc. Bạn chỉ nên đặt thuộc tính này thành 1 cho các thiết bị như vậy. Nếu bạn không chắc chắn, hãy đặt giá trị này thành 0.

Cách tính

Việc tính toán các trường touchMajor, touchMinor, toolMajor, toolMinor và size phụ thuộc vào các tham số hiệu chỉnh đã 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 áp suất

Trường pressure mô tả áp lực vật lý tương đối được áp dụng cho thiết bị cảm ứng dưới dạng giá trị chuẩn hoá từ 0 (không chạm) đến 1 (áp lực bình thường).

Lực nhấn bằng 0 cho biết công cụ đang di chuột.

touch.pressure.calibration

Khai báo: touch.pressure.calibration = none | physical | amplitude | default

Chỉ định loại phép đo mà 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, thì áp lực không xác định được 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 là đo cường độ áp suất vật lý thực tế áp dụng cho bàn di chuột.

  • Nếu giá trị là amplitude, thì trục áp suất được giả định là đo biên độ tín hiệu, liên quan đến kích thước của điểm tiếp xúc và áp suất được áp dụng.

  • Nếu giá trị là default, hệ thống sẽ sử dụng hiệu chuẩn physical nếu có trục áp suất, nếu không thì sẽ sử dụng none.

touch.pressure.scale

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

Chỉ định hệ số tỷ lệ không đổi được dùng trong quá trình hiệu chỉnh.

Giá trị mặc định là 1.0 / raw.pressure.max.

Cách tính

Cách tính trường pressure phụ thuộc vào các tham số hiệu chỉnh được chỉ định.

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

trường hướng và độ nghiêng

Trường orientation mô tả hướng của thao tác chạm và công cụ dưới dạng số đo góc. Hướng 0 cho biết trục chính được định hướng theo chiều dọc, -PI/2 cho biết trục chính được định hướng sang bên trái, PI/2 cho biết trục chính được định hướng sang bên phải. Khi có bút cảm ứng, phạm vi hướng có thể được mô tả trong phạm vi vòng tròn đầy đủ từ -PI hoặc PI.

Trường tilt mô tả độ nghiêng của công cụ dưới dạng số đo góc. Độ nghiêng 0 cho biết công cụ vuông góc với bề mặt. Độ nghiêng PI/2 cho biết công cụ đang nằm phẳng trên bề mặt.

touch.orientation.calibration

Khai báo: touch.orientation.calibration = none | interpolated | vector | default

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

  • Nếu giá trị là none, thì hướng không xác định được nên được đặt thành 0.
  • Nếu giá trị là interpolated, thì hướng sẽ được nội suy tuyến tính sao cho giá trị thô raw.orientation.min ánh xạ tới -PI/2 và giá trị thô raw.orientation.max ánh xạ tới PI/2. Giá trị trung tâm của (raw.orientation.min + raw.orientation.max) / 2 liên kết với 0.
  • Nếu giá trị là vector, thì hướng được hiểu là một vectơ đóng gói bao gồm hai trường 4 bit có dấu. Cách trình bày này được dùng trên các phần của Giao thức dựa trên đối tượng Atmel. Khi được giải mã, vectơ sẽ cho ra một góc hướng và độ lớn tin cậy. Mức độ tin cậy được dùng để điều chỉnh thông tin về kích thước, trừ phi đó là thông tin hình học.
  • Nếu giá trị là default, hệ thống sẽ sử dụng hiệu chỉnh interpolated nếu có trục hướng, nếu không thì sẽ sử dụng none.

Cách tính

Cách tính các trường orientation và tilt phụ thuộc vào các tham số hiệu chỉnh đã chỉ định và dữ liệu đầu vào có sẵn.

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

trường distance (khoảng cách)

Trường distance mô tả khoảng cách giữa công cụ và bề mặt thiết bị cảm ứng. Giá trị 0 cho biết tiếp xúc trực tiếp và giá trị lớn hơn cho biết khoảng cách ngày càng tăng so với bề mặt.

touch.distance.calibration

Khai báo: touch.distance.calibration = none | scaled | default

Chỉ định loại phép đo mà trình điều khiển cảm ứng sử dụng để báo cáo khoảng cách.

  • Nếu giá trị là none, thì khoảng cách không xác định được nên được đặt thành 0.

  • Nếu giá trị là scaled, thì khoảng cách được báo cáo sẽ được nhân với một hệ số tỷ lệ không đổi.

  • Nếu giá trị là default, hệ thống sẽ sử dụng hiệu chuẩn scaled nếu có trục khoảng cách, nếu không thì sẽ sử dụng none.

touch.distance.scale

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

Chỉ định hệ số tỷ lệ không đổi được dùng trong quá trình hiệu chỉnh.

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

Cách tính

Cách tính trường distance phụ thuộc vào các tham số hiệu chỉnh đã chỉ định.

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

Ví dụ

# 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 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

Lưu ý về khả năng tương thích

Các thuộc tính cấu hình cho thiết bị cảm ứng đã thay đổi đáng kể trong Android Ice Cream Sandwich 4.0. Tất cả tệp cấu hình thiết bị đầu vào cho thiết bị cảm ứng phải được cập nhật để sử dụng các thuộc tính cấu hình mới.

Bạn cũng có thể cần cập nhật trình điều khiển của thiết bị cảm ứng cũ.

Tệp bản đồ khoá ảo

Bạn có thể dùng thiết bị cảm ứng để triển khai các phím ảo.

Có một số cách để thực hiện việc này, tuỳ thuộc vào chức năng của bộ điều khiển cảm ứng. Bạn có thể trực tiếp định cấu hình một số bộ điều khiển cảm ứng để triển khai các phím mềm bằng cách thiết lập thanh ghi chương trình cơ sở. Trong những trường hợp khác, bạn nên thực hiện việc ánh xạ từ toạ độ chạm đến mã phím trong phần mềm.

Khi các phím ảo được triển khai trong phần mềm, hạt nhân phải xuất tệp bản đồ phím ảo có tên virtualkeys.<devicename> dưới dạng thuộc tính của bo mạch. Ví dụ: nếu trình điều khiển thiết bị màn hình cảm ứng báo cáo tên là "touchyfeely" thì tệp bản đồ phím ảo phải có đường dẫn /sys/board_properties/virtualkeys.touchyfeely.

Tệp bản đồ phím ảo mô tả toạ độ và mã phím Linux của các phím ảo trên màn hình cảm ứng.

Ngoài tệp bản đồ phím ảo, phải có một tệp bố cục phím và tệp bản đồ ký tự phím tương ứng để liên kết mã phím Linux với mã phím Android và để chỉ định loại thiết bị bàn phím (thường là SPECIAL_FUNCTION).

Cú pháp

Tệp bản đồ khoá ảo là một tệp văn bản thuần túy bao gồm một chuỗi các nội dung mô tả bố cục khoá ảo, được phân tách bằng dòng mới hoặc dấu hai chấm.

Các dòng nhận xét bắt đầu bằng "#" và tiếp tục cho đến cuối dòng.

Mỗi khoá ảo được mô tả bằng 6 thành phần được phân tách bằng dấu hai chấm:

  • 0x01: Mã phiên bản. Phải luôn là 0x01.
  • <Linux key code>: Mã phím Linux của phím ảo.
  • <centerX>: Toạ độ pixel X của tâm phím ảo.
  • <centerY>: Toạ độ pixel Y của tâm phím ảo.
  • <width>: Chiều rộng của phím ảo, tính bằng pixel.
  • <height>: Chiều cao của phím ảo tính bằng pixel.

Tất cả toạ độ và kích thước đều được chỉ định theo hệ toạ độ hiển thị.

Sau đây là tệp ánh xạ khoá ảo được viết trên một dòng.

# 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

Bạn cũng có thể viết cùng một tệp ánh xạ phím ảo trên nhiều dòng.

# 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

Trong ví dụ trên, màn hình cảm ứng có độ phân giải 480x800. Theo đó, tất cả các phím ảo đều có toạ độ <centerY> là 835, thấp hơn một chút so với vùng hiển thị của màn hình cảm ứng.

Phím đầu tiên có mã quét Linux là 158 (KEY_BACK), centerX là 55, centerY là 835, chiều rộng là 90 và chiều cao là 55.

Ví dụ

Tệp ánh xạ phím ảo: /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

Tệp bố cục phím: /system/usr/keylayout/touchyfeely.kl.

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

Tệp ánh xạ ký tự chính: /system/usr/keychars/touchyfeely.kcm.

type SPECIAL_FUNCTION

Cử chỉ con trỏ nhiều điểm chạm gián tiếp

Ở chế độ con trỏ, hệ thống diễn giải các cử chỉ sau:

  • Nhấn bằng một ngón tay: nhấp.
  • Chuyển động một ngón tay: di chuyển con trỏ.
  • Thao tác bằng một ngón tay và nhấn nút: kéo con trỏ.
  • Thao tác bằng hai ngón tay, cả hai ngón tay di chuyển theo cùng một hướng: kéo vùng dưới con trỏ theo hướng đó. Bản thân con trỏ không di chuyển.
  • Thao tác bằng hai ngón tay, cả hai ngón tay di chuyển về phía nhau hoặc tách ra theo các hướng khác nhau: xoay/điều chỉnh tỷ lệ/xoay vùng xung quanh con trỏ. Bản thân con trỏ không di chuyển.
  • Chuyển động nhiều ngón tay: cử chỉ tự do.

Tính năng chống tì tay

Kể từ Android 13, hệ thống có thể tự động từ chối dữ liệu đầu vào từ lòng bàn tay khi khung tích hợp được bật. Các giải pháp nội bộ, tuỳ chỉnh vẫn được hỗ trợ, mặc dù có thể cần được sửa đổi để trả về cờ TOOL_TYPE_PALM khi phát hiện thấy lòng bàn tay. Khung tích hợp sẵn cũng hoạt động kết hợp với các giải pháp tuỳ chỉnh.

Mô hình thực tế xem xét 90 mili giây đầu tiên của dữ liệu cử chỉ, tại con trỏ hiện tại và tại các con trỏ xung quanh, sau đó xem xét khoảng cách giữa các lần chạm và cạnh màn hình. Sau đó, hệ thống sẽ xác định (trên cơ sở từng con trỏ) con trỏ nào là lòng bàn tay. Hàm này cũng tính đến kích thước của từng điểm tiếp xúc, như được báo cáo bởi touchMajor và touchMinor. Sau đó, khung Android sẽ xoá các con trỏ được đánh dấu là lòng bàn tay khỏi luồng cảm ứng.

Nếu con trỏ đã được gửi đến ứng dụng, thì hệ thống sẽ:

  • (Nếu có các con trỏ khác đang hoạt động) Huỷ con trỏ bằng cách đặt ACTION_POINTER_UP và FLAG_CANCELED.
  • (Nếu đây là con trỏ duy nhất) Huỷ con trỏ bằng ACTION_CANCEL.

Một API công khai, MotionEvent.FLAG_CANCELED, cho biết rằng sự kiện hiện tại không được kích hoạt hành động của người dùng. Cờ này được đặt cho cả ACTION_CANCEL và ACTION_POINTER_UP.

Nếu con trỏ lòng bàn tay không được gửi đến ứng dụng, thì hệ thống chỉ cần thả con trỏ.

Bật tính năng chống tì tay

  1. Trong trình điều khiển cảm ứng, hãy sử dụng macro input_abs_set_res để đặt độ phân giải cho các trường sau (đơn vị là pixel trên mm):
    • ABS_MT_POSITION_X
    • ABS_MT_POSITION_Y
    • ABS_MT_TOUCH_MAJOR
    • ABS_MT_TOUCH_MINOR

    Bạn không bắt buộc phải hỗ trợ ABS_MT_TOUCH_MINOR. Tuy nhiên, nếu thiết bị của bạn có hỗ trợ, hãy đảm bảo bạn đã đặt độ phân giải chính xác.

  2. Để xác nhận các trường được đặt chính xác, hãy chạy:
        $ adb shell getevent -li
    
  3. Để bật tính năng này trong thời gian chạy, hãy chạy:
        $ adb shell device_config put input_native_boot palm_rejection_enabled 1
    
  4. Khởi động lại quy trình system_server.
         $ adb shell stop && adb shell start
        
  5. Xác nhận rằng adb shell dumpsys input cho thấy có các trình từ chối lòng bàn tay bên trong UnwantedInteractionBlocker. Nếu không, hãy kiểm tra nhật ký liên quan đến dữ liệu đầu vào để tìm manh mối về những gì có thể đã được định cấu hình sai.

    Hãy xem ví dụ sau để tham khảo:

    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. Để bật vĩnh viễn tính năng này, hãy thêm lệnh sysprop tương ứng vào tệp init**rc của bạn:

    setprop persist.device_config.input_native_boot.palm_rejection_enabled 1
    

Tài liệu đọc thêm