android多屏觸摸相關(guān)的詳解方案-安卓framework開發(fā)手機車載車機系統(tǒng)開發(fā)課程
背景
配套直播免費視頻課程地址:https://www.bilibili.com/video/BV1hN4y1R7t2/[1]
在做雙屏相關(guān)需求開發(fā)過程中,經(jīng)常會有對兩個屏幕都要求可以正確觸摸的場景。但是目前我們模擬器默認(rèn)創(chuàng)建的雙屏其實是沒有辦法進(jìn)行觸摸的
千里馬本人微信:androidframework007

修改方案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 "local:4619827551948147201"
然后結(jié)合input中需要這個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>
就是這個 ? ? ?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)方法如下:

即只需要通過這個方法即可以指定觸摸的input ?---》對應(yīng)顯示display進(jìn)行映射 注意這里使用是port阿,不是displayId port也可以通過dumpsys display查看哈: 在對應(yīng)的address有對于的port值,一般就是第一個屏幕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還有一個input相關(guān)inputPort參數(shù),這個就直接通過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就是我們要的
做好一個動態(tài)調(diào)用觸發(fā),這里直接也使用dumpsys input命令里面進(jìn)行:
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
引用鏈接
[1]
配套直播免費視頻課程地址:https://www.bilibili.com/video/BV1hN4y1R7t2/: https://www.bilibili.com/video/BV1hN4y1R7t2/