Thiết bị cảm ứng

Android hỗ trợ nhiều màn hình cảm ứng và bàn di chuột, bao gồm máy tính bảng số hoá dùng 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 để người dùng có cảm giác như đang thao tác trực tiếp 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 vị trí 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 trên chuột.

Thiết bị cảm ứng đôi khi có thể bị thao tác 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.

Đôi khi, thiết bị cảm ứng được dùng để triển khai phím ảo. Ví dụ: bật một số thiết bị Android, khu vực cảm biến trên màn hình cảm ứng mở rộng ra ngoài cạnh của màn hình và phục vụ hai mục đích như một phần của bàn phím cảm ứng nhạy.

Do có rất nhiều 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 mỗi thiết bị.

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

Một thiết bị đầu vào sẽ được phân loại là thiết bị nhiều điểm chạm nếu cả hai có các điều kiện sau:

  • Thiết bị đầu vào sẽ báo cáo sự hiện diện của ABS_MT_POSITION_XABS_MT_POSITION_Y trục tuyệt đối.
  • Thiết bị đầu vào không có nút nào trên tay điều khiển trò chơi. Điều kiện này giải quyết vấn đề không rõ ràng đối với một số bàn điều khiển trò chơi báo cáo các trục có mã trùng với các trục MT.

Một thiết bị đầu vào được phân loại là thiết bị một lần chạm nếu cả hai có các đ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 một lần hoặc thiết bị cảm ứng đa điểm, không bao giờ có cả hai.
  • Thiết bị đầu vào báo cáo sự hiện diện của giá trị tuyệt đối ABS_XABS_Y các trục và 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, thì trạng thái số lượng khoá ảo được xác định bằng cách cố gắng tải tệp bản đồ khoá ảo cho thiết bị. Nếu có sơ đồ khoá ảo, thì bố cục khoá cho thiết bị cũng được tải. Tham khảo [Các tệp bản đồ 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.

Mọi 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 của thiết bị đầu vào, hệ thống chọn một cấu hình mặc định phù hợp với mục đích chung thiết bị ngoại vi cảm ứng như màn hình cảm ứng USB bên ngoài hoặc Bluetooth HID hoặc bàn di chuột. Các chế độ mặc định này không dành 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 màn hình cảm ứng, bàn di chuột hoặc thiết bị con trỏ.

  • Thiết bị 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 trực tiếp chạm vào màn hình nên hệ thống không yêu cầu mọi thành phần bổ sung để cho biết các đối tượng đang được bị bóp méo.
  • Thiết bị bàn di chuột được dùng để cung cấp thông tin vị trí tuyệt đối cho một ứng dụng về thao tác chạm trên một vùng cảm biến nhất định. Thông tin 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 đối với các đối tượng trên màn hình bằng con trỏ. Ngón tay được hiểu là con trỏ đa điểm cử chỉ. Các công cụ khác (chẳng hạn như bút cảm ứng) được diễn giải bằng vị trí tuyệt đối. Xem Con trỏ đa điểm gián tiếp cử chỉ để biết thêm thông tin.

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

  • Nếu bạn đặt thuộc tính touch.deviceType, thì loại thiết bị sẽ là đặt như được chỉ định.
  • Nếu thiết bị đầu vào báo cáo sự hiện diện của INPUT_PROP_DIRECT đầu vào (thông qua ioctl EVIOCGPROP), thì loại thiết bị là đặt thành màn hình cảm ứng. Điều kiện này giả định rằng thao tác chạm trực tiếp thiết bị được gắn vào màn hình cũng đã kết nối.
  • Nếu thiết bị đầu vào báo cáo sự hiện diện của INPUT_PROP_POINTER đầu vào (thông qua ioctl EVIOCGPROP), sau đó là loại thiết bị đượ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 REL_X hoặc REL_Y trục tương đối, thì loại thiết bị đượ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 cho các thiết bị đầu vào bao gồm cả chuột và một 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. Giá trị mặc định này đảm bảo bàn di chuột chưa được chỉ định bất kỳ mục đích đặc biệt nào khác điều khiển con trỏ.

Nút

Nút là 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ư trên chuột và chủ yếu dùng với các thiết bị cảm ứng loại con trỏ hoặc bút cảm ứng.

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

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

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

Công cụ là một ngón tay, bút cảm ứng hoặc cá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 các loại công cụ.

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

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

  • BTN_TOOL_FINGERMT_TOOL_FINGER: Liên kết với MotionEvent.TOOL_TYPE_FINGER.
  • BTN_TOOL_PENMT_TOOL_PEN: Liên kết với MotionEvent.TOOL_TYPE_STYLUS.
  • BTN_TOOL_RUBBER: Đã liên kết với MotionEvent.TOOL_TYPE_ERASER.
  • BTN_TOOL_BRUSH: Đã liên kết với MotionEvent.TOOL_TYPE_STYLUS.
  • BTN_TOOL_PENCIL: Đã liên kết với MotionEvent.TOOL_TYPE_STYLUS.
  • BTN_TOOL_AIRBRUSH: Đã liên kết với MotionEvent.TOOL_TYPE_STYLUS.
  • BTN_TOOL_MOUSE: Đã liên kết với MotionEvent.TOOL_TYPE_MOUSE.
  • BTN_TOOL_LENS: Đã liên kết với MotionEvent.TOOL_TYPE_MOUSE.
  • BTN_TOOL_DOUBLETAP, BTN_TOOL_TRIPLETAPBTN_TOOL_QUADTAP: Liên kết với MotionEvent.TOOL_TYPE_FINGER.

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

Công cụ có thể tiếp xúc với thiết bị cảm ứng hoặc trong phạm vi và di chuột phía trên mục đó. Không phải thiết bị cảm ứng nào cũng cảm nhận được sự hiện diện của công cụ nào đó di chuột lên phía trên thiết bị cảm ứng. Những công cụ đó, chẳng hạn như bộ số hoá bút cảm ứng dựa trên RF, thường có thể phát hiện khi công cụ này 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 và các công cụ lập mô hình tuỳ chỉnh. Tương tự, các công cụ chạm và công cụ di chuột cũng được báo cáo cho ứ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 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 ứ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_MOVEMotionEvent.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ý trục và mã phím cho các trục và các nút mà chúng hỗ trợ. Đă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 nhầm lẫn phát hiện các khả năng của thiết bị. Ví dụ: nếu thiết bị báo cáo BTN_TOUCH mã phím, hệ thống giả định rằng BTN_TOUCH luôn được dùng để cho biết liệu công cụ này có chạm vào màn hình. Do đó, bạn không nên sử dụng BTN_TOUCH để cho biết rằng công cụ này chỉ nằm trong dải ô và di chuột.
  • Thiết bị một cảm ứng sử dụng các sự kiện nhập trên Linux sau đây:
    • 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 suất vật lý áp dụng cho đầu mút của dụng cụ hoặc cường độ tín hiệu của điểm tiếp xúc chạm.
    • 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 chạm 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ụ tính từ nền tảng 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 công cụ có đang chạm vào thiết bị.
    • BTN_LEFT, BTN_RIGHT, BTN_MIDDLE, BTN_BACK, BTN_SIDE, BTN_FORWARD BTN_EXTRA, BTN_STYLUS, BTN_STYLUS2: Trạng thái (không bắt buộc) Báo cáo 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 nhập trên Linux sau đây:
    • 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 suất vật lý áp dụng cho đầu của dụng cụ hoặc cường độ tín hiệu của điểm tiếp xúc chạm.
    • 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 tiếp xúc chạm hoặc chiều dài của chiều dài tiếp xúc chạm.
    • ABS_MT_TOUCH_MINOR: (không bắt buộc) Báo cáo độ dài của phương diện ngắn hơn của điểm tiếp xúc chạm. Bạn không nên sử dụng trục này nếu ABS_MT_TOUCH_MAJOR là báo cáo thông tin đo lường 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 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 sử dụng trục này trừ phi bạn biết kích thước của công cụ này.
    • ABS_MT_WIDTH_MINOR: (không bắt buộc) Báo cáo độ dài của phương diện 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 số đo diện tích hoặc xác định kích thước của 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 từ công cụ đến 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ụ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ụ. 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 chạm vào thiết bị, mỗi ngón tay phải được chỉ định một mã theo dõi được sử dụng miễn là ngón tay vẫn tiếp xúc. Mã theo dõi có thể được tái sử dụng khi các công cụ liên quan của các công cụ đó rời khỏi phạm vi.
    • ABS_MT_SLOT: (không bắt buộc) Báo cáo mã vùng của công cụ khi sử dụng Giao thức đa điểm của Linux "B". 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 công cụ có đang chạm vào thiết bị.
    • BTN_LEFT, BTN_RIGHT, BTN_MIDDLE, BTN_BACK, BTN_SIDE, BTN_FORWARD BTN_EXTRA, BTN_STYLUS, BTN_STYLUS2: Trạng thái (không bắt buộc) Báo cáo 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 các trục cho cả giao thức một chạm và giao thức đa điểm chạm được xác định, thì chỉ sử dụng các trục nhiều điểm chạm và bỏ qua các trục một điểm chạm.
  • Giá trị nhỏ nhất và tối đa của ABS_X, ABS_Y, ABS_MT_POSITION_X, và trục ABS_MT_POSITION_Y xác định giới hạn của khu vực 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, khu vực hoạt động mô tả bộ phận của thiết bị cảm ứng thực sự che phủ màn hình.

    Đối với màn hình cảm ứng, hệ thống sẽ tự động nội suy thao tác chạm được báo cáo vị trí trong đơn vị bề mặt để biết vị trí cảm ứng trong pixel màn hình theo vào 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 thao tác chạm bên ngoài khu vực hoạt động được báo cáo.

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

    Thao tác chạm thực hiện bên trong khu vực đang hoạt động hoặc thao tác vào và thoát khỏi màn hình được phân phố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 một ứng dụng, sau đó di chuyển ra ngoài khu vực hoạt động, ứng dụng có thể nhận được các sự kiện chạm với toạ độ màn hình là âm hoặc nằm ngoài phạm vi giới hạn màn hình. Đây là hành vi được dự kiến.

    Thiết bị cảm ứng không bao giờ được giới hạn toạ độ cảm ứng trong giới hạn của thuộc tính đang hoạt động . Nếu một thao tác chạm thoát ra khỏi khu vực đang hoạt động, thao tác chạm đó phải được báo cáo là ở bên ngoài khu vực hoạt động hoặc không nên báo cáo.

    Ví dụ: nếu ngón tay của người dùng 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 toạ độ là (minX, minY). Nếu ngón tay tiếp tục để di chuyển ra ngoài khu vực hoạt động, màn hình cảm ứng sẽ bắt đầu phối hợp báo cáo 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 nó sẽ 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 nên báo cáo (minX, tối thiểu) khi ngón tay của người dùng thực sự chạm ra bên ngoài vùng hoạt động.

    Việc gắn toạ độ cảm ứng vào cạnh màn hình sẽ tạo ra ranh giới cứng xung quanh cạnh màn hình khiến hệ thống không thể theo dõi trơn tru những chuyển động đi vào hoặc ra khỏi ranh giới của khu vực hiển thị.

  • Các giá trị do ABS_PRESSURE hoặc ABS_MT_PRESSURE báo cáo, nếu chúng đều được báo cáo, phải khác 0 khi công cụ chạm vào thiết bị và số 0 khác để cho biết công cụ đang di chuột.

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

  • 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 công cụ này đang chạm vào thiết bị và nếu không thì chạm vào thiết bị, 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ảm ứng bằng ngón tay danh bạ nhưng không phải danh bạ cảm ứng bằng bút cảm ứng.

    Thông tin kích thước báo cáo là không bắt buộc nhưng bạn nên thực hiện. Ứng dụng có thể dùng thông tin về áp lực để triển khai bản vẽ có giới hạn kích thước và các hiệu ứng khác.

  • Các giá trị do ABS_DISTANCE hoặc ABS_MT_DISTANCE báo cáo phải tiến gần bằng 0 khi công cụ chạm vào thiết bị. Khoảng cách có thể duy trì khác 0 ngay cả khi công cụ này đượ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ề cách phần cứng đo khoảng cách.

    Không bắt buộc phải sử dụng thông tin về khoảng cách để báo cáo, nhưng bạn nên dùng cho thiết bị bút cảm ứng.

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

    Giả định góc nghiêng dọc theo trục X và Y được chỉ định theo độ so với đường vuông góc. Điểm giữa (hoàn toàn vuông góc) đã cho (max + min) / 2 cho mỗi trục. Các giá trị nhỏ hơn điểm giữa thể hiện độ nghiêng lên hoặc sang trái, các giá trị lớn hơn điểm giữa thể hiện độ nghiêng xuống hoặc về bên phải.

    InputReader chuyển đổi các thành phần nghiêng X và Y thành một đường vuông góc góc nghiêng từ 0 đến PI / 2 radian và góc hướng bằng phẳng dao động từ -PI đến PI radian. Biểu diễn này dẫn đến nội dung mô tả về hướng tương thích với hướng dùng để mô tả chạm ngón tay.

    Tính năng báo cáo thông tin về độ nghiêng là không bắt buộc nhưng nên dùng đối với các thiết bị bút cảm ứng.

  • Nếu loại công cụ do ABS_MT_TOOL_TYPE báo cáo, thì công cụ này sẽ thay thế mọi công cụ loại thông tin 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ụ 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 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 có nghĩa là 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ó gây khó chịu hay không, hoặc ít nhất là loại công cụ của công cụ đó. Nếu không có thông tin, thì công cụ này đượ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ụ 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ụ ngừng xuất hiện trong các báo cáo đồng bộ hoá, báo cáo này sẽ không 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à nó có một khung giờ đang hoạt động. Khi vị trí mà công cụ đã xoá, công cụ này sẽ ngừng tồn tại.
  • Một công cụ được xác định là được 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ụ này không được di chuột, ngay cả khi một trong hai điều kiện sau là đúng.
    • Nếu công cụ này đang hoạt động và người lái xe báo cáo thông tin về áp suất, và áp suất được báo cáo bằng 0, thì công cụ này sẽ di chuyển.
    • Nếu công cụ này đang hoạt động và trình điều khiển hỗ trợ mã phím BTN_TOUCHBTN_TOUCH có giá trị bằng 0, tức là công cụ này đ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 'B' giao thức 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ủ quy cách của giao thức đầu vào Linux.

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

    • Khi một công cụ không hoạt động (ngón tay di chuyển 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ụ không hoạt động (tất cả ngón tay đều giơ 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 rồi đến SYN_REPORT.

      Các phiên bản Android trước dự kiến sẽ "lên" các sự kiện đượ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 Thông số kỹ thuật của giao thức đầu vào Linux và không còn được hỗ trợ nữa.

    • 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 trước của Android đã truy xuất thông tin về áp lực từ ABS_MT_TOUCH_MAJOR. Hành vi cũ không tương thích với Thông số kỹ thuật của giao thức đầu vào Linux và không còn được hỗ trợ nữa.

    • Bạn phải báo cáo thông tin về kích thước cảm ứng 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 Thông số kỹ thuật của giao thức đầu vào Linux và không còn được hỗ trợ nữa.

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

Vận hành thiết bị cảm ứng

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

Hãy tham khảo các phần sau để biết thêm chi tiết về các tệp tham gia vào quá trình định 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.

Nguyên nhân là vì 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 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 khu vực 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ố các 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 với các ứng dụng vì chúng cần biết về kích thước thực tế và các đặc điểm khác của nút cảm biến trê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 cấu hình thiết bị đầu vào tệp để giải mã, biến đổi và chuẩn hoá các giá trị được báo cáo bằng thao tác chạm thiết bị thành một cách trình bày chuẩn đơn giản hơn mà các ứng dụng có thể hiểu được.

Quy ước của tài liệu

Đối với 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 biểu thị các giá trị thô được báo cáo bằng thao tác chạm trình điều khiển thiết bị 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 .
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 biểu thị giới hạn của các giá trị thô. Họ nhận được bằng cách gọi ioctl EVIOCGABS cho mỗi trục.

raw.*.min
Giá trị nhỏ nhất bao gồm của trục thô.
raw.*.max
Giá trị lớn nhất 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ụ: mờ = 1 ngụ ý rằng các giá trị có độ 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 điểm của hệ toạ độ đầu ra. Hệ thống sử dụng nội suy tuyến tính để dịch thông tin vị trí chạm từ đơn vị bề mặt mà thiết bị cảm ứng sử dụng vào thiết bị đầu ra đượ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 (được liên kết với màn hình), thao tác này sẽ là chiều rộng hiển thị 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 rằng không có nội suy sẽ được thực hiện.
output.height
Chiều cao đầu ra. Đối với màn hình cảm ứng (được liên kết với màn hình), thao tác này sẽ là chiều cao hiển thị 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 rằng không có nội suy thực hiện.
output.diag
Chiều 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 liên kết đầu vào bằng cách chạm sử dụng nhiều thuộc tính cấu hình trong thiết bị đầu vào tệp cấu hình để 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 dùng cho mục đích chung. Tất cả các thuộc tính khác được mô tả ở các phần sau cùng với các trường mà chúng được dùng để hiệu chỉnh.

Loại thiết bị cảm ứng

Đị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, thì thiết bị cảm ứng là màn hình cảm ứng được liên kết với một 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ột 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 màn hình được dùng để cử chỉ con trỏ nhiều điểm 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ề mức độ ảnh hưởng của loại thiết bị đế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, 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í chạm do thiết bị cảm ứng báo cáo sẽ được miễn trừ để hiển thị các thay đổi về hướng.

Giá trị mặc định là 1 nếu thiết bị có 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 cảm ứng và màn hình bên trong và bên ngoài. Màn hình cảm ứng bên trong có thể nhận biết hướng được xoay theo hướng của màn hình nội bộ. Màn hình cảm ứng bên ngoài nhận biết hướng đang xoay dựa vào hướng của màn hình ngoài.

Tính năng nhận biết hướng dùng để hỗ trợ tính năng xoay màn hình cảm ứng trên thiết bị chẳng hạn như Nexus One. Ví dụ: khi thiết bị xoay 90 độ theo chiều kim đồng hồ từ hướng tự nhiên, vị trí tuyệt đối của các thao tác nhấn sẽ được ánh xạ lại, khi bạn chạm vào góc trên cùng bên trái trong hệ thống toạ độ tuyệt đối trên màn hình cảm ứng được báo cáo là một thao tác chạm ở góc trên cùng bên trái trong hệ thống toạ độ xoay của màn hình. Việc này được thực hiện để các điểm chạm được báo cáo bằng cùng một hệ toạ độ mà các ứng dụng dùng để vẽ các thành phần hình ảnh.

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

Touch.gestureMode

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

Chỉ định chế độ trình bày cho các cử chỉ của 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 sẽ được biểu thị 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 sẽ được biểu thị bằng neo đại diện cho tâm của cử chỉ và một tập hợp các điểm tròn biểu thị 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 nếu không được đặt.

Trường X và Y

Trường X và Y cung cấp thông tin vị trí ở giữa vùng tiếp xúc.

Tính toán

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 là nội suy tuyến tính đến 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

chạm Major, chạmMinor, toolMajor, toolMinor, trường kích thước

Trường touchMajortouchMinor mô tả kích thước gần đúng diện tích tiếp xúc theo đơn vị đầu ra (pixel).

Trường 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 hoá của thao tác chạm tương ứng với điểm chạm lớn nhất có thể mà thiết bị cảm ứng có thể cảm nhận được. Nhỏ nhất kích thước chuẩn hoá có thể là 0 (không có tiếp xúc hoặc không thể đo lường) và giá trị lớn nhất kích thước chuẩn hóa có thể là 1.0 (khu vực cảm biến bị bão hòa).

Khi có thể đo cả chiều dài và chiều rộng gần đúng, thì touchMajor trường chỉ định kích thước dài và trường touchMinor chỉ định kích thước ngắn của khu vực liên hệ. Khi chỉ có thể đo đường kính gần đúng của diện tích tiếp xúc, thì trường touchMajortouchMinor bằng nhau.

Tương tự, trường toolMajor chỉ định kích thước dài hơn và toolMinor trường này 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 kích thước cảm ứng không có sẵn nhưng kích thước công cụ có sẵn, thì kích thước công cụ đượ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 có sẵn nhưng kích thước cảm ứng là có sẵn, thì kích thước cảm ứng sẽ được đặt bằng với kích thước công cụ.

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. Cách triển khai hiện tại hỗ trợ 3 kiểu đo lường: đường kính, diện tích và hộp giới hạn hình học tính theo đơn vị bề mặt.

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

Chỉ định loại phương pháp đo lường 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, kích thước được giả định là được chỉ định giống nhau đơn vị bề mặt làm vị trí, do đó nó được điều chỉnh theo tỷ lệ theo cùng cách.

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

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

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

chạm.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 dùng trong quá trình hiệu chuẩn.

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

chạm.size.bias

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

Chỉ định một giá trị độ chệch không đổi dùng trong quá trình hiệu chuẩn.

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

chạm.size.isSummed

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

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

  • Nếu giá trị là 1, thì kích thước được báo cáo sẽ chia cho số địa chỉ 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 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" Các thiết bị không thể phân biệt phương diện riêng của nhiều người liên hệ để họ báo cáo số đo kích thước biểu thị tổng diện tích hoặc chiều rộng. 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 nghi ngờ, hãy đặt giá trị này thành 0.

Tính toán

Kết quả tính toán của touchMajor, touchMinor, toolMajor, toolMinor! và size phụ thuộc vào các thông số hiệu chỉnh được 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 suất vật lý gần đúng á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 (áp suất bình thường).

Mức áp suất bằng 0 cho biết công cụ đang lơ lửng.

chạm.pressure.calibration

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

Chỉ định loại phương pháp đo lường 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, áp suất không xác định nên được đặt thành 1 khi chạm và 0.0 khi di chuột.

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

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

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

chạm.pressure.scale

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

Chỉ định hệ số tỷ lệ không đổi dùng trong quá trình hiệu chuẩn.

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

Tính toán

Cách tính toán trường pressure phụ thuộc vào các thông số hiệu chỉnh đã 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à trường nghiêng

Trường orientation mô tả hướng của thao tác chạm và công cụ phép đo góc. Hướng của 0 cho biết rằng trục chính là được định hướng theo chiều dọc, -PI/2 cho biết rằng trục chính được hướng về bên trái, PI/2 cho biết trục chính được định hướng sang bên phải. Khi bút cảm ứng có công cụ, phạm vi hướng có thể được mô tả trong phạm vi hình 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ụ nằm phẳng trên bề mặt.

Touch.Orientation.calibration

Định nghĩa: touch.orientation.calibration = none | interpolated | vector | default

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

Tính toán

Cách tính toán các trường orientationtilt phụ thuộc vào các tham số hiệu chỉnh được chỉ định và đầ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 khoảng cách

Trường distance mô tả khoảng cách giữa công cụ và thiết bị cảm ứng nền tảng. Giá trị 0,0 biểu thị sự liên hệ trực tiếp và giá trị lớn hơn biểu thị tăng khoảng cách từ bề mặt.

chạm.distance.calibration

Định nghĩa: touch.distance.calibration = none | scaled | default

Chỉ định loại phương pháp đo lường 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, khoảng cách là không xác định nên giá trị được đặt thành 0.

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

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

chạm.distance.scale

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

Chỉ định hệ số tỷ lệ không đổi dùng trong quá trình hiệu chuẩn.

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

Tính toán

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

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

Ghi chú về khả năng tương thích

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ả các tệp cấu hình thiết bị đầu vào cho thao tác chạm thiết bị phải được cập nhật để sử dụng các thuộc tính cấu hình mới.

Trình điều khiển thiết bị cảm ứng cũ có thể cũng cần phải được đã cập nhật.

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

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

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

Khi các khoá ảo được triển khai trong phần mềm, nhân hệ điều hành phải xuất một sơ đồ khoá ảo có tên là virtualkeys.<devicename> dưới dạng một thuộc tính bảng. 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 thiết bị là "Touchyfeely" sau đó tệp sơ đồ khoá ảo phải có đường dẫn /sys/board_properties/virtualkeys.touchyfeely.

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

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

Cú pháp

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

Các dòng nhận xét bắt đầu bằng "#" và tiếp tục đế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.
  • <Mã khoá Linux>: Mã khoá Linux của khoá ảo.
  • <centerX>: Toạ độ điểm ảnh X của tâm khoá ảo.
  • <centerY>: Toạ độ điểm ảnh Y của tâm khoá ảo.
  • <width>: Chiều rộng của khoá ảo tính bằng pixel.
  • <height>: Chiều cao của khoá ảo tính bằng pixel.

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

Dưới đây là tệp sơ đồ khoá ảo tất cả đượ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ể ghi cùng một tệp sơ đồ khoá ả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 khoá ảo có phần tử <centerY> là toạ độ 835, thấp hơn một chút khu vực hiển thị của màn hình cảm ứng.

Khoá đầu tiên có mã quét Linux là 158 (KEY_BACK), CenterX là 55, tâm Y của 835, chiều rộng 90 và chiều cao của 55.

Ví dụ

Tệp bản đồ khoá ả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 khoá: /system/usr/keylayout/touchyfeely.kl.

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

Tệp ánh xạ ký tự phím: /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 bằng một ngón tay: di chuyển con trỏ.
  • Chuyển động bằng một ngón tay cộng với nhấn nút: kéo con trỏ.
  • Di chuyển hai ngón tay theo cùng một hướng: kéo phần bên dưới con trỏ theo hướng đó. Con trỏ không tự di chuyển.
  • Chuyển động hai ngón tay cả hai ngón tay tiến về phía nhau hoặc tách ra các hướng khác nhau: xoay/thu nhỏ/xoay vùng xung quanh con trỏ. Con trỏ không tự di chuyển.
  • Chuyển động nhiều ngón tay: cử chỉ tuỳ ý.

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 bạn bật khung tích hợp. Các giải pháp nội bộ, được tạo tùy chỉnh vẫn được hỗ trợ, mặc dù chúng có thể cần được sửa đổi để trả về cờ TOOL_TYPE_PALM khi lòng bàn tay đã được phát hiện. Khung tích hợp cũng hoạt động cùng 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à các con trỏ xung quanh, sau đó xem xét khoảng cách từ cạnh hiển thị các điểm chạm. Sau đó, trên cơ sở mỗi con trỏ, AI sẽ xác định con trỏ nào là lòng bàn tay. Công cụ này cũng đưa vào tính đến kích thước của từng địa chỉ liên hệ, theo báo cáo của touchMajortouchMinor. Sau đó, khung Android sẽ xoá các con trỏ được đánh dấu là lòng bàn tay của bạn từ luồng chạm.

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

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

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

Nếu con trỏ tì tay không được gửi đến các ứ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 đây (các đơn vị là pixel/mm):
    • ABS_MT_POSITION_X
    • ABS_MT_POSITION_Y
    • ABS_MT_TOUCH_MAJOR
    • ABS_MT_TOUCH_MINOR

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

  2. Để xác nhận các trường đã được thiết lập chính xác, hãy chạy mã:
        $ adb shell getevent -li
    
  3. Để bật tính năng này trong thời gian chạy, hãy chạy mã:
        $ adb shell device_config put input_native_boot palm_rejection_enabled 1
    
  4. Khởi động lại quá 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ó những tính năng từ chối tì 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 đầu 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 init**rc tệp:

    setprop persist.device_config.input_native_boot.palm_rejection_enabled 1
    

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