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à những thiết bị cảm ứng được liên kết với một màn hình để người dùng có cảm giác như đang thao tác trực tiếp với các mục trên màn hình.
Bàn di chuột là thiết bị cảm ứng không 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ỉ.
Các thiết bị cảm ứng có thể có những 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 các 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.
Đôi khi, các thiết bị cảm ứng đượ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 viền màn hình và có hai mục đích sử dụng như một phần của bàn phím cảm ứng.
Do có rất nhiều thiết bị cảm ứng, Android dựa vào một số lượng lớn các thuộc tính cấu hình để mô tả đặ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
Một thiết bị đầu vào được phân loại là thiết bị cảm ứng đa điểm nếu cả hai điều kiện sau đều được đáp ứng:
- 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 nào của tay cầm chơi game. Điều kiện này giải quyết một điểm mơ hồ với một số tay cầm chơi game báo cáo các trục có mã trùng với mã của các trục MT.
Thiết bị đầu vào được phân loại là thiết bị một lần chạm nếu cả hai điều kiện sau đều được đáp ứng:
- Thiết bị đầu vào không được phân loại là thiết bị đa cảm ứng. Thiết bị đầu vào được phân loại là thiết bị một điểm chạm hoặc thiết bị đa điểm chạm, không bao giờ 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ã khoá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 đồ khoá ảo, thì tệp bố cục khoá cho thiết bị cũng sẽ được tải. Hãy tham khảo phần [Tệp bản đồ khoá ả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ả cá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 hoặc bàn di chuột HID qua 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ỳ sự hỗ trợ 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. 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ỏ. Các ngón tay được diễn giải 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 bạn đặt thuộc tính
touch.deviceType
, 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 ioctlEVIOCGPROP
), 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 quaEVIOCGPROP
ioctl), thì 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 các trục tương đối
REL_X
hoặcREL_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 một điểm mơ hồ cho 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 không dùng bàn di chuột để đ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 các 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 chế độ kiểm soát 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ư các nút chuột và chủ yếu được dùng với các thiết bị cảm ứng thuộc loại con trỏ hoặc với bút cảm ứng.
Các nút sau đây được hỗ trợ:
BTN_LEFT
: Được liên kết vớiMotionEvent.BUTTON_PRIMARY
.BTN_RIGHT
: Được liên kết vớiMotionEvent.BUTTON_SECONDARY
.BTN_MIDDLE
: Được liên kết vớiMotionEvent.BUTTON_MIDDLE
.BTN_BACK
vàBTN_SIDE
: Được liên kết vớiMotionEvent.BUTTON_BACK
. Khi nhấn nút này, hệ thống cũng sẽ tổng hợp một thao tác nhấn phím bằng mã khoáKeyEvent.KEYCODE_BACK
.BTN_FORWARD
vàBTN_EXTRA
: Được liên kết vớiMotionEvent.BUTTON_FORWARD
. Khi nhấn nút này, hệ thống cũng sẽ tổng hợp một thao tác nhấn phím bằng mã khoáKeyEvent.KEYCODE_FORWARD
.BTN_STYLUS
: Được liên kết vớiMotionEvent.BUTTON_SECONDARY
.BTN_STYLUS2
: Được liên kết vớiMotionEvent.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 các loại công cụ.
Ở 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ớiMotionEvent.TOOL_TYPE_FINGER
.BTN_TOOL_PEN
vàMT_TOOL_PEN
: Được liên kết vớiMotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_RUBBER
: Được liên kết vớiMotionEvent.TOOL_TYPE_ERASER
.BTN_TOOL_BRUSH
: Được liên kết vớiMotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_PENCIL
: Được liên kết vớiMotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_AIRBRUSH
: Được liên kết vớiMotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_MOUSE
: Được liên kết vớiMotionEvent.TOOL_TYPE_MOUSE
.BTN_TOOL_LENS
: Được liên kết vớiMotionEvent.TOOL_TYPE_MOUSE
.BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
vàBTN_TOOL_QUADTAP
: Được liên kết vớiMotionEvent.TOOL_TYPE_FINGER
.
Công cụ di chuột so với công cụ chạm
Các công cụ có thể tiếp xúc với thiết bị cảm ứng hoặc nằm trong phạm vi và lơ lửng phía trên thiết bị. Không phải thiết bị cảm ứng nào cũng có thể nhận biết 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ó tính năng này, chẳng hạn như bộ số hoá bút cảm ứng dựa trên tần số vô tuyến, 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ác công cụ chạm với các 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 các ứng dụng theo những cách khác nhau.
Các công cụ chạm được báo cáo cho ứng dụng dưới dạng sự kiện chạm bằng 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 các 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ã khoá cho các trục và nút mà chúng hỗ trợ. Việc đăng ký các trục hoặc mã khoá không được hỗ trợ có thể khiến thuật toán phân loại thiết bị bị nhầm lẫn hoặc khiến hệ thống phát hiện sai các chức năng của thiết bị. Ví dụ: nếu thiết bị báo cáo mã khoá
BTN_TOUCH
, hệ thống sẽ giả định rằngBTN_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ùngBTN_TOUCH
để cho biết rằng công cụ chỉ nằm trong phạm vi và đang di chuột. - Các thiết bị có chế độ một lần chạm sử dụng các sự kiện đầu vào sau đây của Linux:
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 khi 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ụ 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) Các trạng thái của nút Báo cáo.BTN_TOOL_FINGER
,BTN_TOOL_PEN
,BTN_TOOL_RUBBER
,BTN_TOOL_BRUSH
,BTN_TOOL_PENCIL
,BTN_TOOL_AIRBRUSH
,BTN_TOOL_MOUSE
,BTN_TOOL_LENS
,BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
,BTN_TOOL_QUADTAP
: (không bắt buộc) Báo cáo loại công cụ.
- Thiết bị đa cảm ứng sử dụng các sự kiện đầu vào sau đây của Linux:
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 khi chạm hoặc độ dài của chiều dài lớn hơn của điểm tiếp xúc khi 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ếuABS_MT_TOUCH_MAJOR
đang báo cáo một phép đ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 chiều dài lớn 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ụ. Không nên sử dụng trục này nếuABS_MT_WIDTH_MAJOR
đang báo cáo phép đo diện tích hoặc nếu không biết 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ụ với 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ụ dưới dạngMT_TOOL_FINGER
hoặcMT_TOOL_PEN
.ABS_MT_TRACKING_ID
: (không bắt buộc) Báo cáo mã nhận dạng theo dõi của công cụ. Mã theo dõi là một số nguyên tuỳ ý không âm, được dùng để xác định và theo dõi từng công cụ một cách độc lập 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ã nhận dạng theo dõi riêng biệt được 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ụ được liên kết với mã đó di chuyển ra ngoài phạm vi.ABS_MT_SLOT
: (không bắt buộc) Báo cáo mã nhận dạng khe cắm của công cụ khi sử dụng giao thức đa chạm "B" của Linux. Tham khảo tài liệu về giao thức cảm ứng đa điểm trên 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) Các trạng thái của nút Báo cáo.BTN_TOOL_FINGER
,BTN_TOOL_PEN
,BTN_TOOL_RUBBER
,BTN_TOOL_BRUSH
,BTN_TOOL_PENCIL
,BTN_TOOL_AIRBRUSH
,BTN_TOOL_MOUSE
,BTN_TOOL_LENS
,BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
,BTN_TOOL_QUADTAP
: (không bắt buộc) Báo cáo loại công cụ.
- Nếu bạn xác định các trục cho cả giao thức một lần chạm và nhiều lần chạm, thì chỉ các trục nhiều lần chạm được sử dụng và các 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 của 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 của thiết bị cảm ứng thực sự bao phủ màn hình.Đối với màn hình cảm ứng, hệ thống sẽ tự động nội suy các vị trí chạm được báo cáo theo đơn vị bề mặt để lấy vị trí chạm theo pixel hiển thị theo phép tính sau:
displayX = (x - minX) * displayWidth / (maxX - minX + 1) displayY = (y - minY) * displayHeight / (maxY - minY + 1)
Màn hình cảm ứng có thể báo cáo các thao tác chạm bên ngoài vùng hoạt động được báo cáo.
Những thao tác chạm bắt đầu bên ngoài vùng hoạt động sẽ không được chuyển đến các ứng dụng nhưng có thể dùng cho các khoá ảo.
Những thao tác chạm bắt đầu bên trong vùng hoạt động hoặc đi vào và thoát khỏi vùng hiển thị sẽ được chuyển đến các ứng dụng. Do đó, nếu một thao tác chạm bắt đầu trong phạm vi 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á phạm vi của màn hình. Đây là hành vi dự kiến.
Thiết bị cảm ứng không bao giờ được giới hạn toạ độ chạm trong phạm vi 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 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ì hệ thống 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 vùng hoạt động, màn hình cảm ứng sẽ bắt đầu báo cáo toạ độ 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 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 thoát khỏi ranh giới của vùng hiển thị.
Các giá trị do
ABS_PRESSURE
hoặcABS_MT_PRESSURE
báo cáo (nếu được báo cáo) phải khác 0 khi công cụ chạm vào thiết bị và bằng 0 nếu không để cho biết công cụ đang di chuột.Bạn không bắt buộc nhưng nên báo cáo thông tin về áp suất. Các ứng dụng có thể sử dụng thông tin về áp lực để triển khai tính năng 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ặcABS_MT_WIDTH_MINOR
báo cáo phải khác 0 khi công cụ chạm vào thiết bị và bằng 0 trong trường hợp khác, nhưng đây không phải là yêu cầu 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 khi chạm bằng ngón tay nhưng không đo được các điểm tiếp xúc khi chạm bằng bút cảm ứng.Bạn không bắt buộc nhưng nên báo cáo thông tin về kích thước. Các ứng dụng có thể sử dụng thông tin về áp lực để triển khai tính năng vẽ nhạy cảm với kích thước và các hiệu ứng khác.
Các giá trị do
ABS_DISTANCE
hoặcABS_MT_DISTANCE
báo cáo sẽ 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.Bạn không bắt buộc nhưng nên báo cáo thông tin về khoảng cách cho các thiết bị bút cảm ứng.
Các 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ụ đang đượ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 độ so với phương vuông góc. Điểm trung tâm (vuông góc hoàn toàn) được cho bởi
(max + min) / 2
cho mỗi trục. Các giá trị nhỏ hơn điểm trung tâm biểu thị độ nghiêng lên hoặc sang trái, các giá trị lớn hơn điểm trung tâm biểu thị độ nghiêng xuống hoặc sang phải.InputReader
chuyển đổi các thành phần độ nghiêng X và Y thành góc nghiêng vuông góc trong khoảng từ 0 đếnPI / 2
radian và góc định hướng phẳng trong khoảng từ-PI
đếnPI
radian. Cách biểu thị này dẫn đến 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.Bạn không bắt buộc nhưng nên báo cáo thông tin về độ nghiêng cho các thiết bị bút cảm ứng.
Nếu
ABS_MT_TOOL_TYPE
báo cáo loại công cụ, thì thông tin này sẽ thay thế mọi thông tin về loại công cụ doBTN_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ặcBTN_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ó chạm vào hay í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á, tức là công cụ này không còn tồn tại nữa.
- 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 cắm đang hoạt động. Khi khe cắm này bị xoá, công cụ sẽ không còn tồn tại nữa.
- 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ặcBTN_TOOL_LENS
, thì công cụ đó sẽ không di chuột, ngay cả khi một trong các điều kiện sau đây 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 suất, đồng thời áp suất được báo cáo là 0, thì tức là 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ã khoá
BTN_TOUCH
vàBTN_TOUCH
có giá trị bằng 0, thì công cụ sẽ di chuột.
- Nếu công cụ là
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 phải thay đổi trình điều khiển màn hình cảm ứng để tuân thủ quy cách giao thức đầu vào của 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 "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 chạm tiếp theo. Khi tất cả các công cụ không hoạt động (tất cả các ngón tay đều "lên"), trình điều khiển sẽ gửi một gói báo cáo đồng bộ hoá trống, chẳng hạn như
SYN_MT_REPORT
, sau đó làSYN_REPORT
.Các phiên bản Android trước đây dự kiến các sự kiện "lên" sẽ được báo cáo bằng cách gửi giá trị áp suất 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ợ nữa.
Bạn nên báo cáo thông tin về áp lực vật lý hoặc cường độ tín hiệu 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ợ nữa.- Thông tin về kích thước cảm ứng phải được báo cáo bằng
ABS_MT_TOUCH_MAJOR
.Các phiên bản 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ợ nữa.
Thao tác trên thiết bị cảm ứng
Sau đây là bản tóm tắt ngắn gọn về thao tác trên thiết bị cảm ứng trên Android.
EventHub
đọc các sự kiện thô từ trình điều khiểnevdev
.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ụ. Thao tác này cũng theo dõi trạng thái của nút.- Nếu BACK hoặc FORWARD được nhấn hoặc nhả,
InputReader
sẽ thông báo choInputDispatcher
về sự kiện chính. InputReader
xác định xem có xảy ra thao tác nhấn phím ảo hay không. Nếu có, thìInputDispatcher
sẽ thông báo về sự kiện chính.InputReader
xác định xem thao tác chạm có được bắt đầu trong phạm vi của màn hình hay không. Nếu có, nó sẽ thông báo choInputDispatcher
về sự kiện chạm.- 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,
InputReader
sẽ thông báo choInputDispatcher
về sự kiện di chuột. - Nếu loại thiết bị cảm ứng là con trỏ,
InputReader
sẽ thực hiện phát hiện cử chỉ con trỏ, di chuyển con trỏ và phát hiện các điểm tương ứng, đồng thời thông báo choInputDispatcher
về sự kiện con trỏ. InputDispatcher
sử dụngWindowManagerPolicy
để xác định xem các sự kiện có được gửi đi hay không và liệu chúng có đánh thức thiết bị hay không. Sau đó,InputDispatcher
sẽ gử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ằng 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 đồ khoá ảo và bố cục khoá 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ề những 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 là trình điều khiển thiết bị cho các thiết bị cảm ứng thường báo cáo đặc điểm của các 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 diện tích tiếp xúc cảm ứng bằng cách sử dụng một tỷ lệ 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 trên thiết bị cảm ứng.
Hệ thống sử dụng các thông số hiệu chuẩn đượ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 biểu diễn tiêu chuẩn đơn giản hơn mà các ứng dụng có thể hiểu được.
Quy ước về tài liệu
Để phục vụ mục đích lập 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 chuẩn.
Giá trị trục thô
Các biểu thức sau đây biểu thị các giá trị thô do trình điều khiển thiết bị cảm ứng báo cáo dưới dạng sự kiện EV_ABS
.
raw.x
- Giá trị của trục
ABS_X
hoặcABS_MT_POSITION_X
. raw.y
- Giá trị của trục
ABS_Y
hoặcABS_MT_POSITION_Y
. raw.pressure
- Giá trị của trục
ABS_PRESSURE
hoặcABS_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ặcraw.touchMajor
nếu không có sẵn. raw.toolMajor
- Giá trị của trục
ABS_TOOL_WIDTH
hoặcABS_MT_WIDTH_MAJOR
, hoặc 0 nếu không có. raw.toolMinor
- Giá trị của trục
ABS_MT_WIDTH_MINOR
hoặcraw.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ặcABS_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ị giới hạn của các giá trị thô. Chúng được lấy bằng cách gọi EVIOCGABS
ioctl cho từng trục.
raw.*.min
- Giá trị tối thiểu bao gồm của trục thô.
raw.*.max
- Giá trị tối đa bao gồm của trục thô.
raw.*.range
- Tương đương với
raw.*.max - raw.*.min
. raw.*.fuzz
- Độ chính xác của trục thô. Ví dụ: fuzz = 1 ngụ ý rằng các giá trị chính xác đến +/- 1 đơn vị.
raw.width
- Chiều rộng bao gồm của vùng chạm, tương đương với
raw.x.range + 1
. raw.height
- Chiều cao bao gồm của 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 điểm của hệ toạ độ đầu ra. Hệ thống sử dụng phép nội suy tuyến tính để chuyển thông tin về vị trí chạm từ các đơn vị bề mặt mà thiết bị cảm ứng sử dụng thành 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 các 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ó hoạt động 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ó hoạt động 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 liên kết dữ liệu đầu vào bằng thao tác 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 các giá trị hiệu chuẩn. Bảng sau đây mô tả một số thuộc tính cấu hình cho mục đích chung. Tất cả các thuộc tính khác đều được mô tả trong các phần sau đây cùng với các trường mà chúng được dùng để hiệu chỉnh.
touch.deviceType
Định nghĩa: touch.deviceType
= touchScreen
|
touchPad
| pointer
| default
Chỉ định loại thiết bị cảm ứng.
-
Nếu giá trị là
touchScreen
, 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à một 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à một 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ử chỉ con trỏ đ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ả cá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 màn hình hay không.
-
Nếu giá trị là
1
, 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 màn hình thay đổi. -
Nếu giá trị là
0
, thì các vị trí chạm do thiết bị cảm ứng báo cáo sẽ không bị ảnh hưởng bởi các thay đổi về hướng màn hình.
Giá trị mặc định là 1
nếu thiết bị là màn hình cảm ứng, 0
nếu không.
Hệ thống phân biệt giữa màn hình cảm ứng và màn hình trong và ngoài. Màn hình cảm ứng bên trong có 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 có nhận biết hướng sẽ xoay dựa trên hướng của màn hình ngoài.
Tính năng 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ị xoay 90 độ theo chiều kim đồng hồ so với hướng tự nhiên, các vị trí tuyệt đối của 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. Điều này được thực hiện để các lượt 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 phần tử trực quan.
Trước Honeycomb, tất cả các thiết bị cảm ứng đều được giả định là có nhận biết hướng.
touch.gestureMode
Định nghĩa: touch.gestureMode
= pointer
| spots
|
default
Chỉ định chế độ trình bày cho cử chỉ bằng con trỏ. Thuộc tính cấu hình này chỉ liên quan 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 trình bày bằng con trỏ tương tự như con trỏ chuột. -
Nếu giá trị là
spots
, thì các cử chỉ trên bàn di chuột sẽ được trình bày bằng một tâm điểm đạ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 bạn đặt thuộc tính đầu vào INPUT_PROP_SEMI_MT
hoặc spots
.
Trường X và Y
Các trường X và Y cung cấp thông tin về vị trí cho tâm của vùng tiếp xúc.
Tính toán
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
các trường touchMajor, touchMinor, toolMajor, toolMinor, size
Các 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).
Các 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 đượ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, 0 (không có điểm 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,0 (vùng cảm biến đã bão hoà).
Khi có thể đo 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ỉ đo được đường kính ước chừ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 kích thước chạm không có nhưng kích thước công cụ 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 kích thước công cụ không có nhưng kích thước chạm có, 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ủa thao tác chạm và kích thước của 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 theo đơn vị diện tích.
Định nghĩa: 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 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 được chia tỷ lệ theo cách tương tự. -
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 chế độ hiệu chuẩngeometric
nếu có trụcraw.touchMajor
hoặcraw.toolMajor
, nếu không, hệ thống sẽ sử dụng chế độ hiệu chuẩnnone
.
touch.size.scale
Định nghĩa: touch.size.scale
= <một số thực dấu phẩy động không âm>
Chỉ định một hệ số tỷ lệ không đổi được dùng trong quá trình hiệu chuẩn.
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 một giá trị độ lệch không đổi được dùng trong quá trình hiệu chuẩn.
Giá trị mặc định là 0.0
.
touch.size.isSummed
Định nghĩa: touch.size.isSummed
= 0
| 1
Chỉ định xem kích thước được báo cáo là tổng kích thước của tất cả các số liên hệ đang hoạt động hay được báo cáo riêng cho từng số 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, chúng báo cáo một 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 những thiết bị như vậy. Nếu không chắc chắn, hãy đặt giá trị này thành 0
.
Tính toán
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 chuẩn đượ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 lực vật lý gần đúng được áp dụng cho thiết bị cảm ứng dưới dạng giá trị được chuẩn hoá trong khoảng từ 0,0 (không chạm) đến 1,0 (áp lực bình thường).
Áp lực bằng 0 cho biết công cụ đang lơ lửng.
touch.pressure.calibration
Định nghĩa: touch.pressure.calibration
= none
|
physical
| amplitude
| default
Chỉ định loại phép đo mà trình điều khiển cảm ứng dùng để báo cáo áp suất.
-
Nếu giá trị là
none
, thì áp suất không xác định nên được đặt thành 1.0 khi chạm và 0.0 khi di chuột. -
Nếu giá trị là
physical
, thì trục áp suất được giả định là đo cường độ áp suất vật lý thực tế được á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 chế độ hiệu chuẩnphysical
nếu có trục áp suất, nếu không, hệ thống sẽ sử dụngnone
.
touch.pressure.scale
Định nghĩa: touch.pressure.scale
= <một số thực dấu phẩy động không âm>
Chỉ định một hệ số tỷ lệ không đổi được 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
Việc tính toán trường pressure
phụ thuộc vào các thông số hiệu chuẩn đã 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
các 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 phép đ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 trái, PI/2
cho biết trục chính được định hướng sang phải. Khi có công cụ bút cảm ứng, bạn có thể mô tả phạm vi hướng 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 phép đ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ày đang 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ép đo mà trình điều khiển cảm ứng dùng để báo cáo hướng.
- Nếu giá trị là
none
, thì hướng không xác định 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ạ đến-PI/2
và giá trị thôraw.orientation.max
ánh xạ đếnPI/2
. Giá trị trung tâm của(raw.orientation.min + raw.orientation.max) / 2
liên kết với0
. - Nếu giá trị là
vector
, thì hướng được diễn giải là một vectơ được đóng gói bao gồm 2 trường 4 bit đã ký. Biểu thị 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ẽ tạo ra một góc hướng và độ lớn tin cậy. Độ lớn của độ tin cậy được dùng để điều chỉnh thông tin 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 chế độ hiệu chuẩninterpolated
nếu có trục hướng, nếu không, hệ thống sẽ sử dụngnone
.
Tính toán
Việc tính toán các trường orientation
và tilt
phụ thuộc vào các thông số hiệu chuẩn được 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 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.0 cho biết tiếp xúc trực tiếp và các giá trị lớn hơn cho biết khoảng cách tăng dần từ bề mặt.
touch.distance.calibration
Định nghĩa: touch.distance.calibration
= none
|
scaled
| default
Chỉ định loại phép đo mà trình điều khiển cảm ứng dùng để báo cáo khoảng cách.
-
Nếu giá trị là
none
, thì khoảng cách sẽ 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ẽ 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 chế độ hiệu chuẩnscaled
nếu có trục khoảng cách, nếu không, hệ thống sẽ sử dụngnone
.
touch.distance.scale
Định nghĩa: touch.distance.scale
= <một số thực dấu phẩy động không âm>
Chỉ định một hệ số tỷ lệ không đổi được dùng trong quá trình hiệu chuẩn.
Giá trị mặc định là 1.0
.
Tính toán
Việc tính toán trường distance
phụ thuộc vào các thông số hiệu chuẩn đã 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
Ghi chú 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 4.0 Ice Cream Sandwich. Bạn phải cập nhật tất cả các tệp cấu hình thiết bị đầu vào cho thiết bị cảm ứng để 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 sơ đồ 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 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 phím ảo bằng cách đặt các thanh ghi phần sụn. Đôi khi, bạn nên thực hiện việc ánh xạ từ toạ độ chạm đến mã khoá trong phần mềm.
Khi các khoá ảo được triển khai trong phần mềm, nhân phải xuất một tệp bản đồ khoá ảo có tên là virtualkeys.<devicename>
dưới dạng một thuộc tính của 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 là "touchyfeely" thì tệp bản đồ khoá ảo phải có đường dẫn /sys/board_properties/virtualkeys.touchyfeely
.
Tệp bản đồ khoá ả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 bản đồ khoá ảo, phải có một tệp bố cục khoá và tệp bản đồ ký tự khoá tương ứng để ánh xạ mã khoá 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 bản đồ khoá ảo là một tệp văn bản thuần tuý bao gồm một chuỗi nội dung mô tả bố cục khoá ảo, được phân tách bằng dấu xuống dòng 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 đến cuối dòng.
Mỗi khoá ảo được mô tả bằng 6 thành phần 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ã khoá Linux của khoá ảo.
- <centerX>: Toạ độ X (tính bằng pixel) của tâm khoá ảo.
- <centerY>: Toạ độ Y (tính bằng pixel) 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ả các toạ độ và kích thước đều được chỉ định theo hệ toạ độ hiển thị.
Sau đây là một tệp bản đồ 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ể ghi cùng một tệp bản đồ 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 đều có toạ độ <centerY> là 835, thấp hơn một chút so với vùng có thể nhìn thấy 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
, centerY là 835
, chiều rộng là 90
và chiều cao là 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 bản đồ ký tự khoá: /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 sẽ 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 kết hợp với thao tác nhấn nút: kéo con trỏ.
- Chuyển động bằng hai ngón tay (cả hai ngón tay di chuyển cùng hướng): kéo vùng bên dưới con trỏ theo hướng đó. Bản thân con trỏ không di chuyển.
- Chuyển động bằng hai ngón tay, cả hai ngón tay di chuyển về phía nhau hoặc tách rời nhau theo các hướng khác nhau: di chuyển/thu phóng/xoay khu vực 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ỉ tuỳ ý.
Tính năng chống tì tay
Kể từ Android 13, hệ thống có thể tự động từ chối các thao tác đầ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 tuỳ chỉnh nội bộ vẫn được hỗ trợ, mặc dù có thể bạn cần 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 này 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à tại các con trỏ xung quanh, sau đó xem xét khoảng cách từ các lượt chạm đến cạnh màn hình.
Sau đó, hệ thống sẽ xác định, dựa trên từng con trỏ, con trỏ nào là lòng bàn tay. Thao tác này cũng tính đến kích thước của từng số liên hệ, theo báo cáo của touchMajor
và touchMinor
. Sau đó, khung Android sẽ xoá những con trỏ được đánh dấu là lòng bàn tay khỏi luồng cảm ứng.
Nếu một con trỏ đã được gửi đến các ứ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 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 các ứng dụng, thì hệ thống sẽ chỉ cần thả con trỏ.
Bật tính năng chống tì tay
- 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ợ tính năng này, hãy đảm bảo bạn đã đặt đúng độ phân giải. - Để xác nhận rằng các trường được đặt đúng cách, hãy chạy:
$ adb shell getevent -li
- Để 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
- Khởi động lại quy trình
system_server
.$ adb shell stop && adb shell start
- Xác nhận rằng
adb shell dumpsys input
cho thấy có các bộ phận chống tì tay bên trongUnwantedInteractionBlocker
. 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ể bị đị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: {} - Để 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
:setprop persist.device_config.input_native_boot.palm_rejection_enabled 1