Android hỗ trợ nhiều loại màn hình cảm ứng và bàn di chuột, bao gồm cả máy tính bảng số hóa dựa trên bút cảm ứng.
Màn hình cảm ứng là thiết bị cảm ứng được liên kết với màn hình sao cho người dùng có cảm giác 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 được liên kết với màn hình, chẳng hạn như máy tính bảng số hóa. Bàn di chuột thường được sử dụng để trỏ hoặc để định vị gián tiếp tuyệt đối hoặc điều khiển giao diện người dùng dựa trên cử chỉ.
Thiết bị cảm ứng có thể có các nút có chức năng tương tự như nút chuột.
Các thiết bị cảm ứng đôi khi có thể được điều khiển bằng nhiều công cụ khác nhau như ngón tay hoặc bút cảm ứng tùy thuộc vào công nghệ cảm biến cảm ứng cơ bản.
Các thiết bị cảm ứng đôi khi được sử dụng để thực hiện các phím ảo. Ví dụ: trên một số thiết bị Android, vùng cảm biến của màn hình cảm ứng mở rộng ra ngoài mép màn hình và phục vụ mục đích kép như một phần của bàn phím cảm ứng.
Do có rất nhiều loại thiết bị cảm ứng, Android dựa vào một số lượng lớn các thuộc tính cấu hình để mô tả các đặc điểm và hành vi mong muốn của từng thiết bị.
Phân loại thiết bị cảm ứng
Thiết bị đầu vào được phân loại là thiết bị cảm ứng đa điểm nếu đáp ứng cả hai điều kiện sau:
- Thiết bị đầu vào báo cáo sự hiện diện của trục tuyệt đối
ABS_MT_POSITION_X
vàABS_MT_POSITION_Y
. - Thiết bị đầu vào không có bất kỳ nút gamepad nào. Điều kiện này giải quyết sự mơ hồ với một số gamepad nhất định báo cáo các trục có mã chồng lên các trục MT.
Thiết bị đầu vào được phân loại là thiết bị chạm một lần nếu đáp ứng cả hai điều kiện sau:
- Thiết bị đầu vào không được phân loại là thiết bị cảm ứng đa điểm. Thiết bị đầu vào được phân loại là thiết bị cảm ứng đơn hoặc thiết bị cảm ứng đa điểm, không bao giờ được phân loại là cả hai.
- Thiết bị đầu vào báo cáo sự hiện diện của trục tuyệt đối
ABS_X
vàABS_Y
cũng như sự hiện diện của mã khóaBTN_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 thử tải tệp bản đồ phím ảo cho thiết bị đó. Nếu có sơ đồ phím ảo thì file bố cục phím cho thiết bị cũng được tải. Tham khảo [Tệp bản đồ khóa ả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 tải file cấu hình thiết bị đầu vào cho thiết bị cảm ứng.
Tất cả các thiết bị cảm ứng tích hợp phải có tệp cấu hình thiết bị đầu vào. Nếu không có tệp cấu hình thiết bị đầu vào, hệ thống sẽ chọn cấu hình mặc định phù hợp với các thiết bị ngoại vi cảm ứng đa năng như màn hình cảm ứng hoặc miếng cảm ứng USB hoặc Bluetooth HID bên ngoài. Những 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ỏ .
- Một thiết bị màn hình cảm ứng được sử dụng để thao tác trực tiếp với các vật thể trên màn hình. Người dùng chạm trực tiếp vào màn hình, do đó hệ thống không yêu cầu bất kỳ khả năng bổ sung nào để chỉ ra các đối tượng đang được thao tác.
- Thiết bị bàn di chuột được sử dụng để cung cấp thông tin định vị tuyệt đối cho ứng dụng về các lần chạm trên một vùng cảm biến nhất định. Nó có thể hữu ích cho máy tính bảng số hóa.
- Thiết bị con trỏ được sử dụng để thao tác gián tiếp các đối tượng trên màn hình bằng con trỏ. Ngón tay được hiểu là cử chỉ con trỏ cảm ứng đa điể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 các vị trí tuyệt đối. Xem Cử chỉ con trỏ đa chạm gián tiếp để biết thêm thông tin.
Các quy tắc sau đây được sử dụng để phân loại thiết bị đầu vào là màn hình cảm ứng, bàn di chuột hoặc thiết bị con trỏ.
- Nếu thuộc tính
touch.deviceType
được đặt thì loại thiết bị sẽ được đặt như được chỉ định. - Nếu thiết bị đầu vào báo cáo sự hiện diện của thuộc tính đầu vào
INPUT_PROP_DIRECT
(thông quaEVIOCGPROP
ioctl), thì loại thiết bị được đặt thành màn hình cảm ứng . Điều kiện này giả định rằng các thiết bị cảm ứng đầu vào trực tiếp được gắn vào màn hình cũng được kết nối. - Nếu thiết bị đầu vào báo cáo sự hiện diện của thuộc tính đầu vào
INPUT_PROP_POINTER
(thông 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 trục tương đối
REL_X
hoặcREL_Y
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ự mơ hồ đối với các thiết bị đầu vào bao gồm cả chuột và bàn di chuột. Trong trường hợp này, bàn di chuột không được sử dụng để điều khiển con trỏ vì chuột đã điều khiển nó rồi. - Nếu không, loại thiết bị được đặt thành con trỏ . Mặc định này đảm bảo rằng các miếng cảm ứng chưa được chỉ định cho bất kỳ mục đích đặc biệt nào khác sẽ điều khiển con trỏ.
nút
Nút là các điều khiển tùy chọn mà ứng dụng có thể sử dụng để thực hiện các chức năng bổ sung. Các nút trên thiết bị cảm ứng hoạt động tương tự như nút chuột và chủ yếu được sử dụng với các thiết bị cảm ứng loại con trỏ hoặc bút stylus.
Các nút sau được hỗ trợ:
-
BTN_LEFT
: Được ánh xạ tớiMotionEvent.BUTTON_PRIMARY
. -
BTN_RIGHT
: Được ánh xạ tớiMotionEvent.BUTTON_SECONDARY
. -
BTN_MIDDLE
: Được ánh xạ tớiMotionEvent.BUTTON_MIDDLE
. -
BTN_BACK
vàBTN_SIDE
: Được ánh xạ tớiMotionEvent.BUTTON_BACK
. Nhấn nút này cũng tổng hợp một phím nhấn có mã khóaKeyEvent.KEYCODE_BACK
. -
BTN_FORWARD
vàBTN_EXTRA
: Được ánh xạ tớiMotionEvent.BUTTON_FORWARD
. Nhấn nút này cũng tổng hợp một phím nhấn có mã khóaKeyEvent.KEYCODE_FORWARD
. -
BTN_STYLUS
: Được ánh xạ tớiMotionEvent.BUTTON_SECONDARY
. -
BTN_STYLUS2
: Được ánh xạ tớiMotionEvent.BUTTON_TERTIARY
.
Công cụ và loại công cụ
Công cụ là ngón tay, bút stylus hoặc thiết bị khác được sử dụng để tương tác với thiết bị cảm ứng. Một số thiết bị cảm ứng có thể phân biệt được các loại công cụ khác nhau.
Ở những nơi khác trong Android, như trong API MotionEvent
, một công cụ thường được gọi là con trỏ .
Các loại công cụ sau được hỗ trợ:
-
BTN_TOOL_FINGER
vàMT_TOOL_FINGER
: Được ánh xạ tớiMotionEvent.TOOL_TYPE_FINGER
. -
BTN_TOOL_PEN
vàMT_TOOL_PEN
: Được ánh xạ tớiMotionEvent.TOOL_TYPE_STYLUS
. -
BTN_TOOL_RUBBER
: Được ánh xạ tớiMotionEvent.TOOL_TYPE_ERASER
. -
BTN_TOOL_BRUSH
: Được ánh xạ tớiMotionEvent.TOOL_TYPE_STYLUS
. -
BTN_TOOL_PENCIL
: Được ánh xạ tớiMotionEvent.TOOL_TYPE_STYLUS
. -
BTN_TOOL_AIRBRUSH
: Được ánh xạ tớiMotionEvent.TOOL_TYPE_STYLUS
. -
BTN_TOOL_MOUSE
: Được ánh xạ tớiMotionEvent.TOOL_TYPE_MOUSE
. -
BTN_TOOL_LENS
: Được ánh xạ tớiMotionEvent.TOOL_TYPE_MOUSE
. -
BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
vàBTN_TOOL_QUADTAP
: Được ánh xạ tớiMotionEvent.TOOL_TYPE_FINGER
.
Công cụ di chuột và chạm
Các công cụ có thể tiếp xúc với thiết bị cảm ứng hoặc trong phạm vi và lơ lửng phía trên thiết bị. Không phải tất cả các thiết bị cảm ứng đều có thể cảm nhận được sự hiện diện của một công cụ lơ lửng phía trên thiết bị cảm ứng. Những thiết bị làm được điều đó, chẳng hạn như bộ số hóa bút cảm ứng dựa trên RF, thường có thể phát hiện khi công cụ này nằm trong phạm vi giới hạn của bộ số hóa.
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ự như vậy, các công cụ chạm và công cụ di chuột được báo cáo tới ứng dụng theo những cách khác nhau.
Công cụ chạm được báo cáo tới ứng dụng dưới dạng sự kiện chạm bằng cách sử dụng MotionEvent.ACTION_DOWN
, MotionEvent.ACTION_MOVE
, MotionEvent.ACTION_DOWN
, MotionEvent.ACTION_POINTER_DOWN
và MotionEvent.ACTION_POINTER_UP
.
Các công cụ di chuột được báo cáo tới ứ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 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ã khóa cho các trục và nút mà chúng hỗ trợ. Việc đăng ký các trục hoặc mã khóa không được hỗ trợ có thể gây nhầm lẫn cho thuật toán phân loại thiết bị hoặc khiến hệ thống phát hiện không chính xác các khả năng của thiết bị. Ví dụ: nếu thiết bị báo cáo mã khóa
BTN_TOUCH
, hệ thống sẽ giả định rằngBTN_TOUCH
luôn được sử dụng để cho biết liệu công cụ có chạm vào màn hình hay không. Do đó, không nên sử dụngBTN_TOUCH
để chỉ ra rằng công cụ này chỉ nằm trong phạm vi và di chuột. - Các thiết bị một chạm sử dụng các sự kiện nhập Linux sau:
-
ABS_X
: (BẮT BUỘC) Báo cáo tọa độ X của dao. -
ABS_Y
: (BẮT BUỘC) Báo cáo tọa độ Y của dao. -
ABS_PRESSURE
: (tùy chọn) Báo cáo áp suất vật lý tác dụng lên đầu dụng cụ hoặc cường độ tín hiệu của tiếp điểm cảm ứng. -
ABS_TOOL_WIDTH
: (tùy chọn) Báo cáo diện tích mặt cắt ngang hoặc chiều rộng của điểm tiếp xúc cảm ứng hoặc của chính dụng cụ. -
ABS_DISTANCE
: (tùy chọn) Báo cáo khoảng cách từ dụng cụ đến bề mặt của thiết bị cảm ứng. -
ABS_TILT_X
: (tùy chọn) Báo cáo độ nghiêng của dụng cụ so với bề mặt của thiết bị cảm ứng dọc theo trục X. -
ABS_TILT_Y
: (tùy chọn) Báo cáo độ nghiêng của dụng cụ so với bề mặt của thiết bị cảm ứng dọc theo trục Y. -
BTN_TOUCH
: (BẮT BUỘC) Cho biết công cụ có chạm vào thiết bị hay không. -
BTN_LEFT
,BTN_RIGHT
,BTN_MIDDLE
,BTN_BACK
,BTN_SIDE
,BTN_FORWARD
,BTN_EXTRA
,BTN_STYLUS
,BTN_STYLUS2
: (tùy chọn) Trạng thái nút báo cáo. -
BTN_TOOL_FINGER
,BTN_TOOL_PEN
,BTN_TOOL_RUBBER
,BTN_TOOL_BRUSH
,BTN_TOOL_PENCIL
,BTN_TOOL_AIRBRUSH
,BTN_TOOL_MOUSE
,BTN_TOOL_LENS
,BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
,BTN_TOOL_QUADTAP
(tùy chọn) Báo cáo loại công cụ .
-
- Các thiết bị cảm ứng đa điểm sử dụng các sự kiện nhập Linux sau:
-
ABS_MT_POSITION_X
: (BẮT BUỘC) Báo cáo tọa độ X của dao. -
ABS_MT_POSITION_Y
: (BẮT BUỘC) Báo cáo tọa độ Y của công cụ. -
ABS_MT_PRESSURE
: (tùy chọn) Báo cáo áp suất vật lý tác dụng lên đầu dụng cụ hoặc cường độ tín hiệu của điểm tiếp xúc cảm ứng. -
ABS_MT_TOUCH_MAJOR
: (tùy chọn) Báo cáo diện tích mặt cắt ngang của tiếp điểm cảm ứng hoặc chiều dài của chiều dài hơn của tiếp điểm cảm ứng. -
ABS_MT_TOUCH_MINOR
: (tùy chọn) Báo cáo chiều dài của kích thước ngắn hơn của tiếp điểm cảm ứng. Không nên sử dụng trục này nếuABS_MT_TOUCH_MAJOR
đang báo cáo số đo diện tích. -
ABS_MT_WIDTH_MAJOR
: (tùy chọn) Báo cáo diện tích mặt cắt ngang của chính dụng cụ đó hoặc chiều dài của chiều dài hơn của chính dụng cụ đó. Không sử dụng trục này trừ khi bạn biết kích thước của dụng cụ. -
ABS_MT_WIDTH_MINOR
: (tùy chọn) 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 số đo diện tích hoặc nếu không xác định được kích thước của chính công cụ. -
ABS_MT_ORIENTATION
: (tùy chọn) Báo cáo hướng của dao. -
ABS_MT_DISTANCE
: (tùy chọn) Báo cáo khoảng cách từ dụng cụ đến bề mặt của thiết bị cảm ứng. -
ABS_MT_TOOL_TYPE
: (tùy chọn) Báo cáo loại công cụ làMT_TOOL_FINGER
hoặcMT_TOOL_PEN
. -
ABS_MT_TRACKING_ID
: (tùy chọn) Báo cáo ID theo dõi của công cụ. ID theo dõi là một số nguyên không âm tùy ý được sử dụng để xác định và theo dõi từng công cụ một cách độc lập khi nhiều công cụ 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 ID theo dõi riêng biệt được sử dụng miễn là ngón tay đó vẫn tiếp xúc. ID theo dõi có thể được sử dụng lại khi các công cụ liên quan của chúng di chuyển ra ngoài phạm vi. -
ABS_MT_SLOT
: (tùy chọn) Báo cáo ID khe của công cụ, khi sử dụng giao thức cảm ứng đa điểm 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ó chạm vào thiết bị hay không. -
BTN_LEFT
,BTN_RIGHT
,BTN_MIDDLE
,BTN_BACK
,BTN_SIDE
,BTN_FORWARD
,BTN_EXTRA
,BTN_STYLUS
,BTN_STYLUS2
: (tùy chọn) Trạng thái nút báo cáo. -
BTN_TOOL_FINGER
,BTN_TOOL_PEN
,BTN_TOOL_RUBBER
,BTN_TOOL_BRUSH
,BTN_TOOL_PENCIL
,BTN_TOOL_AIRBRUSH
,BTN_TOOL_MOUSE
,BTN_TOOL_LENS
,BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
,BTN_TOOL_QUADTAP
(tùy chọn) Báo cáo loại công cụ .
-
- Nếu các trục cho cả giao thức chạm một lần và chạm đa điểm được xác định thì chỉ các trục chạm đa điểm được sử dụng và các trục chạm đơn sẽ bị bỏ qua.
Các 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 giới hạn của vùng hoạt động của thiết bị trong các đơn vị bề mặt dành riêng cho thiết bị. Trong trường hợp màn hình cảm ứng, vùng hoạt động mô tả phần thiết bị cảm ứng thực sự bao phủ màn hình.Đối với màn hình cảm ứng, hệ thống sẽ tự động nội suy các vị trí cảm ứng được báo cáo theo đơn vị bề mặt để thu được vị trí cảm ứng trong các pixel hiển thị theo phép tính sau:
displayX = (x - minX) * displayWidth / (maxX - minX + 1) displayY = (y - minY) * displayHeight / (maxY - minY + 1)
Màn hình cảm ứng có thể báo cáo các lần chạm bên ngoài vùng hoạt động được báo cáo.
Các thao tác chạm được thực hiện bên ngoài vùng hoạt động sẽ không được gửi tới ứng dụng nhưng có thể được sử dụng cho các phím ảo.
Các thao tác chạm được bắt đầu bên trong vùng hoạt động hoặc vào và ra khỏi vùng hiển thị sẽ được gửi tới ứng dụng. Do đó, nếu một thao tác chạm bắt đầu trong giới hạn của ứng dụng và sau đó di chuyển ra ngoài vùng hoạt động, thì ứng dụng có thể nhận được các sự kiện chạm có tọa độ hiển thị âm hoặc vượt quá giới hạn của màn hình. Đây là hành vi được mong đợi.
Thiết bị cảm ứng không bao giờ được kẹp tọa độ cảm ứng vào giới hạn của vùng hoạt động. Nếu một thao tác chạm thoát khỏi vùng hoạt động, thao tác chạm đó sẽ được báo cáo là nằm ngoài vùng hoạt động hoặc hoàn toàn không được báo cáo.
Ví dụ: nếu ngón tay của người dùng chạm vào gần góc trên cùng bên trái của màn hình cảm ứng, nó có thể báo cáo tọa độ (minX, minY). Nếu ngón tay tiếp tục di chuyển xa hơn ra ngoài vùng hoạt động, màn hình cảm ứng sẽ bắt đầu báo cáo tọa độ với các thành phần nhỏ hơn minX và minY, chẳng hạn như (minX - 2, minY - 3) hoặc sẽ dừng hoàn toàn báo cáo lần chạm. Nói cách khác, màn hình cảm ứng sẽ không 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 tọa độ cảm ứng vào cạnh màn hình sẽ tạo ra một ranh giới cứng nhân tạo xung quanh mép màn hình, ngăn hệ thống theo dõi trơn tru các chuyển động đi vào hoặc thoát ra khỏi giới hạn của khu vực hiển thị.
Các giá trị được báo cáo bởi
ABS_PRESSURE
hoặcABS_MT_PRESSURE
, nếu chúng đượ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 thì để biểu thị rằng công cụ đang di chuyển.Việc báo cáo thông tin về áp lực là tùy chọn nhưng được khuyến khích thực hiện. Ứng dụng có thể sử dụng thông tin áp suất để triển khai bản vẽ nhạy á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ặcABS_MT_WIDTH_MINOR
phải khác 0 khi công cụ chạm vào thiết bị và bằng 0 nếu không, nhưng điều này không bắt buộc. Ví dụ: thiết bị cảm ứng có thể đo được 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 thể đo được các điểm tiếp xúc khi chạm vào bút cảm ứng.Thông tin về kích thước báo cáo là tùy chọn nhưng được khuyến khích sử dụng. Ứng dụng có thể sử dụng thông tin áp lực để triển khai bản vẽ có kích thước nhạy cảm và các hiệu ứng khác.
Các giá trị được báo cáo bởi
ABS_DISTANCE
hoặcABS_MT_DISTANCE
sẽ gần bằng 0 khi dụ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. Các giá trị chính xác được báo cáo phụ thuộc vào cách phần cứng đo khoảng cách.Thông tin khoảng cách báo cáo là tùy chọn nhưng được khuyến nghị cho các thiết bị bút cảm ứng.
Các giá trị được báo cáo bởi
ABS_TILT_X
vàABS_TILT_Y
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 dụng cụ được giữ ở trạng thái nghiêng.Các góc nghiêng dọc theo trục X và Y được giả định là được xác định theo độ so với phương vuông góc. Điểm trung tâm (vuông góc hoàn hảo) được tính bằng
(max + min) / 2
cho mỗi trục. Các giá trị nhỏ hơn điểm trung tâm thể hiện độ nghiêng lên hoặc sang trái, các giá trị lớn hơn điểm trung tâm thể hiện độ nghiêng xuống hoặc sang phải.InputReader
chuyển đổi các thành phần nghiêng X và Y thành góc nghiêng vuông góc trong khoảng từ 0 đếnPI / 2
radian và góc định hướng phẳng nằm trong khoảng từ-PI
đếnPI
radian. Cách biểu diễn này dẫn đến mô tả hướng tương thích với những gì được sử dụng để mô tả thao tác chạm ngón tay.Báo cáo thông tin độ nghiêng là tùy chọn nhưng được khuyến nghị cho các thiết bị bút cảm ứng.
Nếu loại công cụ được báo cáo bởi
ABS_MT_TOOL_TYPE
, nó sẽ thay thế mọi thông tin về loại công cụ được báo cáo bởiBTN_TOOL_*
. Nếu không có thông tin loại công cụ nào, 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 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ù đó là công cụ chạm hay ít nhất là loại công cụ của nó. Nếu không có thông tin thì công cụ này được coi là không hoạt động (nằm 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 nó xuất hiện trong báo cáo đồng bộ hóa gần đây nhất. Khi công cụ ngừng xuất hiện trong báo cáo đồng bộ hóa, nó sẽ không còn tồn tại.
- Khi sử dụng giao thức cảm ứng đa điểm 'B', công cụ sẽ hoạt động miễn là nó có khe hoạt động. Khi khe trống bị xóa, công cụ sẽ không còn tồn tại.
- Một công cụ được xác định là đang lơ lửng 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 là đúng. - Nếu công cụ đang hoạt động và trình điều khiển báo cáo thông tin áp suất và áp suất được báo cáo bằng 0 thì công cụ đang di chuyển.
- Nếu công cụ đang hoạt động và trình điều khiển hỗ trợ mã khóa
BTN_TOUCH
vàBTN_TOUCH
có giá trị bằng 0 thì công cụ đang 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 đều hoạt động. Kể từ Android 4.0, trình điều khiển màn hình cảm ứng có thể cần phải được thay đổi để tuân thủ đặc tả giao thức đầu vào của Linux.
Những thay đổi sau đây có thể được yêu cầu:
Khi một công cụ không hoạt động (ngón tay "lên"), công cụ đó sẽ ngừng xuất hiện trong các báo cáo đồng bộ hóa đa điểm tiếp theo. Khi tất cả các công cụ không hoạt động (tất cả các ngón tay đều "lên"), trình điều khiển sẽ gửi một gói báo cáo đồng bộ hóa trống, chẳng hạn như
SYN_MT_REPORT
theo sau làSYN_REPORT
.Các phiên bản trước của Android dự kiến sẽ báo cáo các sự kiện "tăng" bằng cách gửi giá trị áp suất bằng 0. Hành vi cũ không tương thích với đặc tả giao thức đầu vào của Linux và không còn được hỗ trợ.
Thông tin về áp suất vật lý hoặc cường độ tín hiệu phải được báo cáo bằng cách sử dụng
ABS_MT_PRESSURE
.Các phiên bản trước của Android đã truy xuất thông tin áp suất từ
ABS_MT_TOUCH_MAJOR
. Hành vi cũ không tương thích với đặc tả giao thức đầu vào của Linux và không còn được hỗ trợ.- Thông tin kích thước cảm ứng phải được báo cáo bằng cách sử dụng
ABS_MT_TOUCH_MAJOR
.Các phiên bản trước của Android đã truy xuất thông tin kích thước từ
ABS_MT_TOOL_MAJOR
. Hành vi cũ không tương thích với đặc tả giao thức đầu vào của Linux và không còn được hỗ trợ.
Thao tác trên thiết bị cảm ứng
Sau đây là tóm tắt ngắn gọn về hoạt động của 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ụ. Nó cũng theo dõi trạng thái 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 quan trọng. -
InputReader
xác định xem có xảy ra thao tác nhấn phím ảo hay không. Nếu vậy, nó sẽ thông báo choInputDispatcher
về sự kiện quan trọng. -
InputReader
xác định xem thao tác chạm có được bắt đầu trong giới hạn của màn hình hay không. Nếu vậy, nó sẽ thông báo 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ỏ , thì
InputReader
sẽ thực hiện phát hiện cử chỉ con trỏ, di chuyển con trỏ và các điểm tương ứng, đồng thời thông báo choInputDispatcher
về sự kiện con trỏ. -
InputDispatcher
sử dụngWindowManagerPolicy
để xác định xem các sự kiện có nên được gửi đi hay không và liệu chúng có nên đánh thức thiết bị hay không. Sau đó,InputDispatcher
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
Hoạt động của thiết bị cảm ứng được xác định bởi trục, nút, thuộc tính đầu vào, cấu hình thiết bị đầu vào, sơ đồ phím ảo và bố cục phím của thiết bị.
Tham khảo các phần sau để biết thêm chi tiết về các tệp tham gia cấu hình bàn phím:
Của cải
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 hoạt động của thiết bị cảm ứng.
Một lý do cho điều này là trình điều khiển thiết bị cho thiết bị cảm ứng thường báo cáo các đặc điểm của 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 bằng cách sử dụng thang đo dành riêng cho thiết bị bên trong, 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 nút cảm biến thiết bị cảm ứng.
Hệ thống sử dụng các tham số hiệu chuẩn được mã hóa trong tệp cấu hình thiết bị đầu vào để giải mã, chuyển đổi và chuẩn hóa các giá trị do thiết bị cảm ứng báo cáo thành dạng biểu thị tiêu chuẩn đơn giản hơn mà ứng dụng có thể hiểu được.
Quy ước tài liệu
Vì mục đích ghi chép, chúng tôi sử dụng các quy ước sau để mô tả các giá trị được hệ thống sử dụng trong quá trình hiệu chuẩn.
Giá trị trục thô
Các biểu thức sau đây biểu thị các giá trị thô được 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ó sẵn. -
raw.touchMajor
- Giá trị của trục
ABS_MT_TOUCH_MAJOR
hoặc 0 nếu không có sẵn. -
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ó sẵn. -
raw.toolMinor
- Giá trị của trục
ABS_MT_WIDTH_MINOR
hoặcraw.toolMajor
nếu không có sẵn. -
raw.orientation
- Giá trị của trục
ABS_MT_ORIENTATION
hoặc 0 nếu không có sẵn. -
raw.distance
- Giá trị của trục
ABS_DISTANCE
hoặcABS_MT_DISTANCE
hoặc 0 nếu không có sẵn. -
raw.tiltX
- Giá trị của trục
ABS_TILT_X
hoặc 0 nếu không có sẵn. -
raw.tiltY
- Giá trị của trục
ABS_TILT_Y
hoặc 0 nếu không có sẵn.
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ó được bằng cách gọi EVIOCGABS
ioctl cho mỗi trục.
-
raw.*.min
- Giá trị tối thiểu bao gồm của trục thô.
-
raw.*.max
- Giá trị tối đa bao gồm của trục thô.
-
raw.*.range
- Tương đương với
raw.*.max - raw.*.min
. -
raw.*.fuzz
- Độ chính xác của trục thô. ví dụ. fuzz = 1 ngụ ý các giá trị chính xác đến +/- 1 đơn vị.
-
raw.width
- Chiều rộng bao gồm của vùng cảm ứng, tương đương với
raw.x.range + 1
. -
raw.height
- Chiều cao bao gồm của vùng cảm ứng, tương đương với
raw.y.range + 1
.
Phạm vi đầu ra
Các biểu thức sau đây biểu thị các đặc tính của hệ tọa độ đầu ra. Hệ thống sử dụng phép nội suy tuyến tính để dịch thông tin vị trí cảm ứng từ các đơn vị bề mặt được thiết bị cảm ứng sử dụng sang các đơn vị đầu ra được báo cáo cho các ứng dụng 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), đây là chiều rộng màn hình tính bằng pixel. Đối với bàn di chuột (không liên kết với màn hình), chiều rộng đầu ra bằng
raw.width
, cho biết rằng không có phép nội suy nào được thực hiện. -
output.height
- Chiều cao đầu ra. Đối với màn hình cảm ứng (được liên kết với màn hình), đây là chiều cao của 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 rằng không có phép nội suy nào được thực hiện. -
output.diag
- Độ dài đường chéo của hệ tọa độ đầu ra, tương đương với
sqrt(output.width ^2 + output.height ^2)
.
Cấu hình cơ bản
Trình ánh xạ đầu vào cảm ứng sử dụng nhiều thuộc tính cấu hình trong tệp cấu hình thiết bị đầu vào để chỉ định các giá trị hiệu chuẩn. Bảng sau 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 được mô tả trong các phần sau cùng với các trường chúng được sử dụng để hiệu chỉnh.
touch.deviceType
Định nghĩa: touch.deviceType
= touchScreen
| touchPad
| pointer
| default
Chỉ định loại thiết bị cảm ứng.
Nếu giá trị là
touchScreen
thì thiết bị cảm ứng là màn hình cảm ứng được liên kết với màn hình.Nếu giá trị là
touchPad
thì thiết bị cảm ứng là bàn di chuột không được liên kết với màn hình.Nếu giá trị là
pointer
thì thiết bị cảm ứng là một bàn di chuột không được liên kết với màn hình và các chuyển động của nó được sử dụng cho các 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.
Tham khảo phần Phân loại để biết thêm chi tiết về cách loại thiết bị ảnh hưởng đến hoạt động của thiết bị cảm ứng.
Trong Android 3 trở xuống, tất cả các thiết bị cảm ứng đều được coi là màn hình cảm ứng.
touch.orientationAware
Định nghĩa: touch.orientationAware
= 0
| 1
Chỉ định xem thiết bị cảm ứng có phản ứng với những thay đổi về hướng hiển thị hay không.
Nếu giá trị là
1
, các vị trí cảm ứng được thiết bị cảm ứng báo cáo sẽ được xoay bất cứ khi nào hướng hiển thị thay đổi.Nếu giá trị là
0
, các vị trí cảm ứng được thiết bị cảm ứng báo cáo sẽ không bị thay đổi hướng hiển thị.
Giá trị mặc định là 1
nếu thiết bị là màn hình cảm ứng, 0
nếu không.
Hệ thống phân biệt giữa màn hình và màn hình cảm ứng bên trong và bên ngoài. Màn hình cảm ứng bên trong nhận biết hướng được xoay dựa trên hướng của màn hình bên trong. Màn hình cảm ứng bên ngoài nhận biết hướng được xoay dựa trên hướng của màn hình bên ngoài.
Nhận thức định hướng được sử dụng để hỗ trợ xoay màn hình cảm ứng trên các thiết bị như Nexus One. Ví dụ: khi thiết bị được xoay theo chiều kim đồng hồ 90 độ so với hướng tự nhiên của nó, vị trí tuyệt đối của các lần chạm sẽ được ánh xạ lại sao cho một lần chạm ở góc trên cùng bên trái của hệ tọa độ tuyệt đối của màn hình cảm ứng được báo cáo là một lần chạm ở phía trên bên trái góc của hệ tọa độ xoay của màn hình. Điều này được thực hiện để các lần chạm được báo cáo với cùng hệ tọa độ mà các ứng dụng sử dụng để vẽ các phần tử hình ảnh của chúng.
Trước Honeycomb, tất cả các thiết bị cảm ứng đều được cho là có khả năng 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ỉ 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
thì cử chỉ trên bàn di chuột sẽ được hiển thị bằng con trỏ tương tự như con trỏ chuột.Nếu giá trị là
spots
, cử chỉ trên bàn di chuột được biểu thị bằng một điểm neo tượng trưng cho tâm của cử chỉ và một tập hợp các điểm tròn tượng trưng cho vị trí của từng ngón tay.
Giá trị mặc định là pointer
khi thuộc tính đầu vào INPUT_PROP_SEMI_MT
được đặt hoặc spots
khác.
Trường X và Y
Các trường X và Y cung cấp thông tin vị trí cho tâm của vùng tiếp xúc.
Phép tính
Việc tính toán rất đơn giản: thông tin vị trí từ trình điều khiển cảm ứng được nội suy tuyến tính đến hệ tọa độ đầu ra.
xScale = output.width / raw.width yScale = output.height / raw.height If not orientation aware or screen rotation is 0 degrees: output.x = (raw.x - raw.x.min) * xScale output.y = (raw.y - raw.y.min) * yScale Else If rotation is 90 degrees: output.x = (raw.y - raw.y.min) * yScale output.y = (raw.x.max - raw.x) * xScale Else If rotation is 180 degrees: output.x = (raw.x.max - raw.x) * xScale output.y = (raw.y.max - raw.y) * yScale Else If rotation is 270 degrees: output.x = (raw.y.max - raw.y) * yScale output.y = (raw.x - raw.x.min) * xScale End If
touchMajor, touchMinor, toolMajor, toolMinor, các trường kích thước
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 chuẩn hóa của lần chạm so với lần chạm lớn nhất có thể mà thiết bị cảm ứng có thể cảm nhận được. Kích thước chuẩn hóa nhỏ nhất có thể là 0,0 (không tiếp xúc hoặc không thể đo được) và kích thước chuẩn hóa lớn nhất có thể là 1,0 (vùng cảm biến đã bão hòa).
Khi có thể đo cả chiều dài và chiều rộng gần đúng thì trường touchMajor
chỉ định kích thước dài hơn và trường touchMinor
chỉ định kích thước ngắn hơn của vùng tiếp xúc. Khi chỉ có thể đo được đường kính gần đúng của vùng tiếp xúc thì các trường touchMajor
và touchMinor
sẽ bằng nhau.
Tương tự, trường toolMajor
chỉ định kích thước dài hơn và trường toolMinor
chỉ định kích thước ngắn hơn của vùng 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 dao có sẵn thì kích thước dao được đặt bằng kích thước cảm ứng. Ngược lại, nếu kích thước dao không có sẵn nhưng kích thước cảm ứng có sẵn thì kích thước cảm ứng được đặt bằng kích thước dao.
Thiết bị cảm ứng đo hoặc báo cáo kích thước cảm ứng và kích thước công cụ theo nhiều cách khác nhau. Việc triển khai hiện tại hỗ trợ ba loại phép đo khác nhau: đường kính, diện tích và hộp giới hạn hình học theo đơn vị bề mặt.
Định nghĩa: touch.size.calibration
= none
| geometric
| diameter
| area
| default
Chỉ định loại phép đo được trình điều khiển cảm ứng sử dụng để báo cáo kích thước cảm ứng và kích thước công cụ.
Nếu giá trị
none
thì kích thước được đặt thành 0.Nếu giá trị là
geometric
, kích thước được giả định là được chỉ định theo cùng đơn vị bề mặt với vị trí, do đó, nó được chia tỷ lệ theo cách tương tự.Nếu giá trị là
diameter
thì kích thước được coi là tỷ lệ thuận với đường kính (chiều rộng) của điểm chạm hoặc dụng cụ.Nếu giá trị là
area
thì kích thước được coi là tỷ lệ thuận với diện tích của thao tác chạm hoặc công cụ.Nếu giá trị là
default
, hệ thống sẽ sử dụng hiệu chuẩngeometric
nếu trụcraw.touchMajor
hoặcraw.toolMajor
có sẵn, nếu không thì hệ thống sẽ sử dụng hiệu chuẩnnone
.
touch.size.scale
Định nghĩa: touch.size.scale
= <số dấu phẩy động không âm>
Chỉ định hệ số tỷ lệ không đổi được sử dụng trong hiệu chuẩn.
Giá trị mặc định là 1.0
.
touch.size.bias
Định nghĩa: touch.size.bias
= <số dấu phẩy động không âm>
Chỉ định một giá trị sai lệch không đổi được sử dụng trong hiệu chuẩn.
Giá trị mặc định là 0.0
.
touch.size.isSummed
Định nghĩa: touch.size.isSummed
= 0
| 1
Chỉ định xem kích thước được báo cáo là tổng kích thước của tất cả người liên hệ đang hoạt động hay được báo cáo riêng cho từng người liên hệ.
Nếu giá trị là
1
thì kích thước được báo cáo sẽ được chia cho số lượng 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 như cũ.
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 kích thước riêng lẻ của nhiều liên hệ nên chúng báo cáo số đo kích thước đại diện cho tổng diện tích hoặc chiều rộng của chúng. Thuộc tính này chỉ nên được đặt thành 1
cho các thiết bị như vậy. Nếu nghi ngờ, hãy đặt giá trị này thành 0
.
Phép tính
Việc tính toán các trường touchMajor
, touchMinor
, toolMajor
, toolMinor
và size
phụ thuộc vào các tham 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).
Áp suất bằng 0 cho biết dụng cụ đang lơ lửng.
cảm ứng.áp lực.calibration
Định nghĩa: touch.pressure.calibration
= none
| physical
| amplitude
| default
Chỉ định loại phép đo được trình điều khiển cảm ứng sử dụng để báo cáo áp suất.
Nếu giá trị bằng
none
thì áp suất không xác định nê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 coi là đo cường độ vật lý thực tế của áp suất tác dụng lên bàn di chuột.Nếu giá trị là
amplitude
, trục áp suất được coi là đo biên độ tín hiệu, liên quan đến kích thước của tiếp điểm và áp suất tác dụng.Nếu giá trị là
default
, hệ thống sẽ sử dụng hiệu chuẩnphysical
nếu trục áp suất có sẵn, nếu không thìnone
sử dụng.
touch.áp lực.scale
Định nghĩa: touch.pressure.scale
= <số dấu phẩy động không âm>
Chỉ định một hệ số tỷ lệ không đổi được sử dụng trong hiệu chuẩn.
Giá trị mặc định là 1.0 / raw.pressure.max
.
Phép tính
Việc tính toán trường pressure
phụ thuộc vào các tham số hiệu chuẩn được chỉ định.
If touch.pressure.calibration == "physical" or "amplitude": output.pressure = raw.pressure * touch.pressure.scale Else If hovering: output.pressure = 0 Else output.pressure = 1 End If End If
Định hướng và các trường nghiêng
Trường orientation
tả định hướng của cảm ứng và công cụ là một phép đo góc. Một hướng của 0
chỉ ra rằng trục chính được định hướng theo chiều dọc, -PI/2
chỉ ra rằng trục chính được định hướng bên trái, PI/2
chỉ ra rằng trục chính được định hướng sang phải. Khi có một công cụ bút stylus, phạm vi định hướng có thể được mô tả trong phạm vi vòng tròn đầy đủ từ -PI
hoặc PI
.
Trường tilt
mô tả độ nghiêng của công cụ là một phép đo góc. Độ nghiêng của 0
chỉ ra rằng công cụ vuông góc với bề mặt. Độ nghiêng của PI/2
chỉ ra rằng công cụ phẳng trên bề mặt.
touch.orientation.Calibration
Định nghĩa: touch.orientation.calibration
= none
| interpolated
| vector
| default
Chỉ định loại đo được sử dụng bởi trình điều khiển cảm ứng để báo cáo định hướng.
- Nếu giá trị
none
, không xác định định hướng nên nó được đặt thành 0. - Nếu giá trị được
interpolated
-PI/2
định hướng được nội suyPI/2
tính sao cho giá trị thô củaraw.orientation.min
raw.orientation.max
Giá trị trung tâm của(raw.orientation.min + raw.orientation.max) / 2
bản đồ thành0
. - Nếu giá trị là
vector
, định hướng được hiểu là một vectơ đóng gói phụ thuộc vào hai trường 4 bit có chữ ký. Biểu diễn này được sử dụng trên các phần giao thức dựa trên đối tượng Atmel. Khi được giải mã, vectơ mang lại một góc hướng và độ tin cậy. Độ tin cậy được sử dụng để mở rộng quy mô thông tin, trừ khi nó là hình học. - Nếu giá trị là
default
, hệ thống sử dụng hiệu chuẩninterpolated
nếu trục định hướng có sẵn, nếu không sẽ sử dụngnone
.
Phép tính
Việc tính toán các trường orientation
và tilt
phụ thuộc vào các tham số hiệu chuẩn đượ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à bề mặt thiết bị cảm ứng. Giá trị 0,0 cho thấy tiếp xúc trực tiếp và các giá trị lớn hơn cho thấy khoảng cách ngày càng tăng so với bề mặt.
Touch.Distance.CaliBration
Định nghĩa: touch.distance.calibration
= none
| scaled
| default
Chỉ định loại phép đo được sử dụng bởi trình điều khiển cảm ứng để báo cáo khoảng cách.
Nếu giá trị
none
, khoảng cách không xác định nên nó được đặt thành 0.Nếu giá trị được
scaled
, khoảng cách được báo cáo được nhân với hệ số tỷ lệ không đổi.Nếu giá trị là
default
, hệ thống sử dụng hiệu chuẩnscaled
nếu trục khoảng cách có sẵn, nếu không sẽ sử dụngnone
.
Touch.Distance.Scale
Định nghĩa: touch.distance.scale
= <a số dấu phẩy động không tiêu cực >>
Chỉ định một hệ số tỷ lệ không đổi được sử dụng trong hiệu chuẩn.
Giá trị mặc định là 1.0
.
Phép tính
Việc tính toán trường distance
phụ thuộc vào các tham số hiệu chuẩn được 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ú tương thích
Các thuộc tính cấu hình cho các 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 các thiết bị cảm ứng phải được cập nhật để sử dụng các thuộc tính cấu hình mới.
Trình điều khiển thiết bị cảm ứng cũ hơn cũng có thể cần được cập nhật.
Tệp bản đồ khóa ảo
Các thiết bị cảm ứng có thể được sử dụng để thực hiện các khóa ảo.
Có một số cách để làm điều này, tùy thuộc vào khả năng của bộ điều khiển cảm ứng. Một số bộ điều khiển cảm ứng có thể được cấu hình trực tiếp để triển khai các khóa mềm bằng cách đặt các thanh ghi phần sụn. Những lần khác, mong muốn thực hiện ánh xạ từ tọa độ cảm ứng sang các mã chính trong phần mềm.
Khi các khóa ảo được triển khai trong phần mềm, kernel phải xuất một tệp bản đồ khóa ảo có tên virtualkeys.<devicename>
dưới dạng 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 của nó là "Touchyfeely" thì tệp bản đồ khóa ảo phải có đường dẫn /sys/board_properties/virtualkeys.touchyfeely
.
Một tệp bản đồ khóa ảo mô tả các mã khóa tọa độ và Linux của các phím ảo trên màn hình cảm ứng.
Ngoài tệp bản đồ khóa ảo, phải có một tệp bố cục khóa tương ứng và tệp bản đồ ký tự khóa để ánh xạ các mã khóa Linux đến mã khóa 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 đồ khóa ảo là một tệp văn bản đơn giản bao gồm một chuỗi các mô tả bố cục khóa ảo hoặc được phân tách bằng newlines hoặc bởi các dấu chấm câu.
Các dòng bình luận bắt đầu bằng '#' và tiếp tục đến cuối dòng.
Mỗi khóa ảo được mô tả bởi 6 thành phần phân phối ruột kết:
-
0x01
: Mã phiên bản. Phải luôn là0x01
. - <Mã khóa Linux>: Mã khóa Linux của khóa ảo.
- <centx>: tọa độ x pixel của trung tâm của khóa ảo.
- <Centery>: tọa độ y pixel của trung tâm của khóa ảo.
- <Width>: Chiều rộng của phím ảo trong pixel.
- <i cao>: Chiều cao của phím ảo trong pixel.
Tất cả các tọa độ và kích thước được chỉ định theo hệ tọa độ hiển thị.
Dưới đây là một tập tin bản đồ khóa ả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
Tệp bản đồ khóa ảo tương tự cũng có thể được viết 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 khóa ảo đều có tọa độ <centery> 835, thấp hơn một chút so với khu vực có thể nhìn thấy của màn hình cảm ứng.
Khóa đầu tiên có mã quét Linux là 158
( KEY_BACK
), centrex là 55
, trung tâm 835
, chiều rộng 90
và chiều cao là 55
.
Ví dụ
Tệp bản đồ khóa ả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 khóa: /system/usr/keylayout/touchyfeely.kl
.
key 158 BACK key 139 MENU key 172 HOME key 217 SEARCH
Tệp bản đồ ký tự chính: /system/usr/keychars/touchyfeely.kcm
.
type SPECIAL_FUNCTION
Cử chỉ con trỏ đa điểm gián tiếp
Trong chế độ con trỏ, hệ thống diễn giải các cử chỉ sau:
- Một ngón tay đơn: Nhấp.
- Chuyển động ngón tay đơn: Di chuyển con trỏ.
- Nhấn nút chuyển động ngón tay đơn: Kéo con trỏ.
- Chuyển động hai ngón tay cả hai ngón tay di chuyển theo cùng một hướng: kéo khu vực dưới con trỏ theo hướng đó. Bản thân con trỏ không di chuyển.
- Chuyển động hai ngón tay cả hai ngón tay di chuyển về phía nhau hoặc xa nhau theo các hướng khác nhau: Pan/Scale/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ỉ miễn phí.
Từ chối cọ
Kể từ Android 13, hệ thống có thể tự động từ chối đầu vào từ lòng bàn tay khi khung tích hợp được bật. Các giải pháp được xây dựng tùy chỉnh, trong nhà vẫn được hỗ trợ, mặc dù chúng có thể cần được sửa đổi để trả lại cờ TOOL_TYPE_PALM
khi phát hiện lòng bàn tay. Khung tích hợp cũng hoạt động cùng với các giải pháp tùy chỉnh.
Mô hình thực tế xem xét 90 ms đầu tiên của dữ liệu cử chỉ, ở con trỏ hiện tại và ở các con trỏ xung quanh, sau đó xem xét cách xa cạnh hiển thị. Sau đó, nó xác định, trên cơ sở mỗi con trỏ, con trỏ nào là lòng bàn tay. Nó cũng tính đến kích thước của mỗi tiếp xúc, theo báo cáo của touchMajor
và touchMinor
. Khung Android sau đó loại bỏ các con trỏ được đánh dấu là lòng bàn tay từ luồng cảm ứng.
Nếu một con trỏ đã được gửi đến các ứng dụng, thì hệ thống cũng vậy:
-
ACTION_POINTER_UP
FLAG_CANCELED
-
ACTION_CANCEL
Một API công khai, MotionEvent.FLAG_CANCELED
, chỉ ra rằng sự kiện hiện tại không nên 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 chỉ cần thả con trỏ.
Bật từ chối lòng bàn tay
- Trong trình điều khiển cảm ứng của bạn, 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 mỗi mm ):-
ABS_MT_POSITION_X
-
ABS_MT_POSITION_Y
-
ABS_MT_TOUCH_MAJOR
-
ABS_MT_TOUCH_MINOR
Hỗ trợ cho
ABS_MT_TOUCH_MINOR
là tùy chọn. Tuy nhiên, nếu thiết bị của bạn hỗ trợ nó, hãy đảm bảo độ phân giải được đặt chính xác. -
- Để xác nhận các trường được đặt chính xác, chạy:
$ adb shell getevent -li
- Để kích hoạt tính năng trong thời gian chạ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ó những người từ chối lòng bàn tay bên trongUnwantedInteractionBlocker
. Nếu không, hãy kiểm tra các nhật ký liên quan đến đầu vào để tìm manh mối về những gì có thể bị cấu hình sai.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, hãy thêm lệnh SysProp tương ứng trong tệp
init**rc
của bạn:setprop persist.device_config.input_native_boot.palm_rejection_enabled 1
đọc thêm
,Android hỗ trợ nhiều màn hình cảm ứng và miếng đệm cảm ứng, bao gồm các máy tính bảng số hóa dựa trên bút stylus.
Màn hình cảm ứng là các thiết bị cảm ứng được liên kết với màn hình sao cho người dùng có ấn tượng về việc thao tác trực tiếp các mục trên màn hình.
Touch Pad là các 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ố hóa. Các miếng đệm cảm ứng thường được sử dụng để chỉ hoặc để định vị gián tiếp tuyệt đối hoặc điều khiển dựa trên cử chỉ của giao diện người dùng.
Các thiết bị cảm ứng có thể có các nút có chức năng tương tự như các nút chuột.
Các thiết bị cảm ứng đôi khi có thể được thao tác bằng cách sử dụng nhiều công cụ khác nhau như ngón tay hoặc bút stylus tùy thuộc vào công nghệ cảm biến cảm ứng cơ bản.
Các thiết bị cảm ứng đôi khi được sử dụng để thực hiện các khóa ảo. Ví dụ, trên một số thiết bị Android, khu vực cảm biến màn hình cảm ứng vượt ra ngoài cạnh của màn hình và phục vụ mục đích kép như là một phần của miếng khóa nhạy cảm ứng.
Do sự đa dạng của các 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ị.
Chạm vào phân loại thiết bị
Một thiết bị đầu vào được phân loại là thiết bị đa chạm nếu cả hai điều kiện sau đây giữ:
- Thiết bị đầu vào báo cáo sự hiện diện của
ABS_MT_POSITION_X
vàABS_MT_POSITION_Y
AXES AXES. - Thiết bị đầu vào không có bất kỳ nút gamepad nào. Điều kiện này giải quyết một sự mơ hồ với một số gamepad một số báo cáo các trục với các mã trùng lặp với các trục MT.
Một thiết bị đầu vào được phân loại là một thiết bị một cảm ứng nếu cả hai điều kiện sau đều giữ:
- Thiết bị đầu vào không được phân loại là thiết bị đa chạm. Một thiết bị đầu vào được phân loại là thiết bị một chạm hoặc là thiết bị đa 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
và sự hiện diện của mã khóaBTN_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 đồ khóa ảo cho thiết bị. Nếu bản đồ khóa ảo có sẵn, thì tệp bố cục khóa cho thiết bị cũng được tải. Tham khảo [Tệp bản đồ khóa ảo] (#FILES-MAP-MAP-MAP) để 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 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 nên có cá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 cấu hình mặc định phù hợp với các thiết bị ngoại vi cảm ứng có mục đích chung như màn hình cảm ứng USB hoặc Bluetooth HID bên ngoài hoặc màn hình cảm ứng. Những 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 cấu hình thiết bị đầu vào được tải, hệ thống phân loại thiết bị đầu vào là màn hình cảm ứng , miếng đệm cảm ứng hoặc thiết bị con trỏ .
- Một thiết bị màn hình cảm ứng được sử dụng để thao tác trực tiếp 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, vì vậy hệ thống không yêu cầu bất kỳ khả năng chi trả bổ sung nào để chỉ ra các đối tượng bị thao túng.
- Một thiết bị cảm ứng được sử dụng để cung cấp thông tin định vị tuyệt đối cho một ứng dụng về các cảm ứng trên một khu vực cảm biến nhất định. Nó có thể hữu ích cho máy tính bảng số hóa.
- Một thiết bị con trỏ được sử dụng để thao tác gián tiếp các đối tượng trên màn hình bằng cách sử dụng con trỏ. Ngón tay được hiểu là cử chỉ con trỏ nhiều chạm. Các công cụ khác, chẳng hạn như bút stylus, được giải thích bằng các vị trí tuyệt đối. Xem cử chỉ con trỏ đa điểm gián tiếp để biết thêm thông tin.
Các quy tắc sau được sử dụng để phân loại thiết bị đầu vào thành màn hình cảm ứng, bàn cảm ứng hoặc thiết bị con trỏ.
- Nếu thuộc tính
touch.deviceType
được đặt, thì loại thiết bị được đặt như được chỉ định. - Nếu thiết bị đầu vào báo cáo sự hiện diện của thuộc tính đầu vào
INPUT_PROP_DIRECT
(thông quaEVIOCGPROP
ioctl), thì loại thiết bị được đặt thành màn hình chạm . Điều kiện này giả định rằng các thiết bị cảm ứng đầu vào trực tiếp được gắn vào màn hình cũng được kết nối. - Nếu thiết bị đầu vào báo cáo sự hiện diện của thuộc tính đầu vào
INPUT_PROP_POINTER
(thông 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ị được đặt thành pad chạm . Điều kiện này giải quyết sự mơ hồ cho các thiết bị đầu vào bao gồm cả chuột và miếng đệm cảm ứng. Trong trường hợp này, miếng đệm cảm ứng không được sử dụng để điều khiển con trỏ vì chuột đã điều khiển nó. - Mặt khác, loại thiết bị được đặt thành con trỏ . Mặc định này đảm bảo rằng các miếng đệm cảm ứng chưa được chỉ định bất kỳ mục đích đặc biệt nào khác kiểm soát con trỏ.
nút
Các nút là các điều khiển tùy chọn mà các ứng dụng có thể sử dụng để thực hiện các chức năng bổ sung. Các nút trên các thiết bị cảm ứng hoạt động tương tự như các nút chuột và chủ yếu được sử dụng với các thiết bị cảm ứng loại con trỏ hoặc bằng bút stylus.
Các nút sau được hỗ trợ:
-
BTN_LEFT
: được ánh xạ tớiMotionEvent.BUTTON_PRIMARY
. -
BTN_RIGHT
: Ánh xạ tớiMotionEvent.BUTTON_SECONDARY
. -
BTN_MIDDLE
: được ánh xạ tớiMotionEvent.BUTTON_MIDDLE
. -
BTN_BACK
vàBTN_SIDE
: được ánh xạ tớiMotionEvent.BUTTON_BACK
. Nhấn nút này cũng tổng hợp một phím Nhấn bằng mã khóaKeyEvent.KEYCODE_BACK
. -
BTN_FORWARD
vàBTN_EXTRA
: được ánh xạ tớiMotionEvent.BUTTON_FORWARD
. Nhấn nút này cũng tổng hợp một phím Nhấn bằng mã khóaKeyEvent.KEYCODE_FORWARD
. -
BTN_STYLUS
: được ánh xạ tớiMotionEvent.BUTTON_SECONDARY
. -
BTN_STYLUS2
: được ánh xạ tớiMotionEvent.BUTTON_TERTIARY
.
Công cụ và loại công cụ
Một công cụ là một ngón tay, bút stylus hoặc thiết bị khác được sử dụng để tương tác với thiết bị cảm ứng. Một số thiết bị cảm ứng có thể phân biệt giữa các loại công cụ khác nhau.
Ở những nơi khác trong Android, như trong API MotionEvent
, một công cụ thường được gọi là một con trỏ .
Các loại công cụ sau được hỗ trợ:
-
BTN_TOOL_FINGER
vàMT_TOOL_FINGER
: được ánh xạ tớiMotionEvent.TOOL_TYPE_FINGER
. -
BTN_TOOL_PEN
vàMT_TOOL_PEN
: được ánh xạ tớiMotionEvent.TOOL_TYPE_STYLUS
. -
BTN_TOOL_RUBBER
: được ánh xạ tớiMotionEvent.TOOL_TYPE_ERASER
. -
BTN_TOOL_BRUSH
: được ánh xạ tớiMotionEvent.TOOL_TYPE_STYLUS
. -
BTN_TOOL_PENCIL
: được ánh xạ tớiMotionEvent.TOOL_TYPE_STYLUS
. -
BTN_TOOL_AIRBRUSH
: được ánh xạ tớiMotionEvent.TOOL_TYPE_STYLUS
. -
BTN_TOOL_MOUSE
: được ánh xạ tớiMotionEvent.TOOL_TYPE_MOUSE
. -
BTN_TOOL_LENS
: được ánh xạ tớiMotionEvent.TOOL_TYPE_MOUSE
. -
BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
vàBTN_TOOL_QUADTAP
: được ánh xạ tớiMotionEvent.TOOL_TYPE_FINGER
.
Di chuột so với các công cụ chạm vào
Các công cụ có thể liên hệ với thiết bị cảm ứng hoặc trong phạm vi và lơ lửng phía trên nó. Không phải tất cả các thiết bị cảm ứng đều có thể cảm nhận được sự hiện diện của một công cụ lơ lửng phía trên thiết bị cảm ứng. Những người làm, chẳng hạn như các số hóa bút stylus dựa trên RF, thường có thể phát hiện khi công cụ nằm trong một phạm vi hạn chế của bộ số hóa.
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ự như vậy, các công cụ chạm vào và các 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ụ cảm ứng được báo cáo cho các ứng dụng là các sự kiện cảm ứng 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ụ lơ lửng được báo cáo cho các ứng dụng là 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
.
Cảm ứng yêu cầu trình điều khiển thiết bị
- Trình điều khiển thiết bị cảm ứng chỉ nên đăng ký các trục và mã khóa cho các trục và nút mà chúng hỗ trợ. Đăng ký các trục hoặc mã khóa không được hỗ trợ có thể nhầm lẫn thuật toán phân loại thiết bị hoặc khiến hệ thống phát hiện không chính xác các khả năng của thiết bị. Ví dụ: nếu thiết bị báo cáo mã khóa
BTN_TOUCH
, hệ thống giả định rằngBTN_TOUCH
luôn được sử dụng để cho biết liệu công cụ có chạm vào màn hình hay không. Do đó,BTN_TOUCH
không nên được sử dụng để chỉ ra rằng công cụ chỉ nằm trong phạm vi và lơ lửng. - Các thiết bị một cảm ứng Sử dụng các sự kiện đầu vào Linux sau:
-
ABS_X
: (Yêu cầu) Báo cáo tọa độ X của công cụ. -
ABS_Y
: (bắt buộc) báo cáo tọa độ y của công cụ. -
ABS_PRESSURE
: (tùy chọn) báo cáo áp lực vật lý được áp dụng cho đầu công cụ hoặc cường độ tín hiệu của tiếp xúc cảm ứng. -
ABS_TOOL_WIDTH
: (Tùy chọn) Báo cáo khu vực mặt cắt ngang hoặc chiều rộng của tiếp xúc cảm ứng hoặc của chính công cụ. -
ABS_DISTANCE
: (Tùy chọn) Báo cáo khoảng cách của công cụ từ bề mặt của thiết bị cảm ứng. -
ABS_TILT_X
: (Tùy chọn) báo cáo độ nghiêng của công cụ từ bề mặt của thiết bị cảm ứng dọc theo trục X. -
ABS_TILT_Y
: (Tùy chọn) Báo cáo độ nghiêng của công cụ từ bề mặt của thiết bị cảm ứng dọc theo trục y. -
BTN_TOUCH
: (Yêu cầu) Cho biết liệu công cụ có chạm vào thiết bị hay không. -
BTN_LEFT
,BTN_RIGHT
,BTN_MIDDLE
,BTN_BACK
,BTN_SIDE
,BTN_FORWARD
,BTN_EXTRA
,BTN_STYLUS
,BTN_STYLUS2
: (tùy chọn) Báo cáo nút Nút báo cáo. -
BTN_TOOL_FINGER
,BTN_TOOL_PEN
BTN_TOOL_LENS
BTN_TOOL_BRUSH
BTN_TOOL_TRIPLETAP
BTN_TOOL_RUBBER
BTN_TOOL_DOUBLETAP
BTN_TOOL_AIRBRUSH
BTN_TOOL_PENCIL
BTN_TOOL_MOUSE
BTN_TOOL_QUADTAP
công cụ .
-
- Các thiết bị đa điểm sử dụng các sự kiện đầu vào Linux sau:
-
ABS_MT_POSITION_X
: (Yêu cầu) Báo cáo tọa độ x của công cụ. -
ABS_MT_POSITION_Y
: (Yêu cầu) Báo cáo tọa độ y của công cụ. -
ABS_MT_PRESSURE
: (Tùy chọn) Báo cáo áp lực vật lý được áp dụng cho đầu công cụ hoặc cường độ tín hiệu của tiếp xúc cảm ứng. -
ABS_MT_TOUCH_MAJOR
: (Tùy chọn) Báo cáo diện tích mặt cắt ngang của tiếp xúc cảm ứng hoặc chiều dài của kích thước dài hơn của tiếp xúc cảm ứng. -
ABS_MT_TOUCH_MINOR
: (Tùy chọn) Báo cáo độ dài của kích thước ngắn hơn của tiếp xúc cảm ứng. Trục này không nên được sử dụng nếuABS_MT_TOUCH_MAJOR
đang báo cáo một phép đo khu vực. -
ABS_MT_WIDTH_MAJOR
: (Tùy chọn) Báo cáo khu vực mặt cắt ngang của chính công cụ hoặc chiều dài của kích thước dài hơn của chính công cụ. Đừng sử dụng trục này trừ khi bạn biết kích thước của chính công cụ. -
ABS_MT_WIDTH_MINOR
: (Tùy chọn) Báo cáo độ dài của kích thước ngắn hơn của chính công cụ. Trục này không nên được sử dụng nếuABS_MT_WIDTH_MAJOR
đang báo cáo một phép đo khu vực hoặc nếu không có kích thước của công cụ. -
ABS_MT_ORIENTATION
: (Tùy chọn) Báo cáo định hướng của công cụ. -
ABS_MT_DISTANCE
: (Tùy chọn) Báo cáo khoảng cách của công cụ từ bề mặt của thiết bị cảm ứng. -
ABS_MT_TOOL_TYPE
: (Tùy chọn) Báo cáo loại công cụ làMT_TOOL_FINGER
hoặcMT_TOOL_PEN
. -
ABS_MT_TRACKING_ID
: (Tùy chọn) Báo cáo ID theo dõi của công cụ. ID theo dõi là một số nguyên không tiêu cực 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ụ hoạt động. Ví dụ, khi nhiều ngón tay chạm vào thiết bị, mỗi ngón tay nên được gán một ID theo dõi riêng biệt được sử dụng miễn là ngón tay vẫn tiếp xúc. ID theo dõi có thể được sử dụng lại khi các công cụ liên quan của chúng di chuyển ra khỏi phạm vi. -
ABS_MT_SLOT
: (Tùy chọn) Báo cáo ID khe của công cụ, khi sử dụng giao thức đa điểm Linux 'B'. Tham khảo tài liệu giao thức đa điểm Linux để biết thêm chi tiết. -
BTN_TOUCH
: (Yêu cầu) Cho biết liệu công cụ có chạm vào thiết bị hay không. -
BTN_LEFT
,BTN_RIGHT
,BTN_MIDDLE
,BTN_BACK
,BTN_SIDE
,BTN_FORWARD
,BTN_EXTRA
,BTN_STYLUS
,BTN_STYLUS2
: (tùy chọn) Báo cáo nút Nút báo cáo. -
BTN_TOOL_FINGER
,BTN_TOOL_PEN
BTN_TOOL_LENS
BTN_TOOL_BRUSH
BTN_TOOL_TRIPLETAP
BTN_TOOL_RUBBER
BTN_TOOL_DOUBLETAP
BTN_TOOL_AIRBRUSH
BTN_TOOL_PENCIL
BTN_TOOL_MOUSE
BTN_TOOL_QUADTAP
công cụ .
-
- Nếu các trục cho cả giao thức đơn và đa cảm ứng được xác định, thì chỉ có các trục đa chạm được sử dụng và các trục đơn được bỏ qua.
Các giá trị tối thiểu và tối đa của
ABS_X
,ABS_Y
,ABS_MT_POSITION_X
vàABS_MT_POSITION_Y
Xác định các giới hạn của diện tích hoạt động của thiết bị trong các đơn vị bề mặt dành riêng cho thiết bị. Trong trường hợp màn hình cảm ứng, khu vực hoạt động mô tả phần của thiết bị cảm ứng thực sự bao gồm màn hình.Đối với màn hình cảm ứng, hệ thống sẽ tự động nội suy các vị trí cảm ứng được báo cáo trong các đơn vị bề mặt để có được các vị trí cảm ứng trong các pixel hiển thị theo tính toán sau:
displayX = (x - minX) * displayWidth / (maxX - minX + 1) displayY = (y - minY) * displayHeight / (maxY - minY + 1)
Một màn hình cảm ứng có thể báo cáo chạm vào bên ngoài khu vực hoạt động được báo cáo.
Các cảm ứng được bắt đầu bên ngoài khu vực hoạt động không được gửi cho các ứng dụng nhưng có thể được sử dụng cho các khóa ảo.
Các cảm ứng được bắt đầu bên trong khu vực hoạt động hoặc nhập và thoát khỏi khu vực hiển thị được gửi đến các ứng dụng. Do đó, nếu một cảm ứng bắt đầu trong giới hạn của một ứng dụng và sau đó di chuyển bên ngoài khu vực hoạt động, ứng dụng có thể nhận được các sự kiện cảm ứng với các tọa độ hiển thị âm hoặc vượt quá giới hạn của màn hình. Đây là hành vi được mong đợi.
Một thiết bị cảm ứng không bao giờ nên kẹp các tọa độ cảm ứng với giới hạn của khu vực hoạt động. Nếu một cảm ứng thoát ra khỏi khu vực hoạt động, nó nên được báo cáo là nằm ngoài khu vực hoạt động, hoặc nó không nên đượ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, nó có thể báo cáo tọa độ của (MINX, MINY). Nếu ngón tay tiếp tục di chuyển xa hơn bên ngoài khu vực hoạt động, màn hình cảm ứng sẽ bắt đầu báo cáo tọa độ với các thành phần nhỏ hơn MINX và MINY, chẳng hạn như (MINX - 2, MINY - 3) hoặc nên ngừng báo cáo hoàn toàn. Nói cách khác, màn hình cảm ứng không nên 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 khu vực hoạt động.
Kẹp Touch tọa độ với cạnh hiển thị tạo ra một ranh giới cứng nhân tạo xung quanh cạnh của màn hình giúp ngăn hệ thống theo dõi các chuyển động trơn tru đi vào hoặc thoát khỏi giới hạn của khu vực hiển thị.
Các giá trị được báo cáo bởi
ABS_PRESSURE
hoặcABS_MT_PRESSURE
, nếu chúng được báo cáo, phải là không khác khi công cụ chạm vào thiết bị và bằng không để chỉ ra rằng công cụ đang lơ lửng.Báo cáo thông tin áp lực là tùy chọn nhưng được khuyến nghị mạnh mẽ. Ứng dụng có thể sử dụng thông tin áp lực để thực hiện bản vẽ nhạy cảm với áp suất 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ặcABS_MT_WIDTH_MINOR
nên không khác khi công cụ chạm vào thiết bị và không, nhưng điều này không bắt buộc. Ví dụ, thiết bị cảm ứng có thể đo kích thước của tiếp điểm cảm ứng ngón tay nhưng không phải là điểm tiếp xúc cảm ứng bút stylus.Thông tin kích thước báo cáo là tùy chọn nhưng được khuyến nghị mạnh mẽ. Ứng dụng có thể sử dụng thông tin áp lực để thực hiện bản vẽ nhạy cảm với kích thước và các hiệu ứng khác.
Các giá trị được báo cáo bởi
ABS_DISTANCE
hoặcABS_MT_DISTANCE
sẽ tiếp cận bằng không khi công cụ chạm vào thiết bị. Khoảng cách có thể vẫn khác không ngay cả khi công cụ tiếp xúc trực tiếp. Các giá trị chính xác được báo cáo phụ thuộc vào cách thức mà phần cứng đo khoảng cách.Báo cáo Thông tin khoảng cách là tùy chọn nhưng được khuyến nghị cho các thiết bị bút stylus.
Các giá trị được báo cáo bởi
ABS_TILT_X
vàABS_TILT_Y
phải bằng không khi công cụ vuông góc với thiết bị. Một độ nghiêng khác không chỉ ra rằng công cụ được giữ ở độ nghiêng.Các góc nghiêng dọc theo trục X và Y được giả định được chỉ định theo độ từ vuông góc. Điểm trung tâm (hoàn toàn vuông góc) được đưa ra 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 bên trái, các giá trị lớn hơn điểm trung tâm biểu thị độ nghiêng xuống hoặc sang phải.InputReader
chuyển đổi các thành phần nghiêng X và Y thành góc nghiêng vuông góc từ 0 thành radianPI / 2
và góc hướng phẳng từ-PI
sang radianPI
. Biểu diễn này dẫn đến một mô tả về định hướng tương thích với những gì được sử dụng để mô tả các chạm ngón tay.Báo cáo thông tin nghiêng là tùy chọn nhưng được khuyến nghị cho các thiết bị bút stylus.
Nếu loại công cụ được báo cáo bởi
ABS_MT_TOOL_TYPE
, nó sẽ thay thế bất kỳ thông tin loại công cụ nào được báo cáo bởiBTN_TOOL_*
. Nếu không có thông tin loại công cụ nào có sẵn, loại công cụ mặc định làMotionEvent.TOOL_TYPE_FINGER
.Một công cụ được xác định là hoạt động dựa trên các điều kiện sau:
Khi sử dụng giao thức một cảm ứng, 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ù nó đang chạm vào hay ít nhất là loại công cụ của nó. Nếu không có thông tin nào có sẵn, thì công cụ được cho là không hoạt động (ngoài phạm vi).- Khi sử dụng giao thức đa chạm 'A', công cụ này sẽ hoạt động bất cứ khi nào nó xuất hiện trong báo cáo đồng bộ hóa gần đây nhất. Khi công cụ ngừng xuất hiện trong các báo cáo đồng bộ, nó không còn tồn tại.
- Khi sử dụng giao thức đa điểm 'B', công cụ này hoạt động miễn là nó có một khe hoạt động. Khi khe cắm nó bị xóa, công cụ không còn tồn tại.
- Một công cụ được xác định là 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ụ không di chuột, ngay cả khi một trong các điều kiện sau là đúng. - Nếu công cụ đang hoạt động và trình điều khiển báo cáo thông tin áp lực và áp suất được báo cáo bằng không, thì công cụ này đang lơ lửng.
- Nếu công cụ đang hoạt động và trình điều khiển hỗ trợ mã khóa
BTN_TOUCH
vàBTN_TOUCH
có giá trị bằng không, thì công cụ này đang lơ lửng.
- Nếu công cụ là
-
InputReader
hỗ trợ cả giao thức đ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 hoạt động. Kể từ Android 4.0, trình điều khiển màn hình cảm ứng có thể cần phải được thay đổi để tuân thủ đặc tả giao thức đầu vào Linux.
Những thay đổi sau đây có thể được yêu cầu:
Khi một công cụ trở nên không hoạt động (ngón tay "lên"), nó sẽ ngừng xuất hiện trong các báo cáo đồng bộ hóa đa chạm tiếp theo. Khi tất cả các công cụ trở nên không hoạt động (tất cả các ngón tay sẽ "lên"), trình điều khiển sẽ gửi một gói báo cáo đồng bộ hóa trống, chẳng hạn như
SYN_MT_REPORT
theo sau làSYN_REPORT
.Các phiên bản trước của các sự kiện "UP" dự kiế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 đặc tả giao thức đầu vào Linux và không còn được hỗ trợ.
Áp lực vật lý hoặc thông tin cường độ tín hiệu nên được báo cáo bằng cách sử dụng
ABS_MT_PRESSURE
.Các phiên bản trước của Android lấy thông tin áp suất từ
ABS_MT_TOUCH_MAJOR
. Hành vi cũ không tương thích với đặc tả giao thức đầu vào Linux và không còn được hỗ trợ.- Thông tin kích thước cảm ứng nên được báo cáo bằng
ABS_MT_TOUCH_MAJOR
.Các phiên bản trước của Android lấy thông tin kích thước từ
ABS_MT_TOOL_MAJOR
. Hành vi cũ không tương thích với đặc tả giao thức đầu vào Linux và không còn được hỗ trợ.
Chạm vào hoạt động của thiết bị
Sau đây là một bản tóm tắt ngắn gọn về hoạt động 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
tiêu thụ 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 từng công cụ. Nó cũng theo dõi các trạng thái nút. - Nếu trở lại hoặc chuyển tiếp được nhấn hoặc phát hành,
InputReader
sẽ thông báo choInputDispatcher
về sự kiện chính. -
InputReader
xác định xem một máy ép phím ảo có xảy ra hay không. Nếu vậy, nó thông báo choInputDispatcher
về sự kiện chính. -
InputReader
xác định xem cảm ứng được bắt đầu trong giới hạn của màn hình. Nếu vậy, nó thông báo choInputDispatcher
về sự kiện cảm ứng. - 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
sẽ thông báo choInputDispatcher
về sự kiện Hover. - 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à điểm tương ứng và 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ó nên được gửi đi hay không và liệu chúng có nên đánh thức thiết bị hay không. Sau đó,InputDispatcher
cung cấp các sự kiện cho các ứng dụng thích hợp.
Chạm vào cấu hình thiết bị
Hành vi thiết bị cảm ứng được xác định bởi các trục, nút, thuộc tính đầu vào của thiết bị, cấu hình thiết bị đầu vào, bản đồ khóa ảo và bố cục khóa.
Tham khảo các phần sau để biết thêm chi tiết về các tệp tham gia cấu hình bàn phím:
Của cải
Hệ thống dựa trên nhiều thuộc tính cấu hình thiết bị đầu vào để định cấu hình và hiệu chỉnh hành vi thiết bị cảm ứng.
Một lý do cho điều này là các 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ác đặc điểm của cảm ứng bằ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 thang đo dành riêng cho thiết bị bên trong, chẳng hạn như tổng số nút cảm biến được kích hoạt bởi cảm ứng. Giá trị kích thước thô này sẽ không có ý nghĩa đối với các ứng dụng vì chúng sẽ cần biết về kích thước vật lý và các đặc điểm khác của các nút cảm biến thiết bị cảm ứng.
Hệ thống sử dụng các tham số hiệu chuẩn được mã hóa trong các tệp cấu hình thiết bị đầu vào để giải mã, biến đổi và bình thường hóa các giá trị được báo cáo bởi thiết bị cảm ứng 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.
Quy ước 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ị được sử dụng bởi hệ thố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ô được báo cáo bởi trình điều khiển thiết bị cảm ứng là các 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ó sẵn. -
raw.touchMajor
- Giá trị của trục
ABS_MT_TOUCH_MAJOR
hoặc 0 nếu không có sẵn. -
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ó sẵn. -
raw.toolMinor
- Giá trị của trục
ABS_MT_WIDTH_MINOR
hoặcraw.toolMajor
nếu không có sẵn. -
raw.orientation
- Giá trị của trục
ABS_MT_ORIENTATION
hoặc 0 nếu không có sẵn. -
raw.distance
- Giá trị của trục
ABS_DISTANCE
hoặcABS_MT_DISTANCE
hoặc 0 nếu không có sẵn. -
raw.tiltX
- Giá trị của trục
ABS_TILT_X
hoặc 0 nếu không có sẵn. -
raw.tiltY
- Giá trị của trục
ABS_TILT_Y
hoặc 0 nếu không có sẵn.
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ó được bằng cách gọi EVIOCGABS
IOCTL cho mỗi trục.
-
raw.*.min
- Giá trị tối thiểu bao gồm của trục thô.
-
raw.*.max
- Giá trị tối đa bao gồm của trục thô.
-
raw.*.range
- Tương đương với
raw.*.max - raw.*.min
. -
raw.*.fuzz
- Độ chính xác của trục thô. ví dụ. fuzz = 1 ngụ ý các giá trị là chính xác đến +/- 1 đơn vị.
-
raw.width
- Chiều rộng bao gồm của khu vực cảm ứng, tương đương với
raw.x.range + 1
. -
raw.height
- Chiều cao bao gồm của khu vực cảm ứng, tương đương với
raw.y.range + 1
.
Phạm vi đầu ra
Các biểu thức sau đây biểu thị các đặc điểm của hệ tọa độ đầu ra. Hệ thống sử dụng phép nội suy tuyến tính để dịch thông tin vị trí cảm ứng từ các đơn vị bề mặt được sử dụng bởi thiết bị cảm ứng vào các đơn vị đầ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. For touch screens (associated with a display), this is the display width in pixels. For touch pads (not associated with a display), the output width equals
raw.width
, indicating that no interpolation is performed. -
output.height
- The output height. For touch screens (associated with a display), this is the display height in pixels. For touch pads (not associated with a display), the output height equals
raw.height
, indicating that no interpolation is performed. -
output.diag
- The diagonal length of the output coordinate system, equivalent to
sqrt(output.width ^2 + output.height ^2)
.
Cấu hình cơ bản
The touch input mapper uses many configuration properties in the input device configuration file to specify calibration values. The following table describes some general purpose configuration properties. All other properties are described in the following sections along with the fields they are used to calibrate.
touch.deviceType
Definition: touch.deviceType
= touchScreen
| touchPad
| pointer
| default
Specifies the touch device type.
If the value is
touchScreen
, the touch device is a touch screen associated with a display.If the value is
touchPad
, the touch device is a touch pad not associated with a display.If the value is
pointer
, the touch device is a touch pad not associated with a display, and its motions are used for indirect multi-touch pointer gestures .If the value is
default
, the system automatically detects the device type according to the classification algorithm.
Refer to the Classification section for more details about how the device type influences the behavior of the touch device.
In Android 3 and lower, all touch devices were assumed to be touch screens.
touch.orientationAware
Definition: touch.orientationAware
= 0
| 1
Specifies whether the touch device should react to display orientation changes.
If the value is
1
, touch positions reported by the touch device are rotated whenever the display orientation changes.If the value is
0
, touch positions reported by the touch device are immune to display orientation changes.
The default value is 1
if the device is a touch screen, 0
otherwise.
The system distinguishes between internal and external touch screens and displays. An orientation aware internal touch screen is rotated based on the orientation of the internal display. An orientation aware external touch screen is rotated based on the orientation of the external display.
Orientation awareness is used to support rotation of touch screens on devices like the Nexus One. For example, when the device is rotated clockwise 90 degrees from its natural orientation, the absolute positions of touches are remapped such that a touch in the top-left corner of the touch screen's absolute coordinate system is reported as a touch in the top-left corner of the display's rotated coordinate system. This is done so that touches are reported with the same coordinate system that apps use to draw their visual elements.
Prior to Honeycomb, all touch devices were assumed to be orientation aware.
touch.gestureMode
Definition: touch.gestureMode
= pointer
| spots
| default
Specifies the presentation mode for pointer gestures. This configuration property is only relevant when the touch device is of type pointer .
If the value is
pointer
, the touch pad gestures are presented by way of a cursor similar to a mouse pointer.If the value is
spots
, the touch pad gestures are presented by an anchor that represents the centroid of the gesture and a set of circular spots that represent the position of individual fingers.
The default value is pointer
when the INPUT_PROP_SEMI_MT
input property is set, or spots
otherwise.
X and Y fields
The X and Y fields provide positional information for the center of the contact area.
Phép tính
The calculation is straightforward: positional information from the touch driver is linearly interpolated to the output coordinate system.
xScale = output.width / raw.width yScale = output.height / raw.height If not orientation aware or screen rotation is 0 degrees: output.x = (raw.x - raw.x.min) * xScale output.y = (raw.y - raw.y.min) * yScale Else If rotation is 90 degrees: output.x = (raw.y - raw.y.min) * yScale output.y = (raw.x.max - raw.x) * xScale Else If rotation is 180 degrees: output.x = (raw.x.max - raw.x) * xScale output.y = (raw.y.max - raw.y) * yScale Else If rotation is 270 degrees: output.x = (raw.y.max - raw.y) * yScale output.y = (raw.x - raw.x.min) * xScale End If
touchMajor, touchMinor, toolMajor, toolMinor, size fields
The touchMajor
and touchMinor
fields describe the approximate dimensions of the contact area in output units (pixels).
The toolMajor
and toolMinor
fields describe the approximate dimensions of the tool itself in output units (pixels).
The size
field describes the normalized size of the touch relative to the largest possible touch that the touch device can sense. The smallest possible normalized size is 0.0 (no contact, or it is unmeasurable), and the largest possible normalized size is 1.0 (sensor area is saturated).
When both the approximate length and breadth can be measured, then the touchMajor
field specifies the longer dimension and the touchMinor
field specifies the shorter dimension of the contact area. When only the approximate diameter of the contact area can be measured, then the touchMajor
and touchMinor
fields are equal.
Likewise, the toolMajor
field specifies the longer dimension and the toolMinor
field specifies the shorter dimension of the tool's cross-sectional area.
If the touch size is unavailable but the tool size is available, then the tool size is set equal to the touch size. Conversely, if the tool size is unavailable but the touch size is available, then the touch size is set equal to the tool size.
Touch devices measure or report the touch size and tool size in various ways. The current implementation supports three different kinds of measurements: diameter, area, and geometric bounding box in surface units.
Definition: touch.size.calibration
= none
| geometric
| diameter
| area
| default
Specifies the kind of measurement used by the touch driver to report the touch size and tool size.
If the value is
none
, the size is set to zero.If the value is
geometric
, the size is assumed to be specified in the same surface units as the position, so it is scaled in the same manner.If the value is
diameter
, the size is assumed to be proportional to the diameter (width) of the touch or tool.If the value is
area
, the size is assumed to be proportional to the area of the touch or tool.If the value is
default
, the system uses thegeometric
calibration if theraw.touchMajor
orraw.toolMajor
axis is available, otherwise it uses thenone
calibration.
touch.size.scale
Definition: touch.size.scale
= <a non-negative floating point number>
Specifies a constant scale factor used in the calibration.
The default value is 1.0
.
touch.size.bias
Definition: touch.size.bias
= <a non-negative floating point number>
Specifies a constant bias value used in the calibration.
The default value is 0.0
.
touch.size.isSummed
Definition: touch.size.isSummed
= 0
| 1
Specifies whether the size is reported as the sum of the sizes of all active contacts, or is reported individually for each contact.
If the value is
1
, the reported size is divided by the number of contacts prior to use.If the value is
0
, the reported size is used as is.
The default value is 0
.
Some touch devices, particularly "Semi-MT" devices cannot distinguish the individual dimensions of multiple contacts so they report a size measurement that represents their total area or width. This property should only be set to 1
for such devices. If in doubt, set this value to 0
.
Phép tính
The calculation of the touchMajor
, touchMinor
, toolMajor
, toolMinor
, and size
fields depends on the specified calibration parameters.
If raw.touchMajor and raw.toolMajor are available: touchMajor = raw.touchMajor touchMinor = raw.touchMinor toolMajor = raw.toolMajor toolMinor = raw.toolMinor Else If raw.touchMajor is available: toolMajor = touchMajor = raw.touchMajor toolMinor = touchMinor = raw.touchMinor Else If raw.toolMajor is available: touchMajor = toolMajor = raw.toolMajor touchMinor = toolMinor = raw.toolMinor Else touchMajor = toolMajor = 0 touchMinor = toolMinor = 0 size = 0 End If size = avg(touchMajor, touchMinor) If touch.size.isSummed == 1: touchMajor = touchMajor / numberOfActiveContacts touchMinor = touchMinor / numberOfActiveContacts toolMajor = toolMajor / numberOfActiveContacts toolMinor = toolMinor / numberOfActiveContacts size = size / numberOfActiveContacts End If If touch.size.calibration == "none": touchMajor = toolMajor = 0 touchMinor = toolMinor = 0 size = 0 Else If touch.size.calibration == "geometric": outputScale = average(output.width / raw.width, output.height / raw.height) touchMajor = touchMajor * outputScale touchMinor = touchMinor * outputScale toolMajor = toolMajor * outputScale toolMinor = toolMinor * outputScale Else If touch.size.calibration == "area": touchMajor = sqrt(touchMajor) touchMinor = touchMajor toolMajor = sqrt(toolMajor) toolMinor = toolMajor Else If touch.size.calibration == "diameter": touchMinor = touchMajor toolMinor = toolMajor End If If touchMajor != 0: output.touchMajor = touchMajor * touch.size.scale + touch.size.bias Else output.touchMajor = 0 End If If touchMinor != 0: output.touchMinor = touchMinor * touch.size.scale + touch.size.bias Else output.touchMinor = 0 End If If toolMajor != 0: output.toolMajor = toolMajor * touch.size.scale + touch.size.bias Else output.toolMajor = 0 End If If toolMinor != 0: output.toolMinor = toolMinor * touch.size.scale + touch.size.bias Else output.toolMinor = 0 End If output.size = size
pressure field
The pressure
field describes the approximate physical pressure applied to the touch device as a normalized value between 0.0 (no touch) and 1.0 (normal pressure).
A zero pressure indicates that the tool is hovering.
touch.pressure.calibration
Definition: touch.pressure.calibration
= none
| physical
| amplitude
| default
Specifies the kind of measurement used by the touch driver to report the pressure.
If the value is
none
, the pressure is unknown so it is set to 1.0 when touching and 0.0 when hovering.If the value is
physical
, the pressure axis is assumed to measure the actual physical intensity of pressure applied to the touch pad.If the value is
amplitude
, the pressure axis is assumed to measure the signal amplitude, which is related to the size of the contact and the pressure applied.If the value is
default
, the system uses thephysical
calibration if the pressure axis available, otherwise usesnone
.
touch.pressure.scale
Definition: touch.pressure.scale
= <a non-negative floating point number>
Specifies a constant scale factor used in the calibration.
The default value is 1.0 / raw.pressure.max
.
Phép tính
The calculation of the pressure
field depends on the specified calibration parameters.
If touch.pressure.calibration == "physical" or "amplitude": output.pressure = raw.pressure * touch.pressure.scale Else If hovering: output.pressure = 0 Else output.pressure = 1 End If End If
orientation and tilt fields
The orientation
field describes the orientation of the touch and tool as an angular measurement. An orientation of 0
indicates that the major axis is oriented vertically, -PI/2
indicates that the major axis is oriented to the left, PI/2
indicates that the major axis is oriented to the right. When a stylus tool is present, the orientation range can be described in a full circle range from -PI
or PI
.
The tilt
field describes the inclination of the tool as an angular measurement. A tilt of 0
indicates that the tool is perpendicular to the surface. A tilt of PI/2
indicates that the tool is flat on the surface.
touch.orientation.calibration
Definition: touch.orientation.calibration
= none
| interpolated
| vector
| default
Specifies the kind of measurement used by the touch driver to report the orientation.
- If the value is
none
, the orientation is unknown so it is set to 0. - If the value is
interpolated
, the orientation is linearly interpolated such that a raw value ofraw.orientation.min
maps to-PI/2
and a raw value ofraw.orientation.max
maps toPI/2
. The center value of(raw.orientation.min + raw.orientation.max) / 2
maps to0
. - If the value is
vector
, the orientation is interpreted as a packed vector consisiting of two signed 4-bit fields. This representation is used on Atmel Object Based Protocol parts. When decoded, the vector yields an orientation angle and confidence magnitude. The confidence magnitude is used to scale the size information, unless it is geometric. - If the value is
default
, the system uses theinterpolated
calibration if the orientation axis available, otherwise usesnone
.
Phép tính
The calculation of the orientation
and tilt
fields depends on the specified calibration parameters and available input.
If touch.tiltX and touch.tiltY are available: tiltXCenter = average(raw.tiltX.min, raw.tiltX.max) tiltYCenter = average(raw.tiltY.min, raw.tiltY.max) tiltXAngle = (raw.tiltX - tiltXCenter) * PI / 180 tiltYAngle = (raw.tiltY - tiltYCenter) * PI / 180 output.orientation = atan2(-sin(tiltXAngle), sinf(tiltYAngle)) output.tilt = acos(cos(tiltXAngle) * cos(tiltYAngle)) Else If touch.orientation.calibration == "interpolated": center = average(raw.orientation.min, raw.orientation.max) output.orientation = PI / (raw.orientation.max - raw.orientation.min) output.tilt = 0 Else If touch.orientation.calibration == "vector": c1 = (raw.orientation & 0xF0) >> 4 c2 = raw.orientation & 0x0F If c1 != 0 or c2 != 0: If c1 >= 8 Then c1 = c1 - 16 If c2 >= 8 Then c2 = c2 - 16 angle = atan2(c1, c2) / 2 confidence = sqrt(c1*c1 + c2*c2) output.orientation = angle If touch.size.calibration == "diameter" or "area": scale = 1.0 + confidence / 16 output.touchMajor *= scale output.touchMinor /= scale output.toolMajor *= scale output.toolMinor /= scale End If Else output.orientation = 0 End If output.tilt = 0 Else output.orientation = 0 output.tilt = 0 End If If orientation aware: If screen rotation is 90 degrees: output.orientation = output.orientation - PI / 2 Else If screen rotation is 270 degrees: output.orientation = output.orientation + PI / 2 End If End If
distance field
The distance
field describes the distance between the tool and the touch device surface. A value of 0.0 indicates direct contact and larger values indicate increasing distance from the surface.
touch.distance.calibration
Definition: touch.distance.calibration
= none
| scaled
| default
Specifies the kind of measurement used by the touch driver to report the distance.
If the value is
none
, the distance is unknown so it is set to 0.If the value is
scaled
, the reported distance is multiplied by a constant scale factor.If the value is
default
, the system uses thescaled
calibration if the distance axis available, otherwise usesnone
.
touch.distance.scale
Definition: touch.distance.scale
= <a non-negative floating point number>
Specifies a constant scale factor used in the calibration.
The default value is 1.0
.
Phép tính
The calculation of the distance
field depends on the specified calibration parameters.
If touch.distance.calibration == "scaled": output.distance = raw.distance * touch.distance.scale Else output.distance = 0 End If
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
Compatibility notes
The configuration properties for touch devices changed significantly in Android Ice Cream Sandwich 4.0. All input device configuration files for touch devices must be updated to use the new configuration properties.
Older touch device drivers might also need to be updated.
Virtual key map files
Touch devices can be used to implement virtual keys.
There are several ways of doing this, depending on the capabilities of the touch controller. Some touch controllers can be directly configured to implement soft keys by setting firmware registers. Other times it is desirable to perform the mapping from touch coordinates to key codes in software.
When virtual keys are implemented in software, the kernel must export a virtual key map file called virtualkeys.<devicename>
as a board property. For example, if the touch screen device drivers reports its name as "touchyfeely" then the virtual key map file must have the path /sys/board_properties/virtualkeys.touchyfeely
.
A virtual key map file describes the coordinates and Linux key codes of virtual keys on the touch screen.
In addition to the virtual key map file, there must be a corresponding key layout file and key character map file to map the Linux key codes to Android key codes and to specify the type of the keyboard device (usually SPECIAL_FUNCTION
).
Cú pháp
A virtual key map file is a plain text file consisting of a sequence of virtual key layout descriptions either separated by newlines or by colons.
Comment lines begin with '#' and continue to the end of the line.
Each virtual key is described by 6 colon-delimited components:
-
0x01
: A version code. Must always be0x01
. - <Linux key code>: The Linux key code of the virtual key.
- <centerX>: The X pixel coordinate of the center of the virtual key.
- <centerY>: The Y pixel coordinate of the center of the virtual key.
- <width>: The width of the virtual key in pixels.
- <height>: The height of the virtual key in pixels.
All coordinates and sizes are specified in terms of the display coordinate system.
Here is a virtual key map file all written on one line.
# All on one line 0x01:158:55:835:90:55:0x01:139:172:835:125:55:0x01:102:298:835:115:55:0x01:217:412:835:95:55
The same virtual key map file can also be written on multiple lines.
# One key per line 0x01:158:55:835:90:55 0x01:139:172:835:125:55 0x01:102:298:835:115:55 0x01:217:412:835:95:55
In the above example, the touch screen has a resolution of 480x800. Accordingly, all of the virtual keys have a <centerY> coordinate of 835, which is a little bit below the visible area of the touch screen.
The first key has a Linux scan code of 158
( KEY_BACK
), centerX of 55
, centerY of 835
, width of 90
, and height of 55
.
Ví dụ
Virtual key map file: /sys/board_properties/virtualkeys.touchyfeely
.
0x01:158:55:835:90:55 0x01:139:172:835:125:55 0x01:102:298:835:115:55 0x01:217:412:835:95:55
Key layout file: /system/usr/keylayout/touchyfeely.kl
.
key 158 BACK key 139 MENU key 172 HOME key 217 SEARCH
Key character map file: /system/usr/keychars/touchyfeely.kcm
.
type SPECIAL_FUNCTION
Indirect multi-touch pointer gestures
In pointer mode, the system interprets the following gestures:
- Single finger tap: click.
- Single finger motion: move the pointer.
- Single finger motion plus button presses: drag the pointer.
- Two finger motion both fingers moving in the same direction: drag the area under the pointer in that direction. The pointer itself does not move.
- Two finger motion both fingers moving towards each other or apart in different directions: pan/scale/rotate the area surrounding the pointer. The pointer itself does not move.
- Multiple finger motion: freeform gesture.
Từ chối cọ
As of Android 13, the system can automatically reject inputs from palms when the built-in framework is enabled. In-house, custom-built solutions are still supported, though they might need to be modified to return the TOOL_TYPE_PALM
flag when a palm is detected. The built-in framework also works in conjunction with custom solutions.
The actual model looks at the first 90 ms of gesture data, at the current pointer, and at the surrounding pointers, then considers how far away from the display edge the touches are. It then determines, on a per-pointer basis, which of the pointers are palms. It also takes into account the size of each contact, as reported by touchMajor
and touchMinor
. The Android framework then removes the pointers that are marked as palms from the touch stream.
If a pointer was already sent to the apps, then the system either:
- (If there are other active pointers) Cancels the pointer with
ACTION_POINTER_UP
andFLAG_CANCELED
set. - (If this is the only pointer) Cancels the pointer with
ACTION_CANCEL
.
A public API, MotionEvent.FLAG_CANCELED
, indicates that the current event shouldn't trigger user action. This flag is set for both ACTION_CANCEL
and ACTION_POINTER_UP
.
If the palm pointer wasn't sent to apps, then the system simply drops the pointer.
Enable palm rejection
- In your touch driver, use the
input_abs_set_res
macro to set the resolutions for the following fields (units are pixels per mm ):-
ABS_MT_POSITION_X
-
ABS_MT_POSITION_Y
-
ABS_MT_TOUCH_MAJOR
-
ABS_MT_TOUCH_MINOR
Support for
ABS_MT_TOUCH_MINOR
is optional. However, if your device does support it, make sure the resolution is set correctly. -
- To confirm the fields are set correctly, run:
$ adb shell getevent -li
- To enable the feature during runtime, run:
$ adb shell device_config put input_native_boot palm_rejection_enabled 1
- Restart the
system_server
process.$ adb shell stop && adb shell start
- Confirm that
adb shell dumpsys input
shows that there are palm rejectors insideUnwantedInteractionBlocker
. If it doesn't, check the input-related logs to find clues on what might be misconfigured.See the following example for reference:
UnwantedInteractionBlocker: mEnablePalmRejection: true isPalmRejectionEnabled (flag value): true mPalmRejectors: deviceId = 3: mDeviceInfo: max_x =
max_y = x_res = 11.00 y_res = 11.00 major_radius_res = 1.00 minor_radius_res = 1.00 minor_radius_supported = true touch_major_res = 1 touch_minor_res = 1 mSlotState: mSlotsByPointerId: mPointerIdsBySlot: mSuppressedPointerIds: {} - To permanently enable the feature, add the corresponding sysprop command in your
init**rc
file:setprop persist.device_config.input_native_boot.palm_rejection_enabled 1