1.linux内核hid触摸源码hid-multitouch.c剖析
2.MotionEventçgetActionãgetActionMaskågetActionIndexçåºå«
3.UE4-Slate源码学习(四)FSceneViewport
4.Android Touch事件InputManagerService源码解析(二)
5.ESP32入门「09」:Arduino-ESP32 TOUCH API 详解
6.UE4-Slate源码学习(二)slate事件触发
linux内核hid触摸源码hid-multitouch.c剖析
在Linux内核中,触摸查询触摸查询hid-multitouch.c文件负责实现通用的源码HID触摸驱动。驱动结构定义在mt_driver中,系统通过module_hdi_driver()函数构建模块。触摸查询触摸查询mt_devices数组定义了设备参数,源码遵循USB-HID协议,系统php扩展源码分析通过HID_DEVICE宏对各个字段赋值。触摸查询触摸查询
mt_probe()函数执行初始化和配置多点触摸设备的源码操作,根据设备特性设置属性,系统启动硬件,触摸查询触摸查询并创建sysfs属性组。源码hid_parse()函数调用hid_open_report()解析HID报告,系统通过遍历数据并调用特定函数解析。触摸查询触摸查询hid_hw_start()函数启动底层HID硬件,源码而hid_connect()函数则实现连接功能。系统
对于需要通过USB接入触摸面板且满足HID协议的场景,可以使用hid-multitouch.c。接上两块触摸面板后,内核生成对应的设备节点链接。验证结果显示,内核能够正常解析触摸面板的偶们源码数据,触摸事件上报亦正常。
MotionEventçgetActionãgetActionMaskågetActionIndexçåºå«
å¨å¾å¤èªå®ä¹Viewçåºæ¯ä¸ï¼é½æå¯è½éè¦éåonTouchEventãdispatchTouchEventçæ¹æ³ï¼è¿äºæ¹æ³é½ä¼ å ¥ä¸ä¸ªMotionEvent对象ï¼ä¸è¬æ¥è¯´ï¼æ们éè¦éè¿è¯¥MotionEvent对象æ¥è·åå½åçæå¿å¨ä½ï¼ç¶åå¤æAction_DownãAction_MoveãAction_Upæ¥æ§è¡ä¸åçæä½é»è¾ãä½æ¯å½æ们çMotionEvent对象æ¶ï¼åç°å®ægetActionãgetActionMaskågetActionIndexæ¹æ³ï¼èä¸å¨æ们ç第ä¸æ¹æºç æ¶ï¼ç»å¸¸ä¼çå°è¿æ ·çåæ³ï¼
åæ¶ä¹ä¼çå°è¿æ ·çåæ³ï¼
è¿ä¸¤ç§åæ³å°åºæä»ä¹åºå«å¢ï¼æ们就æ¥è¯´ä¸ä¸MotionEventçå ç§è·åActionä¿¡æ¯çæ¹æ³ã
Androidç¨ä¸ä¸ªä½çæ´æ°å¼æ¥è¡¨ç¤ºä¸ä¸ªTouchEventäºä»¶ï¼ä½8ä½è¡¨ç¤ºTouchäºä»¶çå ·ä½å¨ä½ï¼ä¾å¦æä¸ãæ¬èµ·ã移å¨çå¨ä½ãé«8ä½è¡¨ç¤ºTouchäºä»¶ä¸å¤ç¹è§¦æ§çç´¢å¼å¼ã
ä»æºç å¯ä»¥çåºgetActionMasked = getAction & MotionEvent.ACTION_MASK
èMotionEvent.ACTION_MASK æ¯ä¸ä¸ªå¸¸éå¼ï¼å¼ä¸º0xffï¼æ以getActionMaskedæ¹æ³åªä¿çäºä½8ä½çä¿¡æ¯ï¼ä¹å°±æ¯è¯´åªä¿çäºè§¦æ¸çå¨ä½ä¿¡æ¯ã
为ä»ä¹ç第ä¸æ¹æºç æ¶ï¼ææ¶åågetActionï¼ææ¶åågetActionMaskedå¢ï¼ä»ä¸é¢çåæä¸å¯ä»¥çåºæ¥ä¸ªæ以ç¶ï¼
getAction表示触æ¸å¨ä½çåå§ä½ä¿¡æ¯ï¼å½æ²¡æå¤ç¹è§¦æ§æ¶ï¼é«8ä½å³ä¸º0ï¼è¿ä¸ªæ¶ågetAction == getActionMaskedãæ以å½æ们确å®æ们èªå®ä¹çViewä¸ä¼ä½¿ç¨å°å¤ç¹è§¦æ§æ¶ï¼å°±å¯ä»¥ç´æ¥ä½¿ç¨getActionæ¥è¡¨ç¤ºå ·ä½ç触æ¸å¨ä½ãä½å¦æéè¦ä½¿ç¨å¤ç¹è§¦æ§ï¼æè æ¯ä¸ç¡®å®åé¢ä¼ä¸ä¼ä½¿ç¨å¤ç¹è§¦æ§ï¼å使ç¨getActionMaskedåæ¯æä¿é©çæä½ï¼æ以æ们ç»å¸¸çå°ä¸é¢è¿ä¸¤ç§åæ³ï¼
Androidä¸æ¯æ¯æå¤ç¹è§¦æ§çï¼é£ä¹å¨é«8ä½ä¸æ¯å¦ä½åå¨å¤ç¹è§¦æ§çç´¢å¼ä¿¡æ¯çå¢ï¼ä¸¾ä¸ªä¾åæ¥è¯´ï¼
å¦æä»getActionæ¹æ³ä¸è¿åçå¼æ¯0xï¼å表示æ¯ç¬¬ä¸ä¸ªè§¦æ§ç¹çACTION_DOWNæä½ãé«8ä½æ¯0表示第ä¸ä¸ªè§¦æ§ç¹ï¼ä½8ä½æ¯0表示ACTION_DOWNæä½ã
åçï¼å¦æè¿åå¼æ¯0xï¼å表示第äºä¸ªè§¦æ§ç¹çACTION_DOWNæä½ã
ä¹å°±æ¯è¯´ï¼getActionè¿åå¼çä½8ä½è¡¨ç¤ºè§¦æ¸å¨ä½çç±»åä¿¡æ¯ï¼èé«8ä½è¡¨ç¤ºè§¦æ§ç¹çç´¢å¼ä¿¡æ¯ï¼ä¹å°±æ¯åªä¸ä¸ªè§¦æ§ç¹çäºä»¶ã
UE4-Slate源码学习(四)FSceneViewport
即视口是引擎中显示游戏画面的SWidget控件,也是编辑器中显示游戏内容的窗口。场景绘制视口(FSceneViewport)与SViewport绑定,用于场景渲染。鼠标捕获模式(EMouseCaptureMode)与鼠标锁定模式(EMouseLockMode)在项目设置中可配置,影响鼠标的交互。FSceneViewport事件处理包括鼠标按下(OnMouseButtonDown)、触摸开始(OnTouchStarted),事件响应后构造FReply,并更新几何体缓存、鼠标位置缓存。鼠标位置由绝对坐标转换为相对于视口的相对坐标。根据捕获状态和输入处理逻辑,事件最终被传递至PlayerController,通过PlayerInput管理。对于触摸输入,处理流程类似,调用InputTouch接口。
移动事件(OnMouseMove)、asmtoe 源码触摸移动(OnTouchMoved)记录鼠标的Delta和NumMouseSample累计值,Tick时处理。ProcessAccumulatedPointerInput在Tick阶段调用,处理键盘、鼠标输入,相关流程见第二章。完成输入处理后,FEngineLoop调用FinishedInputThisFrame,最终在ProcessAccumulatedPointerInput中调用InputAxis,处理至PlayerController的InputAxis,存储在PlayerInput中。其他事件如鼠标释放(OnMouseButtonUp)、触摸结束(OnTouchEnded)同样遵循类似流程。
若SWidget为视口,执行相关事件调用至ViewportClient接口,进而触发输入系统(PlayerController、PlayerInput、InputComponent)。日常游戏开发中,通过视口事件实现如旋转相机、源码 itsucks隐藏鼠标等操作。PlayerController提供三种模式(FInputModeUIOnly、FInputModeGameAndUI、FInputModeGameOnly),通过调整SViewport和ViewportClient参数,实现不同模式下的捕获、锁定、显隐鼠标功能。所讨论内容基于UE4版本4..2。
Android Touch事件InputManagerService源码解析(二)
解析Android Touch事件分发过程,深入InputManagerService源码。触摸事件的产生与传递机制是本文探讨的核心。
InputDispatcher接收到事件,通过enqueueInboundEventLocked接口将事件放入mInboundQueue队列,等待分发处理。
InputDispatcher内部线程在有事件时被唤醒,执行dispatchOnce,根据事件类型调用dispatchMotionLocked进行处理。处理流程涉及找到要处理事件的窗口。
窗口查找通过findFocusedWindowTargetsLocked方法实现,ispy 源码该方法从map中获取focusedWindowHandle和focusedApplicationHandle,存储目标窗口信息。
这些句柄的初始化在Activity的生命周期回调中,如Activity.onResume时。具体路径涉及ActivityTaskManagerService、DisplayContent、InputMonitor和InputManagerService。
分发循环由prepareDispatchCycleLocked、enqueueDispatchEntryLocked和enqueueDispatchEntriesLocked方法实现,最后调用startDispatchCycleLocked,将事件发送给对应进程。
InputReader持续从底层读取事件,InputDispatcher通过线程处理分发,直至事件被发送至目标进程。本文深入解析了Touch事件的分发机制与关键步骤,提供了对Android触摸事件处理过程的全面理解。
ESP入门「」:Arduino-ESP TOUCH API 详解
本文深入解读ESP芯片的触摸传感器及其API,通过实例程序展示应用功能,并附带源代码。 触摸传感器是一种电容式器件,通过测量固定时间内GPIO引脚上的充电/放电频率来感应触摸。触摸时,手指电荷改变电路状态,导致计数器值变化,进而验证触摸动作。这些引脚便于集成电容垫,替代机械按钮。 触摸传感器的API包含核心功能,如读取触摸数据、设置测量周期、附加中断、参数化中断处理以及唤醒模式控制。API支持通用和ESP芯片专用版本,满足不同需求。 具体功能如下:touchRead():获取触摸传感器数据,计数器记录充电/放电周期数,变化指示触摸。
touchSetCycles():配置测量周期,影响读数、阈值和精度。
touchAttachInterrupt():将中断与触摸板关联,根据阈值触发。
touchAttachInterruptArg():中断处理函数中加入参数。
touchDetachInterrupt():解除中断与触摸板的关联。
touchSleepWakeUpEnable():设置深度睡眠唤醒源。
ESP芯片专用API包含:touchInterruptSetThresholdDirection():定义中断激活条件。
touchInterruptGetLastStatus():获取中断状态,确认触摸状态。
应用示例包括读取触摸传感器和使用中断检测触摸。源代码基于ESP Arduino Core文档。 总结,本文旨在提供ESP触摸传感器及API的详尽介绍,通过实例和代码实现应用。敬请期待后续ESP开发教程更新。 欢迎知友们参与讨论,提出意见和优化建议。UE4-Slate源码学习(二)slate事件触发
在探讨UE4-Slate源码学习中,首先进入概念理解阶段,虚拟触摸的开启会将鼠标左键操作转化为OnTouchStarted事件,使得编辑器下通过鼠标也能触发UI的触摸相关事件。实现这一功能的关键在于
FSlateApplication类中两个方法:IsFakingTouchEvents()用于判断是否开启虚拟触摸,SetGameIsFakingTouchEvents()用于设置虚拟触摸状态。
在平台调用Slate时,根据不同事件类型创建FPointerEvent对象,作为事件处理的载体,其包含触发事件的按键信息、鼠标位置、索引、是否为触摸事件等数据,用于后续事件的精确处理。
Slate用户类FSlateUser包含了索引、鼠标位置、聚焦对象、捕获状态和WidgetPath等信息,通过实例化多个FSlateUser对象,程序可以追踪多个用户输入,例如在多人游戏场景中,能够精准识别当前谁触发了A键。
聚焦和捕获功能分别通过Widget的聚焦和捕获机制实现,当聚焦后,事件将被相应Widget接收,并触发一系列聚焦相关的事件,如OnFocusReceived、OnFocusChanging、OnFocusLost等。以按钮点击为例,点击按钮触发OnMouseDown事件,若按钮被捕获,则移动到按钮外松开鼠标仍会触发按钮的OnMouseUp事件。
在处理输入事件时,会涉及多种策略,如FArrangedWidget、FArrangedChildren和FWidgetPath等,用于确定事件处理的路径和流程。FEventRouter类根据输入事件和用户输入策略(FDirectPolicy、FToLeafmostPolicy、FTunnelPolicy、FBubblePolicy)来组织和分发事件。
处理鼠标和触摸输入的流程分为OnMouseDown和OnTouchStarted,通过Route函数根据策略处理事件,实现事件的触发和响应。移动事件则通过OnMouseMove和OnTouchMoved处理,根据输入类型和用户状态执行相应操作。拖拽事件OnDragDetected则在拖拽开始时触发,允许开发者自定义拖拽行为和数据传递。
最终,事件处理完成后,将调用相关函数清理记录,包括更新用户位置和路径,以及触发OnMouseUp或OnTouchEnded等事件。
UE4-Slate源码的学习涵盖了事件触发、用户输入处理、事件路由策略等多个方面,理解这些机制和流程对于深入掌握Slate框架至关重要。源码版本4..2提供了丰富的功能和细节,为开发者提供了一套强大且灵活的UI管理解决方案。