日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

安卓设备手柄无法映射线性扳机的解决思路(1)

發布時間:2023/12/14 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 安卓设备手柄无法映射线性扳机的解决思路(1) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

[轉載需注明作者及出處]
此方案需要安卓設備已經獲取Root權限,并且本文只提供一個解決思路,文中所給代碼并不能直接用在自己的設備上,請自行修改以適配自己的設備。
測試設備:小新pad pro 2021,安卓11


一、前言
眾所周知移動端原生支持手柄的游戲實在不多,要用手柄暢玩流行手游基本上需要映射,還有模擬器使用手柄作為輸入設備也需要通過鍵位映射。
博主最近買了很多手柄用在安卓設備上,發現其中有一些手柄的線性扳機無法使用映射app映射成屏幕點擊,使用天際線模擬器時也無法成功映射成L2R2鍵,我研究了一個晚上解決了這個問題,并為手柄功能拓展提出了一些思路,故寫此文為遇到同樣問題的朋友提供參考。
理論上適用于所有手柄,已Root的安卓設備和Linux設備。
測試所用手柄:
原裝DualShock 4(PS4配柄):USB連接和藍牙連接,線性扳機
國產DualShock 4:藍牙連接,線性扳機
1UP GC1(樂升盒子配柄):藍牙連接,線性扳機
Obox OC1(蝸牛主機配柄):藍牙連接,線性扳機
Fuze手柄(戰斧F1主機配柄):藍牙連接,線性扳機
國產xbox360手柄有線:USB連接,線性扳機
飛智八爪魚一代:藍牙連接,USB2.4G接收器,線性扳機
飛智Wee一代:藍牙連接,無線性扳機
映射使用的APP(線性扳機無法映射的問題應該與APP無關):
ZUI外設模式
北通游戲廳
Mantis Gamepad
Shanwan Gamepad


二、問題分析
博主測試不同手柄線性扳機輸入的過程中,發現了三種不同的輸入模式:
1、只有GAS和BRAKE輸入。

2、同時有GAS/RTRIGGER 和 BRAKE/LTRIGGER的輸入信號并且綁定在一起。


3、不僅同時有GAS/RTRIGGER 和 BRAKE/LTRIGGER的輸入信號(ABS事件),并且在線性扳機的值達到某個閾值時會觸發輸入BUTTON_L2或BUTTON_R2(KEY事件),這種情況是手柄內部程序做了補償,可能是為了兼容其他平臺(ds4和飛智八爪魚就是這種輸入模式)。

第一種情況通常表現為在軟件中設置鍵位映射時識別不到扳機鍵
第二種情況通常表現為在軟件中設置鍵位映射可以將扳機鍵識別為L2/R2,但是在游戲中無法觸發映射;
第三種情況則可以正常識別按鍵也可以正常觸發。

因為線性扳機的輸入事件與搖桿同為ABS事件,輸入的是模擬量;而普通按鍵輸入的是KEY事件,只有0和1兩種輸入;我們點擊屏幕的行為跟KEY事件是同類型的,如果手柄自身沒有做BUTTON_L2/R2輸入補償,大部分映射軟件不能把模擬輸入映射為按鍵輸入,因此出現了線性扳機無法映射的情況。
而博主使用飛智Wee手柄沒有線性扳機,扳機鍵跟普通按鍵一樣輸入KEY事件,就不存在這種問題。


三、解決方法
1、修改kl文件
經測試發現,只有GAS和BRAKE輸入的時候,映射軟件無法識別;通過配置kl文件將兩個扳機鍵綁定到LTRIGGER和RTRIGGER,映射軟件就可以識別,并且部分設備設置到這一步就可以實現扳機鍵的映射,如果還是無法完成映射請看第二期。
這里使用1UP GC1手柄進行演示,這個手柄的扳機輸入只有GAS和BRAKE,通過修改kl文件之后可以有LTRIGGER和RTRIGGER的輸入信號。
kl文件位于/system/usr/keylayout目錄中,部分設備需要解鎖system分區才能修改,請自行解決分區解鎖的問題。
kl文件的命名格式為文件命名格式為Vendor_xxxx_Product_xxxx.kl,如果能找到自己設備的文件,那么直接修改即可(一般是大廠設備比如xbox和ps手柄);而我手上的1UP GC1手柄在keylayout目錄中是沒有kl文件的,我們需要手動創建。
下面教大家如何查找自己設備的vendor和product代碼。
首先打開終端(題主用的Termux)并輸入su獲取root權限,輸入getevent命令,會彈出當前的input event信息并實時打印輸入事件到屏幕上,我們隨便按兩下手柄上的按鍵可以看到終端中有輸出信息,記下自己設備的event編號,題主這里是event21

$ su# getevent


然后輸入getevent -i /dev/input/event21,就可以看到自己設備的信息(想了解這些信息代表什么意思可以自行查找linux輸入子系統的資料進行學習)

# getevent -i /dev/input/event21

可以看到vendor是1d79,product是1001,于是我們在/system/usr/keylayout目錄中創建一個文件命名為Vendor_1d79_Product_1001.kl,打開后輸入以下內容:(具體kl文件如何編寫請自行查找資料,網上都有的)

# 1UP GC1 key 304 BUTTON_A key 305 BUTTON_B key 307 BUTTON_X key 308 BUTTON_Y key 310 BUTTON_L1 key 311 BUTTON_R1 key 315 BUTTON_START key 314 BUTTON_SELECT key 172 BUTTON_MODE key 317 BUTTON_THUMBL key 318 BUTTON_THUMBLaxis 0x00 X axis 0x01 Y axis 0x02 Z axis 0x05 RZ axis 0x09 RTRIGGER ? ? ? ?#重點 axis 0x0a LTRIGGER ? ? ? ?#重點 axis 0x10 HAT_X axis 0x11 HAT_Y


這邊要做的工作主要是將兩個扳機的axis量綁定到RTRIGGER和LTRIGGER,
如果這兩句改為

axis 0x09 GAS axis 0x0a BRAKE


則app檢測到的只有GAS和BRAKE
不是所有手柄的輸入信號都是跟我這個手柄一樣,就是說扳機鍵的輸入信號不一定是0x09和0x0a,需要根據自己手柄的情況進行修改,獲取輸入信號的方法如下:
在終端中輸入getevent ?/dev/input/event21,拉一下左扳機可以看到很多輸出,這里的輸出全部使用16進制表示,0003表示輸入ABS事件(即axis),000a就是我們寫在kl文件中的0x0a。同理設置右扳機。

getevent ?/dev/input/event21


編輯完kl文件后保存重新連接手柄,就可以檢查自己的手柄扳機能否正常映射了。
如果還是不能請看第二期。

總結

以上是生活随笔為你收集整理的安卓设备手柄无法映射线性扳机的解决思路(1)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。