Android 多點觸控介面
簡介
為了使用功能強大的多點觸控裝置,就需要一種方案去上報使用者層所需的詳細的手指觸控資料。這個文件所描述的多點觸控協議可以讓核心驅動程式向使用者層上報任意多指的資料資訊。
使用說明
單點觸控資訊是以ABS承載並按一定順序傳送,如BTN_TOUCH、ABS_X、ABS_Y、SYNC。而多點觸控資訊則是以ABS_MT承載並按一定順序傳送,如ABS_MT_POSITION_X、ABS_MT_POSITION_Y,然後通過呼叫input_mt_sync()產生一個 SYN_MT_REPORT event來標記一個點的結束,告訴接收方接收當前手指的資訊並準備接收其它手指的觸控資訊。最後呼叫 input_sync()函式上報觸控資訊開始動作並告訴接收方開始接收下一系列多點觸控資訊。
協議定義了一系列ABS_MT事件,這些事件被分為幾大類,充許只應用其中的一部份,多點觸控最小的事件集中應包括ABS_MT_TOUCH_MAJOR、ABS_MT_POSITION_X和 ABS_MT_POSITION_Y,以此來實現多點觸控。如果裝置支援ABS_MT_WIDTH_MAJOR這個事件,那麼此事件可以提供手指觸控接觸面積大小。觸控方向等資訊可以由ABS_MT_TOUCH_MINOR, ABS_MT_WIDTH_MINOR and ABS_MT_ORIENTATION提供。ABS_MT_TOOL_TYPE提供觸控裝置的類別,如手或是筆或是其它。最後有些裝置可能會支援ABS_MT_TRACKING_ID,用來支援硬體跟蹤多點資訊,即該點屬於哪一條線等。
下面是兩點觸控支援的最小事件集序列:
ABS_MT_TOUCH_MAJOR
ABS_MT_POSITION_X
ABS_MT_POSITION_Y
SYN_MT_REPORT //上報第一個點
ABS_MT_TOUCH_MAJOR
ABS_MT_POSITION_X
ABS_MT_POSITION_Y
SYN_MT_REPORT //上報第二個點
SYN_REPORT //開始動作
Event 原語
“接觸”一詞用來描述一個物體直接碰到另一個物體的表面。
ABS_MT_TOUCH_MAJOR描述了主接觸面的長軸,它和X,Y同一個單位,如果一個面的解析度為X*Y,則ABS_MT_TOUCH_MAJOR的最大值為sqrt(X^2+Y^2)
ABS_MT_TOUCH_MINOR描述了接觸面的短軸,如果接觸面是圓形,它可以不用。
ABS_MT_WIDTH_MAJOR描述了接觸工具的長軸
ABS_MT_WIDTH_MINOR描述了接觸工具的短軸
ABS_MT_TOUCH_MAJOR := max(X, Y)
ABS_MT_TOUCH_MINOR := min(X, Y)
ABS_MT_ORIENTATION := bool(X > Y)
以上四個引數可以用來生成額外的觸控資訊,如ABS_MT_TOUCH_MAJOR/ABS_MT_WIDTH_MAJOR的比率可以用來描述壓力。
ABS_MT_ORIENTATION
ABS_MT_POSITION_X接觸面的中心點X座標
ABS_MT_POSITION_Y接觸面的中心點Y座標
ABS_MT_TOOL_TYPE描述接觸工具型別,很多核心驅動無法區分此引數如手指及筆,如果是這樣,該引數可以不用,協議目前支援MT_TOOL_FINGER和MT_TOOL_PEN兩種型別。
ABS_MT_BLOB_ID形狀集ID,集合幾個點以描述一個形狀,很多驅動沒有形狀屬性,此引數可以不用。
ABS_MT_TRACKING_ID描述了從接觸開始到釋放的整個過程的集合,如果裝置不支援,此引數可是不用。
觸控軌跡
僅有少數裝置可以明觸的標識真實的 trackingID,多數情況下 trackingID只能來標識一次觸控動作的過程。
手勢
多點觸控指定的應用是建立手勢動作, TOUCH和 WIDTH引數經常用來區別手指的壓力和手指間的距離,另外 MINOR類的引數可以用來區別裝置的接觸面的大小(點接觸還是面接觸),ORIENTATION可以產生旋轉事件。
===============================================================================================================
在Linux核心支援的基礎上,Android在其2.0原始碼中加入多點觸控功能。由此觸控式螢幕在Android的frameworks被完全分為2種實現途徑:單點觸控式螢幕的單點方式,多點觸控式螢幕的單點和多點方式。
在Linux的input.h中,多點觸控功能依賴於以下幾個主要的軟體位:
……………………….. #define SYN_REPORT0 #define SYN_CONFIG1 #define SYN_MT_REPORT2 ………………………... #define ABS_MT_TOUCH_MAJOR0x30/* Major axis of touching ellipse */ #define ABS_MT_TOUCH_MINOR0x31/* Minor axis (omit if circular) */ #define ABS_MT_WIDTH_MAJOR0x32/* Major axis of approaching ellipse */ #define ABS_MT_WIDTH_MINOR0x33/* Minor axis (omit if circular) */ #define ABS_MT_ORIENTATION0x34/* Ellipse orientation */ #define ABS_MT_POSITION_X0x35/* Center X ellipse position */ #define ABS_MT_POSITION_Y0x36/* Center Y ellipse position */ #define ABS_MT_TOOL_TYPE0x37/* Type of touching device */ #define ABS_MT_BLOB_ID0x38/* Group a set of packets as a blob */ ………………………… |
在Android中對應的軟體位定義在RawInputEvent.java中:
………………….. public class RawInputEvent { ………………. public static final int CLASS_TOUCHSCREEN_MT = 0x00000010; ……………….. public static final int ABS_MT_TOUCH_MAJOR = 0x30; public static final int ABS_MT_TOUCH_MINOR = 0x31; public static final int ABS_MT_WIDTH_MAJOR = 0x32; public static final int ABS_MT_WIDTH_MINOR = 0x33; public static final int ABS_MT_ORIENTATION = 0x34; public static final int ABS_MT_POSITION_X = 0x35; public static final int ABS_MT_POSITION_Y = 0x36; public static final int ABS_MT_TOOL_TYPE = 0x37; public static final int ABS_MT_BLOB_ID = 0x38; …………………. public static final int SYN_REPORT = 0; public static final int SYN_CONFIG = 1; public static final int SYN_MT_REPORT = 2; ……………….. |
在Android中,多點觸控的實現方法在具體的程式碼實現中和單點是完全區分開的。在Android程式碼的EventHub.cpp中,單點屏和多點屏由如下程式碼段來判定:
int EventHub::open_device(const char *deviceName) { ……………………… if (test_bit(ABS_MT_TOUCH_MAJOR, abs_bitmask) && test_bit(ABS_MT_POSITION_X, abs_bitmask) && test_bit(ABS_MT_POSITION_Y, abs_bitmask)) { device->classes |= CLASS_TOUCHSCREEN | CLASS_TOUCHSCREEN_MT; //LOGI("It is a multi-touch screen!"); } //single-touch? else if (test_bit(BTN_TOUCH, key_bitmask) && test_bit(ABS_X, abs_bitmask) && test_bit(ABS_Y, abs_bitmask)) { device->classes |= CLASS_TOUCHSCREEN; //LOGI("It is a single-touch screen!"); } ……………….. } |
我們知道,在觸控式螢幕驅動中,通常在probe函式中會呼叫input_set_abs_params給裝置的input_dev結構體初始化,這些input_dev的引數會在Android的EventHub.cpp中被讀取。如上可知,如果我們的觸控式螢幕想被當成多點屏被處理,只需要在驅動中給input_dev額外增加以下幾個引數即可:
input_set_abs_params(mcs_data.input, ABS_MT_POSITION_X, pdata->abs_x_min, pdata->abs_x_max, 0, 0); input_set_abs_params(mcs_data.input, ABS_MT_POSITION_Y, pdata->abs_y_min, pdata->abs_y_max, 0, 0); input_set_abs_params(mcs_data.input, ABS_MT_TOUCH_MAJOR, 0, 15, 0, 0); //相當於單點屏的ABX_PRESSURE input_set_abs_params(mcs_data.input, ABS_MT_WIDTH_MAJOR, 0, 15, 0, 0); //相當於單點屏的ABS_TOOL_WIDTH |
由於多點觸控技術需要採集到多個點,然後再一起處理這些點,所以在軟體實現中需要保證每一波點的準確性和完整性。因此,Linux核心提供了input_mt_sync(struct input_dev * input)函式。在每波的每個點上報後需要緊跟一句input_mt_sync(), 當這波所有點上報後再使用input_sync()進行同步。例如一波要上報3個點:
/* 上報點1*/ …………….. input_mt_sync(input); /* 上報點2*/ …………….. input_mt_sync(input); /* 上報點3*/ …………….. input_mt_sync(input); input_sync(input); |
相關文章
- scaleform mobile sdk for android 多點觸控 修正ORMAndroid
- android 處理多點觸控手勢Android
- 【朝花夕拾】Android自定義View篇之(八)多點觸控AndroidView
- 多點觸控式螢幕驅動
- Android事件傳遞、多點觸控及滑動衝突的處理Android事件
- 新鮮出爐:appium2.0+ 單點觸控和多點觸控新的解決方案APP
- 多點觸控手勢增強神器:Multitouch for MacMac
- Android觸控事件(續)——點選長按事件Android事件
- 【朝花夕拾】Android自定義View篇之(八)多點觸控(上)MotionEvent簡介AndroidView
- 多點觸控手勢增強軟體Multitouch for MacMac
- 【Unity】unity3d FingerGestures 單點 多點觸控 手勢Unity3D
- lenovothinkpadt460sopensuselinux下禁用多點觸控屏ThinkPadLinux
- android 自定義ImageView實現圖片手勢滑動,多點觸控放大縮小效果AndroidView
- 設定單點觸控splitMotionEvents
- Android觸控事件的應用Android事件
- Multitouch for Mac(多點觸控手勢增強神器)1.27.14啟用版Mac
- WPF進階技巧和實戰09-事件(2-多點觸控)事件
- android 觸控(Touch)事件、點選(Click)事件的區別(詳細解析)Android事件
- Android觸控事件傳遞機制Android事件
- Android 觸控式螢幕驅動Android
- Android中TouchEvent觸控事件機制Android事件
- Android 觸控事件處理機制Android事件
- 《HTML5觸控介面設計與開發》——1.4 神祕谷,是什麼讓觸控介面反應靈敏?HTML
- Windows 8觸控介面設計指南(中文版)Windows
- Android觸控事件(上)——事件的由來Android事件
- Android觸控事件(下)——事件的分發Android事件
- android 管理ViewGroup中的觸控事件AndroidView事件
- 觸控事件事件
- Android中觸控事件的傳遞機制Android事件
- 初識Android觸控事件傳遞機制Android事件
- Multitouch for Mac(多點觸控手勢增強神器) v1.20.4免啟用版Mac
- 多點觸控技術在數字展廳設計中的應用價值
- 多點觸控手勢增強神器:Multitouch for Mac v1.27.23免啟用版Mac
- 多點觸控手勢增強神器:Multitouch for Mac v1.27.22免啟用版Mac
- Unity觸控式螢幕觸控事件定義Unity事件
- wpf 觸控 觸控後無法開啟pupup
- Windows7可能採用觸控式使用者介面Windows
- iPhone XS怎麼開啟輔助觸控小白點?蘋果iPhone螢幕輔助觸控使用教程iPhone蘋果