背景
直播免費(fèi)視頻課程地址:https://www.bilibili.com/video/BV1hN4y1R7t2/
在做雙屏相關(guān)需求開發(fā)過程中,經(jīng)常會有對兩個(gè)屏幕都要求可以正確觸摸的場景。但是目前我們模擬器默認(rèn)創(chuàng)建的雙屏其實(shí)是沒有辦法進(jìn)行觸摸的
修改方案1
靜態(tài)修改方案
使用命令查看display2即副屏的信息情況
adb shell dumpsys display
Display 2:
mDisplayId=2
mPhase=1
mLayerStack=2
mHasContent=true
mDesiredDisplayModeSpecs={baseModeId=2 allowGroupSwitching=false primaryRefreshRateRange=[0 Infinity] appRequestRefreshRateRange=[0 Infinity]}
mRequestedColorMode=0
mDisplayOffset=(0, 0)
mDisplayScalingDisabled=false
mPrimaryDisplayDevice=HDMI Screen
mBaseDisplayInfo=DisplayInfo{"HDMI Screen", displayId 2", displayGroupId 0, FLAG_SECURE, FLAG_SUPPORTS_PROTECTED_BUFFERS, FLAG_PRESENTATION, FLAG_TRUSTED, real 1440 x 2960, largest app 1440 x 2960, smallest app 1440 x 2960, appVsyncOff 2000000, presDeadline 75, mode 2, defaultMode 2, modes [{id=2, width=1440, height=2960, fps=1.3333333E7, alternativeRefreshRates=[]}], hdrCapabilities HdrCapabilities{mSupportedHdrTypes=[], mMaxLuminance=500.0, mMaxAverageLuminance=500.0, mMinLuminance=0.0}, userDisabledHdrTypes [], minimalPostProcessingSupported false, rotation 0, state ON, type EXTERNAL, uniqueId "local:4619827551948147201", app 1440 x 2960, density 560 (215152.0 x 214811.02) dpi, layerStack 2, colorMode 0, supportedColorModes [0], address {port=1, model=0x401cecae7d6e8a}, deviceProductInfo DeviceProductInfo{name=EMU_display_1, manufacturerPnpId=GGL, productId=4660, modelYear=null, manufactureDate=ManufactureDate{week=12, year=2021}, connectionToSinkType=0}, removeMode 0, refreshRateOverride 0.0, brightnessMinimum 0.0, brightnessMaximum 1.0, brightnessDefault 0.5, installOrientation ROTATION_0}
這里主要看對應(yīng)的uniqueId “l(fā)ocal:4619827551948147201”
然后結(jié)合input中需要這個(gè)uniqueId,更新地方:
2: virtio_input_multi_touch_7
Classes: TOUCH | TOUCH_MT | SWITCH
Path: /dev/input/event8
Enabled: true
Descriptor: e1c836c7be888adb29ca6646292e486f96461e97
Location: virtio17/input0
ControllerNumber: 0
UniqueId:
Identifier: bus=0x0006, vendor=0x0000, product=0x0000, version=0x0000
KeyLayoutFile:
KeyCharacterMapFile:
ConfigurationFile: /vendor/usr/idc/virtio_input_multi_touch_7.idc
VideoDevice: <none>
就是這個(gè) ConfigurationFile: /vendor/usr/idc/virtio_input_multi_touch_7.idc
去源碼的out路徑下修改/aosp/out/target/product/emulator_x86_64/vendor/usr/idc/virtio_input_multi_touch_7.idc
主要把touch.displayId 變成上面的獲取的local:4619827551948147201
device.internal = 1
touch.deviceType = touchScreen
touch.orientationAware = 1
cursor.mode = navigation
cursor.orientationAware = 1
# This displayID matches the unique ID of the virtual display created for Emulator.
# This will indicate to input flinger than it should link this input device
# with the virtual display.
touch.displayId = local:4619827551948147201
再進(jìn)行整體編譯即可以
修改方案2
動態(tài)修改方案
思路通過調(diào)用input中相關(guān)方法對config進(jìn)行相關(guān)修改
對應(yīng)方法如下:
即只需要通過這個(gè)方法即可以指定觸摸的input —》對應(yīng)顯示display進(jìn)行映射
注意這里使用是port阿,不是displayId
port也可以通過dumpsys display查看哈:
在對應(yīng)的address有對于的port值,一般就是第一個(gè)屏幕0,第二屏幕1
address {port=1, model=0x401cecae7d6e8a}, deviceProductInfo DeviceProductInfo{name=EMU_display_1, manufacturerPnpId=GGL, productId=4660, modelYear=null, manufactureDate=ManufactureDate{week=12, year=2021}
確定了了display的port還有一個(gè)input相關(guān)inputPort參數(shù),這個(gè)就直接通過dumpsy input獲取哈,在dumpsys尋找對應(yīng)屏幕的event,從而找到對應(yīng)的Device
2: virtio_input_multi_touch_7
Classes: TOUCH | TOUCH_MT | SWITCH
Path: /dev/input/event8
Enabled: true
Descriptor: e1c836c7be888adb29ca6646292e486f96461e97
Location: virtio17/input0
ControllerNumber: 0
UniqueId:
Identifier: bus=0x0006, vendor=0x0000, product=0x0000, version=0x0000
KeyLayoutFile:
KeyCharacterMapFile:
ConfigurationFile: /vendor/usr/idc/virtio_input_multi_touch_7.idc
VideoDevice: <none>
就是這里的 Location: virtio17/input0,virtio17/input0就是我們要的
做好一個(gè)動態(tài)調(diào)用觸發(fā),這里直接也使用dumpsys input命令里面進(jìn)行:文章來源:http://www.zghlxwxcb.cn/news/detail-680959.html
commit 72193cfb966307940457148bedc793c316d67af5 (HEAD)
Author: Your Name <you@example.com>
Date: Fri Aug 25 17:23:22 2023 +0800
add displayfortouch modify
diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java
index 72612a0468cd..587a7b313b8f 100644
--- a/services/core/java/com/android/server/input/InputManagerService.java
+++ b/services/core/java/com/android/server/input/InputManagerService.java
@@ -2678,6 +2678,14 @@ public class InputManagerService extends IInputManager.Stub
if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return;
pw.println("INPUT MANAGER (dumpsys input)\n");
+ pw.println("INPUT MANAGER args size = "+args.length + "\n");
+ if (args.length == 3 && args[0].equals("displayForInput")) {
+ String location = args[1];
+ int port = Integer.parseInt(args[2]);
+ addPortAssociation(location,port);
+ pw.println("INPUT MANAGER addPortAssociation location= "+location +" port = " +port+ " \n");
+ return;
+ }
String dumpStr = mNative.dump();
if (dumpStr != null) {
pw.println(dumpStr);
最后使用命令:
adb shell dumpsys input displayForInput virtio17/input0 1文章來源地址http://www.zghlxwxcb.cn/news/detail-680959.html
到了這里,關(guān)于android多屏觸摸相關(guān)的詳解方案-安卓framework開發(fā)手機(jī)車載車機(jī)系統(tǒng)開發(fā)課程的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!