Android input觸摸屏設(shè)備

轉(zhuǎn)自 https://www.kotlintc.com/articles/4709 侵刪

Android支持各種觸摸屏和觸摸板,包括基于觸控筆的數(shù)字化板。

觸摸屏是與顯示屏相關(guān)聯(lián)的觸摸設(shè)備红省,使用戶能夠在屏幕上直接操縱內(nèi)容浓恳。

觸摸板是不與顯示屏相關(guān)聯(lián)的觸摸設(shè)備(如數(shù)字化板)。觸摸板通常用于指控或絕對間接定位或基于手勢的界面控制型雳。

觸摸設(shè)備可能具有功能與鼠標(biāo)按鈕類似的按鈕萍摊。

有時可以使用各種不同的工具(如手指或觸控筆)操作觸摸設(shè)備挤茄,具體取決于底層的觸摸傳感器技術(shù)。

觸摸設(shè)備有時用于實現(xiàn)虛擬按鍵冰木。例如穷劈,在某些Android設(shè)備上,觸摸屏傳感器區(qū)域延伸超出顯示屏的邊緣踊沸,作為觸摸式鍵盤的一部分發(fā)揮雙重作用歇终。

由于觸摸設(shè)備種類繁多,Android依賴于大量配置屬性來描述每個設(shè)備的特征和期望的行為雕沿。

觸摸設(shè)備分類:

如果同時滿足以下兩個條件练湿,則輸入設(shè)備屬于多點觸控設(shè)備:

輸入設(shè)備報告存在ABS_MT_POSITION_X和ABS_MT_POSITION_Y絕對軸。

輸入設(shè)備沒有任何游戲手柄按鈕审轮。某些游戲手柄會使用與M 軸的代碼重疊的代碼來報告軸肥哎,而這一條件則消除了這種歧義辽俗。

如果同時滿足以下兩個條件,則輸入設(shè)備屬于單點觸控設(shè)備:

輸入設(shè)備不屬于多點觸控設(shè)備篡诽。輸入設(shè)備要么屬于單點觸控設(shè)備崖飘,要么屬于多點觸控設(shè)備,而不會同時屬于這兩種類別杈女。

輸入設(shè)備報告存在ABS_X和ABS_Y絕對軸以及BTN_TOUCH按鍵代碼朱浴。

一旦輸入設(shè)備屬于觸摸設(shè)備,則通過嘗試加載設(shè)備的虛擬按鍵映射文件來確定是否存在虛擬按鍵达椰。如果存在虛擬按鍵映射翰蠢,則還會加載設(shè)備的按鍵布局文件。

有關(guān)虛擬按鍵映射文件的位置和格式啰劲,請參閱下面的部分梁沧。

接下來,系統(tǒng)會加載觸摸設(shè)備的輸入設(shè)備配置文件蝇裤。

所有內(nèi)置觸摸設(shè)備都應(yīng)具有輸入設(shè)備配置文件廷支。如果沒有輸入設(shè)備配置文件,則系統(tǒng)將選擇適用于典型通用觸摸外設(shè)(如外部USB或藍(lán)牙HID觸摸屏或觸摸板)的默認(rèn)配置栓辜。這些默認(rèn)配置不適用于內(nèi)置觸摸屏恋拍,很可能會導(dǎo)致錯誤的行為。

加載輸入設(shè)備配置后藕甩,系統(tǒng)會將輸入設(shè)備分類為觸摸屏施敢、觸摸板或指控設(shè)備。

觸摸屏設(shè)備用于直接操縱屏幕上的對象辛萍。由于用戶直接觸摸屏幕悯姊,因此系統(tǒng)不需要任何額外的感知性來指示被操縱的對象羡藐。

觸摸板設(shè)備用于向應(yīng)用提供關(guān)于在給定傳感器區(qū)域上進(jìn)行觸摸時的絕對定位信息贩毕。它可能對數(shù)字化板有用。

指控設(shè)備用于使用光標(biāo)間接操縱屏幕上的對象仆嗦。手指被解釋為多點觸控指控手勢辉阶。其他工具(如觸控筆)則通過絕對位置來解釋。

有關(guān)詳情瘩扼,請參閱間接多點觸控指控手勢谆甜。

以下規(guī)則用于將輸入設(shè)備分類為觸摸屏、觸摸板或指控設(shè)備集绰。

如果設(shè)置了touch.deviceType屬性规辱,則將按照指示設(shè)置設(shè)備類型。

如果輸入設(shè)備報告存在 INPUT_PROP_DIRECT 輸入屬性(通過 EVIOCGPROP ioctl)栽燕,則設(shè)備類型將設(shè)置為觸摸屏罕袋。該條件假設(shè)直接輸入觸摸設(shè)備已連接到同樣處于連接狀態(tài)的顯示屏改淑。

如果輸入設(shè)備報告存在 INPUT_PROP_POINTER 輸入屬性(通過 EVIOCGPROP ioctl),則設(shè)備類型將設(shè)置為指控設(shè)備浴讯。

如果輸入設(shè)備報告存在REL_X或REL_Y相對軸朵夏,則設(shè)備類型將設(shè)置為觸摸板。該條件消除了由鼠標(biāo)和觸摸板組成的輸入設(shè)備存在的歧義榆纽。在這種情況下仰猖,觸摸板不會用于控制指針,因為鼠標(biāo)已經(jīng)在控制它奈籽。

否則饥侵,設(shè)備類型將被設(shè)置為指控設(shè)備。該默認(rèn)設(shè)置確保沒有指定任何其他特殊用途的觸摸板將用于控制指針衣屏。

按鈕:

按鈕是可供應(yīng)用用來執(zhí)行其他功能的“可選”控件爆捞。觸摸設(shè)備上的按鈕與鼠標(biāo)按鈕類似,主要與“指針式”觸摸設(shè)備或者觸控筆配合使用勾拉。

支持以下按鈕:

BTN_LEFT:映射到MotionEvent.BUTTON_PRIMARY煮甥。

BTN_RIGHT:映射到MotionEvent.BUTTON_SECONDARY。

BTN_MIDDLE:映射到MotionEvent.BUTTON_MIDDLE藕赞。

BTN_BACK和BTN_SIDE:映射到MotionEvent.BUTTON_BACK成肘。按此按鈕還可以合成按鍵(使用按鍵代碼KeyEvent.KEYCODE_BACK)。

BTN_FORWARD和BTN_EXTRA:映射到MotionEvent.BUTTON_FORWARD斧蜕。按此按鈕還可以合成按鍵(使用按鍵代碼 KeyEvent.KEYCODE_FORWARD)双霍。

BTN_STYLUS:映射到MotionEvent.BUTTON_SECONDARY。

BTN_STYLUS2:映射到MotionEvent.BUTTON_TERTIARY批销。

工具和工具類型:

“工具”是指用于和觸摸設(shè)備進(jìn)行交互的手指洒闸、觸控筆或其他裝置。有些觸摸設(shè)備可以區(qū)分不同類型的工具均芽。

在Android的其他位置(和在MotionEvent API中一樣)丘逸,“工具”通常被稱為“指針”。

支持以下工具類型:

BTN_TOOL_FINGER和MT_TOOL_FINGER:映射到MotionEvent.TOOL_TYPE_FINGER掀宋。

BTN_TOOL_PEN和MT_TOOL_PEN:映射到MotionEvent.TOOL_TYPE_STYLUS深纲。

BTN_TOOL_RUBBER:映射到MotionEvent.TOOL_TYPE_ERASER。

BTN_TOOL_BRUSH:映射到MotionEvent.TOOL_TYPE_STYLUS劲妙。

BTN_TOOL_PENCIL:映射到MotionEvent.TOOL_TYPE_STYLUS湃鹊。

BTN_TOOL_AIRBRUSH:映射到MotionEvent.TOOL_TYPE_STYLUS。

BTN_TOOL_MOUSE:映射到MotionEvent.TOOL_TYPE_MOUSE镣奋。

BTN_TOOL_LENS:映射到MotionEvent.TOOL_TYPE_MOUSE币呵。

BTN_TOOL_DOUBLETAP、BTN_TOOL_TRIPLETAP 和 BTN_TOOL_QUADTAP:映射到MotionEvent.TOOL_TYPE_FINGER侨颈。

懸停與觸摸工具:

工具可以與觸摸設(shè)備接觸余赢,也可以在觸摸設(shè)備的感應(yīng)范圍內(nèi)懸停在設(shè)備的上方掸驱。并非所有觸摸設(shè)備都能夠感應(yīng)到懸停在其上方的工具。那些可實現(xiàn)感應(yīng)的觸摸設(shè)備(如基于射頻的觸控筆數(shù)字化儀)通常能在工具進(jìn)入其有限的感應(yīng)范圍后檢測到該工具没佑。

InputReader 組件會謹(jǐn)慎區(qū)分觸摸工具和懸停工具毕贼。同樣,觸摸工具和懸停工具也會以不同的方式報告給應(yīng)用蛤奢。

觸摸工具將通過以下組件作為觸摸事件報告給應(yīng)用:MotionEvent.ACTION_DOWN鬼癣、MotionEvent.ACTION_MOVE、MotionEvent.ACTION_DOWN啤贩、MotionEvent.ACTION_POINTER_DOWN 和 MotionEvent.ACTION_POINTER_UP待秃。

懸停工具將通過以下組件作為通用動作事件報告給應(yīng)用:MotionEvent.ACTION_HOVER_ENTER、MotionEvent.ACTION_HOVER_MOVE和MotionEvent.ACTION_HOVER_EXIT痹屹。

觸摸設(shè)備驅(qū)動程序要求:

觸摸設(shè)備驅(qū)動程序應(yīng)該僅注冊它們實際支持的軸/按鈕的軸/按鍵代碼章郁。如果注冊多余的軸/按鍵代碼,則可能會混淆設(shè)備分類算法或?qū)е孪到y(tǒng)錯誤地檢測設(shè)備的功能志衍。

例如暖庄,如果設(shè)備報告BTN_TOUCH按鍵代碼,系統(tǒng)會假設(shè)BTN_TOUCH將始終用于指示該工具是實際觸摸屏幕還是只在感應(yīng)范圍內(nèi)懸停楼肪。

單點觸控設(shè)備使用以下Linux輸入事件:

ABS_X:(必需)報告工具的X坐標(biāo)培廓。

ABS_Y:(必需)報告工具的Y坐標(biāo)。

ABS_PRESSURE:(可選)報告應(yīng)用于工具尖端的物理壓力或觸摸點的信號強(qiáng)度春叫。

ABS_TOOL_WIDTH:(可選)報告觸摸點或工具本身的橫截面積或?qū)挾取?/p>

ABS_DISTANCE:(可選)報告工具與觸摸設(shè)備表面之間的距離肩钠。

ABS_TILT_X:(可選)報告工具沿觸摸設(shè)備表面X軸方向的傾斜度。

ABS_TILT_Y:(可選)報告工具沿觸摸設(shè)備表面Y軸方向的傾斜度暂殖。

BTN_TOUCH:(必需)指示工具是否觸摸到設(shè)備价匠。

BTN_LEFT、BTN_RIGHT呛每、BTN_MIDDLE踩窖、BTN_BACK、BTN_SIDE莉给、BTN_FORWARD毙石、BTN_EXTRA廉沮、BTN_STYLUS颓遏、BTN_STYLUS2:(可選)報告按鈕狀態(tài)。

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:(可選)報告工具類型顷帖。

多點觸控設(shè)備使用以下Linux輸入事件:

ABS_MT_POSITION_X:必需美旧,報告工具的X坐標(biāo)。

ABS_MT_POSITION_Y:必需贬墩,報告工具的Y坐標(biāo)榴嗅。

ABS_MT_PRESSURE:可選,報告應(yīng)用于工具尖端的物理壓力或觸摸點的信號強(qiáng)度陶舞。

ABS_MT_TOUCH_MAJOR:可選嗽测,報告觸摸點的橫截面積或觸摸點間較長尺寸的長度。

ABS_MT_TOUCH_MINOR:可選肿孵,報告觸摸點間較短尺寸的長度唠粥。如果ABS_MT_TOUCH_MAJOR報告區(qū)域測量,則不應(yīng)使用此軸停做。

ABS_MT_WIDTH_MAJOR:可選厅贪,報告工具本身的橫截面積或工具本身較長尺寸的長度。如果工具本身的尺寸未知雅宾,則不應(yīng)使用此軸养涮。

ABS_MT_WIDTH_MINOR:可選,報告工具本身較短尺寸的長度眉抬。如果ABS_MT_WIDTH_MAJOR報告區(qū)域測量或者工具本身的尺寸未知贯吓,則不應(yīng)使用此軸。

ABS_MT_ORIENTATION:可選蜀变,報告工具的方向悄谐。

ABS_MT_DISTANCE:可選,報告工具與觸摸設(shè)備表面之間的距離库北。

ABS_MT_TOOL_TYPE:可選爬舰,將工具類型報告為MT_TOOL_FINGER或MT_TOOL_PEN。

ABS_MT_TRACKING_ID:可選寒瓦,報告工具的跟蹤ID情屹。跟蹤ID是一個任意的非負(fù)整數(shù)。當(dāng)多個工具同時處于活動狀態(tài)時杂腰,該ID用于獨立地識別和跟蹤各個工具垃你。例如,當(dāng)多個手指同時觸摸設(shè)備時,會為每個手指分配一個不同的跟蹤ID惜颇,用于在手指保持接觸期間識別手指皆刺。跟蹤ID可在其關(guān)聯(lián)的工具移出感應(yīng)范圍后重復(fù)使用。

ABS_MT_SLOT:可選凌摄,在使用Linux多點觸控協(xié)議“B”時羡蛾,報告工具的槽位ID。有關(guān)詳情锨亏,請參閱Linux多點觸控協(xié)議文檔林说。

BTN_TOUCH:必需,指示工具是否觸摸到設(shè)備屯伞。

BTN_LEFT腿箩、BTN_RIGHT、BTN_MIDDLE劣摇、BTN_BACK珠移、BTN_SIDE、BTN_FORWARD末融、BTN_EXTRA钧惧、BTN_STYLUS、BTN_STYLUS2:可選勾习,報告按鈕狀態(tài)浓瞪。

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:可選毅人,報告工具類型吭狡。

如果同時定義了單點觸控協(xié)議軸和多點觸控協(xié)議軸,則僅使用多點觸控軸丈莺,并忽略單點觸控軸划煮。

ABS_X、ABS_Y场刑、ABS_MT_POSITION_X和ABS_MT_POSITION_Y 軸的最小值和最大值用于在特定于設(shè)備的Surface單元內(nèi)指定設(shè)備有效區(qū)域的范圍般此。如果是觸摸屏蚪战,有效區(qū)域是指觸摸設(shè)備實際覆蓋顯示屏的部分牵现。

對于觸摸屏铐懊,系統(tǒng)會自動插入報告的觸摸位置(在Surface單元內(nèi)),以通過以下公式計算得出采用顯示像素表示的觸摸位置:

displayX = (x - minX) * displayWidth / (maxX - minX + 1)

displayY = (y - minY) * displayHeight / (maxY - minY + 1)

觸摸屏可能會報告在報告的有效區(qū)域之外發(fā)起的觸摸瞎疼。

在有效區(qū)域之外發(fā)起的觸摸不會傳遞給應(yīng)用科乎,但可用于虛擬按鍵。

在有效區(qū)域內(nèi)發(fā)起的觸摸或進(jìn)入和退出顯示區(qū)域的觸摸會傳遞給應(yīng)用贼急。因此茅茂,如果觸摸是在應(yīng)用的范圍內(nèi)開始,然后移動到有效區(qū)域之外太抓,則應(yīng)用可能會收到顯示坐標(biāo)為負(fù)或超出顯示范圍的觸摸事件空闲。這屬于正常現(xiàn)象走敌。

觸摸設(shè)備不得限制有效區(qū)域的觸摸坐標(biāo)邊界碴倾。如果觸摸退出有效區(qū)域,則應(yīng)將其報告為超出有效區(qū)域范圍掉丽,或者根本不應(yīng)報告跌榔。

例如,如果用戶的手指在觸摸屏左上角附近觸摸捶障,則可能會報告(minX, minY)坐標(biāo)僧须。如果手指繼續(xù)移動到有效區(qū)域之外,觸摸屏應(yīng)該開始報告分量小于minX和min 的坐標(biāo)(如(minX - 2, minY - 3))项炼,或者完全停止報告觸摸担平。換句話說,當(dāng)用戶的手指確實觸摸到有效區(qū)域之外時锭部,觸摸屏不應(yīng)該報告(minX, minY)驱闷。

如果將觸摸坐標(biāo)限制到顯示屏邊緣,則會在屏幕邊緣周圍產(chǎn)生人為硬邊界空免,阻止系統(tǒng)順暢地跟蹤進(jìn)入或退出顯示區(qū)域邊界的運動空另。

ABS_PRESSURE或ABS_MT_PRESSURE報告的值(如果有報告)在工具觸摸設(shè)備時必須為非零值;否則就為零蹋砚,表示該工具處于懸停狀態(tài)扼菠。

報告壓力信息為可選項,但強(qiáng)烈建議報告該信息坝咐。應(yīng)用可以使用壓力信息來實現(xiàn)壓敏繪圖等效果循榆。

ABS_TOOL_WIDTH、ABS_MT_TOUCH_MAJOR墨坚、ABS_MT_TOUCH_MINOR秧饮、ABS_MT_WIDTH_MAJOR或ABS_MT_WIDTH_MINOR報告的值在工具觸摸設(shè)備時應(yīng)為非零值;否則就為零,但這不是必需的盗尸。例如柑船,觸摸設(shè)備可能能夠測量手指觸摸點的尺寸,但不能測量觸控筆觸摸點的尺寸泼各。

報告大小信息為可選項鞍时,但強(qiáng)烈建議報告。應(yīng)用可以使用壓力信息來實現(xiàn)尺寸敏感繪圖等效果扣蜻。

ABS_DISTANCE或ABS_MT_DISTANCE報告的值在工具觸摸設(shè)備時應(yīng)接近零逆巍。即使當(dāng)工具處于直接接觸時,距離仍可能為非零莽使。報告的確切值取決于硬件測量距離的方式锐极。

報告距離信息為可選項,但建議用于觸控筆設(shè)備芳肌。

當(dāng)工具垂直于設(shè)備時灵再,ABS_TILT_X和ABS_TILT_Y報告的值應(yīng)為零。將非零傾斜作為工具保持在傾斜處的標(biāo)志庇勃。

假定沿X軸和Y軸的傾斜角度以與垂直方向的夾角計檬嘀。中心點(完全垂直)由每個軸的(max + min) / 2指定。小于中心點的值表示向上或向左傾斜责嚷,大于中心點的值表示向下或向右傾斜鸳兽。

InputReader將X和Y傾斜分量轉(zhuǎn)換成從0到PI / 2弧度的垂直傾斜角以及從-PI到PI弧度的平面定向角。該表示法將產(chǎn)生與描述手指觸摸所用方向相符的方向的描述罕拂。

報告傾斜信息為可選項揍异,但建議用于觸控筆設(shè)備。

如果工具類型是由ABS_MT_TOOL_TYPE報告的爆班,則會取代BTN_TOOL_*報告的任何工具類型信息衷掷。如果根本沒有可用的工具類型信息,則工具類型將默認(rèn)為MotionEvent.TOOL_TYPE_FINGER柿菩。

根據(jù)以下條件確定工具的活動狀態(tài):

當(dāng)使用單點觸控協(xié)議時戚嗅,如果BTN_TOUCH或BTN_TOOL_*為1,則表示工具處于活動狀態(tài)枢舶。

這個條件意味著InputReader至少需要獲得一些關(guān)于工具性質(zhì)的信息:工具是否正在觸摸懦胞,或者至少知道工具的類型。如果沒有可用的信息凉泄,則假定工具處于非活動狀態(tài)(超出范圍)躏尉。

當(dāng)使用多點觸控協(xié)議“A”時,只要工具出現(xiàn)在最近的同步報告中后众,則表示其處于活動狀態(tài)胀糜。當(dāng)工具不再出現(xiàn)在同步報告中時颅拦,則表示工具不再存在。

當(dāng)使用多點觸控協(xié)議“B”時教藻,只要工具具有活動插槽距帅,則表示其處于活動狀態(tài)。當(dāng)插槽被清除時怖竭,則表示工具不再存在锥债。

根據(jù)以下條件確定工具懸停:

如果工具為BTN_TOOL_MOUSE或BTN_TOOL_LENS陡蝇,則該工具不會懸停痊臭,即使以下任一條件為真也不例外。

如果工具處于活動狀態(tài)登夫,并且驅(qū)動程序報告的壓力為零广匙,則表示工具處于懸停狀態(tài)。

如果工具處于活動狀態(tài)恼策,而且驅(qū)動程序支持BTN_TOUCH按鍵代碼鸦致,并且BTN_TOUCH的值為零,則表示工具處于懸停狀態(tài)涣楷。

InputReader支持多點觸控協(xié)議“A”和“B”分唾。新驅(qū)動程序應(yīng)該使用“B”協(xié)議,但是使用任一協(xié)議均可正常運作狮斗。

根據(jù)Android Ice Cream Sandwich 4.0绽乔,可能需要更改觸摸屏驅(qū)動程序,以符合Linux 輸入?yún)f(xié)議規(guī)范碳褒。

可能需要進(jìn)行以下更改:

當(dāng)一個工具變?yōu)榉腔顒訝顟B(tài)(“抬起”一根手指)時折砸,它應(yīng)該停止顯示在后續(xù)的多點觸控同步報告中。當(dāng)所有工具變?yōu)榉腔顒訝顟B(tài)(“抬起”所有手指)時沙峻,驅(qū)動程序應(yīng)發(fā)送一個空的同步報告數(shù)據(jù)包睦授,如SYN_MT_REPORT后跟SYN_REPORT。

以前版本的Android通過發(fā)送壓力值0來報告“抬起”事件摔寨。該舊行為與Linux輸入?yún)f(xié)議規(guī)范不兼容去枷,因此不再受支持。

物理壓力或信號強(qiáng)度信息應(yīng)使用ABS_MT_PRESSURE進(jìn)行報告是复。

以前版本的Android從ABS_MT_TOUCH_MAJOR檢索壓力信息删顶。該舊行為與Linux輸入?yún)f(xié)議規(guī)范不兼容,因此不再受支持佑笋。

觸摸尺寸信息應(yīng)使用ABS_MT_TOUCH_MAJOR進(jìn)行報告翼闹。

以前版本的Android從ABS_MT_TOOL_MAJOR檢索尺寸信息。該舊行為與Linux輸入?yún)f(xié)議規(guī)范不兼容蒋纬,因此不再受支持猎荠。

觸摸設(shè)備驅(qū)動程序不再需要Android系統(tǒng)專用的自定義設(shè)置坚弱。通過依靠標(biāo)準(zhǔn)的Linux輸入?yún)f(xié)議,Android可以使用未經(jīng)修改的驅(qū)動程序來支持更多種類的觸摸外設(shè)关摇,如外部HID多點觸控觸摸屏荒叶。

觸摸設(shè)備操作:

下面簡要匯總了Android上的觸摸設(shè)備操作。

EventHub從evdev驅(qū)動程序讀取原始事件输虱。

InputReader消耗原始事件些楣,并更新關(guān)于每個工具的位置和其他特征的內(nèi)部狀態(tài)。它還會跟蹤按鈕狀態(tài)宪睹。

如果按下或釋放“后退”或“前進(jìn)”按鈕愁茁,InputReader會向InputDispatcher發(fā)出按鍵事件通知。

InputReader確定是否發(fā)生了虛擬按鍵的按壓操作亭病。如果是鹅很,它會向InputDispatcher發(fā)出按鍵事件通知。

InputReader確定觸摸行為是否在顯示范圍內(nèi)發(fā)起的罪帖。如果是促煮,它會向InputDispatcher發(fā)出觸摸事件通知。

如果沒有觸摸工具整袁,但至少有一個懸停工具菠齿,則InputReader會向InputDispatcher發(fā)出懸停事件通知。

如果觸摸設(shè)備類型是指控設(shè)備坐昙,則InputReader會執(zhí)行指針手勢檢測绳匀,相應(yīng)地移動指針和相關(guān)點,并向InputDispatcher發(fā)出指針事件通知民珍。

InputDispatcher使用WindowManagerPolicy來確定是否應(yīng)該調(diào)度這些事件襟士,以及它們是否應(yīng)該喚醒設(shè)備。然后嚷量,InputDispatcher將事件傳遞給相應(yīng)的應(yīng)用陋桂。

觸摸設(shè)備配置:

觸摸設(shè)備行為由設(shè)備的坐標(biāo)軸、按鈕蝶溶、輸入屬性嗜历、輸入設(shè)備配置、虛擬按鍵映射和按鍵布局確定抖所。

要詳細(xì)了解參與鍵盤配置的文件梨州,請參閱以下部分:

輸入設(shè)備配置文件;

虛擬按鍵映射文件田轧;

屬性:

系統(tǒng)依賴于許多輸入設(shè)備配置屬性來配置和校準(zhǔn)觸摸設(shè)備行為暴匠。

原因之一是觸摸設(shè)備的設(shè)備驅(qū)動程序通常使用特定于設(shè)備的單元來報告觸摸特性。

例如傻粘,許多觸摸設(shè)備使用內(nèi)部特定于設(shè)備的比例(例如由觸摸觸發(fā)的傳感器節(jié)點的總數(shù))來測量觸摸接觸面積每窖。此原始尺寸值對應(yīng)用來說沒有意義帮掉,因為它們需要了解觸摸設(shè)備傳感器節(jié)點的物理尺寸和其他特性。

系統(tǒng)使用在輸入設(shè)備配置文件中編碼的校準(zhǔn)參數(shù)窒典,將觸摸設(shè)備報告的值解碼蟆炊、轉(zhuǎn)換和標(biāo)準(zhǔn)化為應(yīng)用可以理解的更簡單的標(biāo)準(zhǔn)表示。

文檔規(guī)范:對本文檔而言瀑志,我們將使用以下規(guī)范來描述系統(tǒng)在校準(zhǔn)過程中使用的值涩搓。

原始軸值:以下表達(dá)式表示觸摸設(shè)備驅(qū)動程序作為EV_ABS事件報告的原始值。

raw.x

ABS_X或ABS_MT_POSITION_X軸的值劈猪。

raw.y

ABS_Y或ABS_MT_POSITION_Y軸的值昧甘。

raw.pressure

ABS_PRESSURE或ABS_MT_PRESSURE軸的值,如果未提供岸霹,則為0疾层。

raw.touchMajor

ABS_MT_TOUCH_MAJOR軸的值将饺,如果未提供贡避,則為0。

raw.touchMinor

ABS_MT_TOUCH_MINOR軸的值予弧,如果未提供刮吧,則為raw.touchMajor。

raw.toolMajor

ABS_TOOL_WIDTH或ABS_MT_WIDTH_MAJOR軸的值掖蛤,如果未提供杀捻,則為0。

raw.toolMinor

ABS_MT_WIDTH_MINOR軸的值蚓庭,如果未提供致讥,則為raw.toolMajor。

raw.orientation

ABS_MT_ORIENTATION軸的值器赞,如果未提供垢袱,則為0。

raw.distance

ABS_DISTANCE或ABS_MT_DISTANCE軸的值港柜,如果未提供请契,則為0。

raw.tiltX

ABS_TILT_X軸的值夏醉,如果未提供爽锥,則為0。

raw.tiltY

ABS_TILT_Y軸的值畔柔,如果未提供氯夷,則為0。

原始軸范圍

以下表達(dá)式表示原始值的范圍靶擦。通過為每個軸調(diào)用EVIOCGABS ioctl獲得它們腮考。

raw.*.min

原始軸的最小值(含)擎淤。

raw.*.max

原始軸的最大值(含)。

raw.*.range

相當(dāng)于 raw..max - raw..min秸仙。

raw.*.fuzz

原始軸的精度嘴拢。例如,fuzz = 1 表示值精確到 +/- 1 個單位寂纪。

raw.width

觸摸區(qū)域的寬度(含)席吴,相當(dāng)于 raw.x.range + 1。

raw.height

觸摸區(qū)域的高度(含)捞蛋,相當(dāng)于 raw.y.range + 1孝冒。

輸出范圍

以下表達(dá)式表示輸出坐標(biāo)系的特性。系統(tǒng)使用線性插值將觸摸設(shè)備使用的 Surface 單元的觸摸位置信息轉(zhuǎn)換成將報告給應(yīng)用的輸出單元(如顯示像素)拟杉。

output.width

輸出寬度叫挟。對于觸摸屏(與顯示屏相關(guān)聯(lián)),輸出寬度是顯示屏寬度(以像素為單位)馍资。對于觸摸板(不與顯示屏相關(guān)聯(lián))膀捷,輸出寬度等于raw.width,表示不會插入值拿穴。

output.height

輸出高度泣洞。對于觸摸屏(與顯示屏相關(guān)聯(lián)),輸出高度是顯示屏高度(以像素為單位)默色。對于觸摸板(不與顯示屏相關(guān)聯(lián))球凰,輸出高度等于raw.height,表示不會插入值腿宰。

output.diag

輸出坐標(biāo)系的對角線長度呕诉,相當(dāng)于 sqrt(output.width ^2 + output.height ^2)。

基礎(chǔ)配置:

觸摸輸入映射器在輸入設(shè)備配置文件中使用許多配置屬性來指定校準(zhǔn)值吃度。下表介紹了一些通用配置屬性甩挫。在下面的部分中介紹了所有其他屬性及其進(jìn)行校準(zhǔn)所用的字段。

touch.deviceType

定義:touch.deviceType = touchScreen | touchPad | pointer | default

指定觸摸設(shè)備類型规肴。

如果值為touchScreen捶闸,則觸摸設(shè)備是與顯示屏相關(guān)聯(lián)的觸摸屏。

如果值為touchPad拖刃,則觸摸設(shè)備是不與顯示屏相關(guān)聯(lián)的觸摸板删壮。

如果值為pointer,則觸摸設(shè)備是不與顯示屏相關(guān)聯(lián)的觸摸板兑牡,并且其動作用于間接多點觸控指控手勢央碟。

如果值為default,則系統(tǒng)將根據(jù)分類算法自動檢測設(shè)備類型。

有關(guān)設(shè)備類型如何影響觸摸設(shè)備的行為的詳細(xì)信息亿虽,請參閱分類部分菱涤。

在Honeycomb之前,所有觸摸設(shè)備都被視為觸摸屏洛勉。

touch.orientationAware

定義:touch.orientationAware = 0 | 1

指定觸摸設(shè)備是否應(yīng)對顯示屏的方向更改做出響應(yīng)粘秆。

如果值為1,則只要顯示屏的方向更改了收毫,觸摸設(shè)備報告的觸摸位置就會旋轉(zhuǎn)攻走。

如果值為0,則觸摸設(shè)備報告的觸摸位置將不受顯示屏方向更改的影響此再。

如果設(shè)備是觸摸屏昔搂,則默認(rèn)值為1,否則為0输拇。

系統(tǒng)會區(qū)分內(nèi)部和外部觸摸屏與顯示部分摘符。方向感知型內(nèi)部觸摸屏基于內(nèi)部顯示部分的方向進(jìn)行旋轉(zhuǎn)。方向感知型外部觸摸屏基于外部顯示部分的方向進(jìn)行旋轉(zhuǎn)策吠。

方向感知功能用于支持Nexus One等設(shè)備上的觸摸屏旋轉(zhuǎn)逛裤。例如,當(dāng)設(shè)備從其自然方向順時針旋轉(zhuǎn)90度時奴曙,觸摸的絕對位置將被重新映射别凹,使得在觸摸屏絕對坐標(biāo)系左上角的觸摸行為被報告為在顯示屏旋轉(zhuǎn)坐標(biāo)系左上角的觸摸行為。這樣做是為了使用應(yīng)用繪制其可見元素時所用的同一坐標(biāo)系報告觸摸行為洽糟。

在Honeycomb之前,所有觸摸設(shè)備都被視為具有方向感知功能堕战。

touch.gestureMode

定義:touch.gestureMode = pointer | spots | default

指定指控手勢的表示模式坤溃。僅在觸摸設(shè)備為指控類型時,該配置屬性才具有相關(guān)性嘱丢。

如果值為pointer薪介,則觸摸板手勢將通過與鼠標(biāo)指針相似的光標(biāo)來表示。

如果值為spots越驻,則觸摸板手勢由代表手勢形心的錨點和代表各個手指位置的一組圓形斑點來表示汁政。

如果設(shè)置了INPUT_PROP_SEMI_MT輸入屬性,則默認(rèn)值為pointer缀旁,否則為spots记劈。

X和Y字段

X和Y字段給出了接觸區(qū)域中心的位置信息。

計算:

計算非常簡單:來自觸摸驅(qū)動程序的位置信息被線性插入輸出坐標(biāo)系并巍。

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字段

TouchMajor和TouchMinor字段描述了在輸出單元中接觸區(qū)域的大致維度(單位為像素)军拟。

ToolMajor和ToolMinor字段描述了在輸出單元中工具本身的大致維度(單位為像素)。

Size字段描述了相對于觸摸設(shè)備可以感知的最大可能觸摸區(qū)域的標(biāo)準(zhǔn)化觸摸區(qū)域尺寸誓禁⌒赶ⅲ可能的最小標(biāo)準(zhǔn)化尺寸為 0.0(無接觸或不可測量),可能的最大標(biāo)準(zhǔn)化尺寸為 1.0(傳感器區(qū)域已經(jīng)完全覆蓋)摹恰。

如果可以同時測量近似長度和寬度漓拾,則 TouchMajor 字段會指定接觸區(qū)域的較長維度,TouchMinor 字段會指定接觸區(qū)域的較短維度戒祠。如果只能測量接觸區(qū)域的大致直徑骇两,則 TouchMajor 和 TouchMinor 字段將相等。

同樣姜盈,ToolMajor 字段會指定工具截斷面的較長維度低千,ToolMinor 字段會指定工具截斷面的較短維度。

如果觸摸尺寸不可測量馏颂,但工具尺寸可測量示血,則工具尺寸將設(shè)為等于觸摸尺寸。相反救拉,如果工具尺寸不可測量难审,但觸摸尺寸可測量,則觸摸尺寸將設(shè)為等于工具尺寸亿絮。

觸摸設(shè)備以各種方式測量或報告觸摸尺寸和工具尺寸告喊。目前的實現(xiàn)支持三種不同的測量方式:Surface 單元內(nèi)的直徑、面積和幾何邊界區(qū)域派昧。

touch.size.calibration

定義:touch.size.calibration = none | geometric | diameter | area | default

指定觸摸驅(qū)動程序報告觸摸尺寸和工具尺寸時所用的測量類型黔姜。

如果值為none,則尺寸設(shè)為零蒂萎。

如果值為geometric秆吵,則假定以與位置相同的Surface單元指定尺寸,從而以相同的方式對尺寸進(jìn)行縮放五慈。

如果值為diameter纳寂,則假定尺寸與觸摸或工具直徑(寬度)成比例。

如果值為area泻拦,則假定尺寸與觸摸或工具面積成比例毙芜。

如果值為default,那么在raw.touchMajor或raw.toolMajor軸提供值的情況下聪轿,系統(tǒng)將使用geometric校準(zhǔn)爷肝,否則將使用none校準(zhǔn)。

touch.size.scale

定義:touch.size.scale = <非負(fù)浮點數(shù)>

指定校準(zhǔn)中使用的恒定比例因子。

默認(rèn)值為1.0灯抛。

touch.size.bias

定義:touch.size.bias = <非負(fù)浮點數(shù)>

指定校準(zhǔn)中使用的恒定偏差值金赦。

默認(rèn)值為0.0。

touch.size.isSummed

定義:touch.size.isSummed = 0 | 1

指定尺寸是報告為所有有效接觸區(qū)域的尺寸總和对嚼,還是針對每個接觸區(qū)域單獨報告尺寸夹抗。

如果值為1,則報告的尺寸需除以接觸數(shù)量纵竖,然后才能使用漠烧。

如果值為0,則報告的尺寸將按原樣使用靡砌。

默認(rèn)值為0已脓。

一些觸摸設(shè)備(尤其是“Semi-MT”設(shè)備)無法區(qū)分多個接觸點的單個維度,因此它們會報告表示其總面積或?qū)挾鹊某叽鐪y量結(jié)果通殃。對于此類設(shè)備度液,此屬性只能設(shè)為 1。如果有疑問画舌,請將此值設(shè)為 0堕担。

計算

TouchMajor、TouchMinor曲聂、ToolMajor霹购、ToolMinor 和 Size 字段的計算方法取決于指定的校準(zhǔn)參數(shù)。

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字段

Pressure字段描述了以介于0.0(無接觸)和1.0(全力)之間的標(biāo)準(zhǔn)化值形式施加到觸摸設(shè)備的近似物理壓力朋腋。

零壓力表示工具處于懸停狀態(tài)齐疙。

touch.pressure.calibration

定義:touch.pressure.calibration = none | physical | amplitude | default

指定觸摸驅(qū)動程序報告壓力所用的測量類型。

如果值為none乍丈,壓力未知剂碴,因此觸摸時設(shè)置為 1.0,懸停時為 0.0轻专。

如果值為physical,則認(rèn)為壓力軸測量的是施加到觸摸板的壓力的實際物理強(qiáng)度察蹲。

如果值為amplitude请垛,則認(rèn)為壓力軸測量的是信號幅度(與接觸的尺寸和施加的壓力有關(guān))。

如果值為default洽议,在壓力軸可用的情況下宗收,系統(tǒng)將使用physical校準(zhǔn),否則使用none亚兄。

touch.pressure.scale

定義:touch.pressure.scale = <非負(fù)浮點數(shù)>

指定校準(zhǔn)中使用的恒定比例因子混稽。

默認(rèn)值為1.0 / raw.pressure.max。

計算

Pressure字段的計算方法取決于指定的校準(zhǔn)參數(shù)。

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 和 Tilt 字段

Orientation字段以角度測量的形式描述了觸摸和工具的方向匈勋。值0表示長軸垂直取向礼旅,-PI/2表示長軸朝向左側(cè),PI/2表示長軸朝向右側(cè)洽洁。當(dāng)存在觸控筆工具時痘系,方向范圍可以是從-PI到PI的整個圓環(huán)范圍。

Tilt字段通過測量角度描述了工具的傾斜度饿自。傾斜度為0表示工具垂直于表面汰翠。傾斜度為PI/2表示工具與表面平行。

touch.orientation.calibration

定義:touch.orientation.calibration = none | interpolated | vector | default

指定觸摸驅(qū)動程序報告方向時所用的測量類型昭雌。

如果值為none复唤,則方向未知,因此設(shè)為0烛卧。

如果值為interpolated佛纫,則方向被線性插入,使得raw.orientation.min的原始值映射到-PI/2唱星,raw.orientation.max的原始值映射到PI/2雳旅。(raw.orientation.min + raw.orientation.max) / 2的中心值映射到0。

如果值為vector间聊,則方向表示為包含兩個帶符號的4位字段的壓縮向量攒盈。該表示用于Atmel基于對象的協(xié)議部分。當(dāng)解碼時哎榴,向量生成定向角和置信度型豁。置信度用于縮放尺寸信息,除非它是幾何圖形尚蝌。

如果值為default迎变,那么在方向軸可用的情況下,系統(tǒng)將使用interpolated校準(zhǔn)飘言,否則使用none衣形。

計算

Orientation和Tilt字段的計算方法取決于指定的校準(zhǔn)參數(shù)和可用輸入。

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字段

Distance字段描述了工具和觸摸設(shè)備表面之間的距離姿鸿。值0.0表示直接接觸谆吴,值越大,表示與表面之間的距離越遠(yuǎn)苛预。

touch.distance.calibration

定義:touch.distance.calibration = none | scaled | default

指定觸摸驅(qū)動程序報告距離時所用的測量類型句狼。

如果值為none,則距離未知热某,因此設(shè)為 0腻菇。

如果值為scaled胳螟,則報告的距離將乘以恒定比例因子。

如果值為default筹吐,則在距離軸可用的情況下糖耸,系統(tǒng)將使用 scaled 校準(zhǔn),否則使用 none骏令。

touch.distance.scale

定義:touch.distance.scale = <非負(fù)浮點數(shù)>

指定校準(zhǔn)中使用的恒定比例因子蔬捷。

默認(rèn)值為 1.0。

計算

Distance 字段的計算方法取決于指定的校準(zhǔn)參數(shù)榔袋。

If touch.distance.calibration == "scaled":

output.distance = raw.distance * touch.distance.scale

Else

output.distance = 0

End If

示例

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

兼容性說明

觸摸設(shè)備的配置屬性在 Android Ice Cream Sandwich 4.0 中發(fā)生了重大變化周拐。必須更新觸摸設(shè)備的所有輸入設(shè)備配置文件,才能使用新配置屬性凰兑。

更舊的觸摸設(shè)備驅(qū)動程序可能也需要更新妥粟。

虛擬按鍵映射文件:

觸摸設(shè)備經(jīng)常用于實現(xiàn)虛擬按鍵。

有幾種方法可以做到這一點吏够,具體取決于觸摸控制器的功能勾给。一些觸摸控制器可以直接配置為通過設(shè)置固件寄存器來實現(xiàn)軟鍵。其他時候锅知,最好在軟件中執(zhí)行從觸摸坐標(biāo)到按鍵代碼的映射播急。

在軟件中實現(xiàn)虛擬按鍵時,內(nèi)核必須將名為virtualkeys.<devicename>的虛擬按鍵映射文件作為本機(jī)已加載屬性導(dǎo)出售睹。例如桩警,如果觸摸屏設(shè)備驅(qū)動程序?qū)⑵涿Q報告為“touchyfeely”,則虛擬按鍵映射文件的路徑必須為 /sys/board_properties/virtualkeys.touchyfeely昌妹。

虛擬按鍵映射文件描述了觸摸屏上虛擬按鍵的坐標(biāo)和Linux按鍵代碼捶枢。

除了虛擬按鍵映射文件外,還必須有一個對應(yīng)的按鍵布局文件和按鍵字符映射文件飞崖,以將Linux按鍵代碼映射到Android按鍵代碼烂叔,并指定鍵盤設(shè)備的類型(通常為SPECIAL_FUNCTION)。

語法:

虛擬按鍵映射文件是一個純文本文件固歪,由一系列用換行符或冒號分隔的虛擬按鍵布局描述組成蒜鸡。

注釋行以“#”開頭,并持續(xù)到這一行的結(jié)束位置牢裳。

每個虛擬按鍵用由6個冒號分隔的組件進(jìn)行描述:

0x01:版本代碼术瓮。必須始終為0x01。

<Linux key code>:虛擬按鍵的Linux按鍵代碼贰健。

<centerX>:虛擬按鍵中心的X軸坐標(biāo),以像素為單位恬汁。

<centerY>:虛擬按鍵中心的Y軸坐標(biāo)伶椿,以像素為單位辜伟。

<width>:虛擬按鍵的寬度,以像素為單位脊另。

<height>:虛擬按鍵的高度导狡,以像素為單位。

所有的坐標(biāo)和尺寸都是根據(jù)顯示坐標(biāo)系指定的偎痛。

下面是一個虛擬按鍵映射文件旱捧,全部寫在一行上。

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

相同的虛擬按鍵映射文件也可以寫在多行上踩麦。

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

在上述示例中枚赡,觸摸屏具有480×800的分辨率。因此谓谦,所有虛擬按鍵的<centerY>坐標(biāo)為835贫橙,位于略低于觸摸屏可見區(qū)域的位置。

第一個按鍵的Linux掃描代碼為158 (KEY_BACK)反粥,centerX為55卢肃,centerY為835,width為90才顿,height為55莫湘。

示例

虛擬按鍵映射文件:/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

按鍵布局文件:/system/usr/keylayout/touchyfeely.kl郑气。

key 158 BACK

key 139 MENU

key 102 HOME

key 217 SEARCH

按鍵字符映射文件:/system/usr/keychars/touchyfeely.kcm幅垮。

type SPECIAL_FUNCTION

間接多點觸控指控手勢

在指控模式下,系統(tǒng)會解釋以下手勢:

單指點按:點擊竣贪。

單指移動:移動指針军洼。

單指移動加按下按鈕:拖動指針。

兩個手指移動(兩個手指沿相同的方向移動):沿著該方向拖動指針下方的區(qū)域演怎。指針本身不動匕争。

兩個手指移動(兩個手指朝著彼此移動或者移向不同方向):平移/縮放/旋轉(zhuǎn)指針周圍的區(qū)域。指針本身不動爷耀。

多個手指移動:自由手勢甘桑。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市歹叮,隨后出現(xiàn)的幾起案子跑杭,更是在濱河造成了極大的恐慌,老刑警劉巖咆耿,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件德谅,死亡現(xiàn)場離奇詭異,居然都是意外死亡萨螺,警方通過查閱死者的電腦和手機(jī)窄做,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門愧驱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人椭盏,你說我怎么就攤上這事组砚。” “怎么了掏颊?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵糟红,是天一觀的道長。 經(jīng)常有香客問我乌叶,道長盆偿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任枉昏,我火速辦了婚禮陈肛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘兄裂。我一直安慰自己句旱,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布晰奖。 她就那樣靜靜地躺著谈撒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪匾南。 梳的紋絲不亂的頭發(fā)上啃匿,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機(jī)與錄音蛆楞,去河邊找鬼溯乒。 笑死,一個胖子當(dāng)著我的面吹牛豹爹,可吹牛的內(nèi)容都是我干的裆悄。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼臂聋,長吁一口氣:“原來是場噩夢啊……” “哼光稼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起孩等,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤艾君,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后肄方,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冰垄,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年权她,在試婚紗的時候發(fā)現(xiàn)自己被綠了播演。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冀瓦。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖写烤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拾徙,我是刑警寧澤洲炊,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站尼啡,受9級特大地震影響暂衡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜崖瞭,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一狂巢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧书聚,春花似錦唧领、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至驯杜,卻和暖如春受啥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鸽心。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工滚局, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人顽频。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓藤肢,卻偏偏與公主長得像,于是被迫代替她去往敵國和親冲九。 傳聞我的和親對象是個殘疾皇子谤草,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容