aaajj
求职中,欢迎联系
展开
-
【Android】sendevent和getevent
在之前我们讨论了通过input命令,外接输入设备(鼠标)等方式来实现对屏幕的事件注入,达到实现一些自动化的操作,相对于input命令需要获取inputManager来进行操作,sendevent的方式直接写文件来注入粗糙的事件,调用起来清楚一些,就是指令复杂一些,sendevent的代码就是写数据到输入设备。复杂的就在于写入的数据,我们可以通过getevent -l的显示来观察一个点击手指再滑动一下,看看打印什么,原创 2024-09-17 18:53:28 · 1257 阅读 · 0 评论 -
自制游戏手柄--Android画面的input输入控制
在使用传感器获取到运动数据后,怎样转换为input事件传给手机呢,这里以Android为例,我们可以考虑以下方式:1. 物理方式,使用舵机连接触碰笔去实现,2. 构造MotionEvent事件,注入input,类似adb shell input命令,可以参考input命令的代码3. Android手机可以连接鼠标使用,可以使用支持虚拟鼠标功能的Arduino连接手机,发送相应的touch事件4. Android手机通过scrcpy投屏到电脑,通过Arduino控制电脑上的鼠标。原创 2024-09-08 20:48:02 · 1546 阅读 · 0 评论 -
自制实战吃鸡手柄原理
2,物理方案,打开游戏的陀螺仪功能,把手机(平板)安装到电机设备上,收到旋转指令时,就对设备进行旋转,由于设备会发生旋转,可以使用投屏到电视或者采集卡显示到电脑的方式来看游戏画面。1, 软件方案,在Android上启动一个服务,接收手柄的指令,把指令转换为MotionEvent事件,这里可以参考input命令的代码。再发散一下,为了游戏时有健身效果,可以添加相应的传感器来获取蹲,跳等动作,来控制游戏中的相应行为,来达到健身和身临其境的效果。枪形手柄使用蓝牙来进行连接,发送操作指令。有2种方案来进行控制,原创 2024-09-01 10:00:35 · 420 阅读 · 0 评论 -
【Arduino】自制声控点击器(吼叫吃鸡助手)
当时的思路是开一个服务,监听麦克风音量,然后注入input命令,但是,在Android中,由于touch的处理方式比较复杂,区分各输入类型,adb input命令的注入会和手指的touch冲突,发生断触,需要从系统级来处理这个融合,在input系列文章中我们进行了讨论,这里不再细说。这里我们考虑物理点击的方式,市面上有一些自动点击设备,体验后发现,使用的时候需要按开始按钮,实时性不强,这个开始按键,如果改成我们需要的声控处理,就恰到好处了。在接地的导线上,加一个开关控制,就可以实现触摸和停止触摸的效果,原创 2024-08-18 19:57:34 · 546 阅读 · 0 评论 -
【Android】物理接触式touch的type
在Android设备中,我们可以使用手指来进行屏幕触控操作,也有触控笔等设备,也有自动点击器这样的设备,这里我们来看看他们在MotionEvent中的type是什么,如果type一致,不同的设备touch事件可以共存。有时候可以注意到,通电的充电线也可以在屏幕上出现touch效果,这个touch和手指touch不会发生冲突,其type应该也是TOOL_TYPE_FINGER。可以看到,除了down,up事件,还有很多的move事件。4. 点击器设备,这种设备可以搜到很多。原创 2024-08-10 19:57:03 · 282 阅读 · 0 评论 -
【Android】app中阻塞的looper为什么可以响应touch事件
这里直接给出答案,input事件传送给了系统IMS,IMS通过inputchannel把input传送给应用,而应用中的主线程looper监控了inputchannel的fd,这里,我们考虑一个问题,Android中的应用是一个looper线程,没有任务时就阻塞着,其他线程通过handler调用等方式向主线程looper发送任务,这里,打不过就加入,把inputchannel的fd也加入到主线程looper的epool监控之中。如果点击应用上的按钮,应用是怎么及时响应的呢,这个构造方法,调用其父类的构造。原创 2024-01-21 16:06:55 · 1168 阅读 · 0 评论 -
【Android】关于touch设备TOOL_TYPE_STYLUS
在 Android 中,触控笔(Stylus)是一种特殊的输入设备,它可以提供更精确和细致的输入方式。Android 提供了相应的触控笔事件处理机制,以支持触控笔的使用。触控笔事件与触摸事件略有不同,因为触控笔通常提供了更多的信息,如压力、倾斜角度等。方法,可以接收触控笔事件。你可以根据事件的类型和属性来处理触控笔事件。类表示,它提供了许多有用的方法来获取触控笔事件的信息。这里通过log来查看触控笔的motionEvent,方法可以检测事件的工具类型,通过。方法可以获取触控笔的倾斜角度等。原创 2023-10-14 12:35:08 · 667 阅读 · 0 评论 -
手机喊话应用实现思路
初步的一个实现,没有使用service,直接播放声音,连续调用会出现同时播放的情况,反而有了回声的效果。手机要是动一下,就喊话“摇摇零线,摇摇零线”,是不是比较酷,通过sensor识别到手机的运动状况,然后播放音频,这里实现一下手机翻转一下,播放声音的效果,原创 2023-09-10 21:58:16 · 409 阅读 · 0 评论 -
游戏中用脚开飞机实现方案
看看这个图片,有人用脚开飞机,用几个踏板去控制,在游戏中,开飞机的操作比较简单,上升,下降,加减油门,方向左,方向右。android设备中,使用模拟点击就可以实现这个功能,在操作踏板的时候发送对应的touch事件,具体可以参考。原创 2023-06-19 21:18:33 · 155 阅读 · 0 评论 -
Android系统默认支持的最大touch点数
Android系统中默认支持的最多touch点数是16个,一般情况下点击数也达不到这么多,这个16是哪里定义的呢,这里记录一下,可以看到,最大点数是MAX_POINTERS,这里也定义了最大的POINTER_ID是31。原创 2023-02-27 20:57:26 · 497 阅读 · 0 评论 -
[Android Input系统]MotionEvent的序列化传送
PC端的客户端支持按键和鼠标滑动操作,手机上的云游戏客户端则是和手机游戏一样的touch触控,客户端的touch操作是怎样处理给服务端的呢,猜测是把touch操作“实时”的传送给了服务器,Android服务器上把这些数据转换为相应的MotionEvent事件。这里再进一步考虑一下,在Input事件分发的时候,InputDispatcher把input事件通过InputChannel发送给对应的应用进程的时候,是怎样传送input事件数据的呢,这里从云游戏的触控操作看起,原创 2023-01-15 17:26:38 · 866 阅读 · 1 评论 -
【input学习】App对input事件的反馈与waitqueue
App端通过Looper来监听InputChannel的fd,获取数据后,调用相应的处理方法,最后会再调用InputEventReceiver的finishInputEvent方法,向InputDispatcher进行反馈,表示当前的事件处理完成,InputDispatcher收到反馈后,删除掉waitQueue(wq)中对应的记录。这里我们来看看finishDispatchCycleLocked是怎么处理到waitQueue的,这里进行了waitQueue的dequeue处理,弹出了处理过的事件记录,原创 2022-11-06 19:49:00 · 870 阅读 · 0 评论 -
[input分发]从MotionEvent的相对坐标来看view中touch的分发
我们可以再对多窗口进行试验,在onTouchEvent中可以发现,touch的坐标MotionEvent的getX,getY打印出来是坐标是相对于窗口的坐标,而不是屏幕原点的坐标。在前面的讨论中,我们了解到,在InputDispatcher里进行分发处理的时候,如果有2个窗口,会进行splitMotionEvent操作,对MotionEvent进行分割加工,只传递窗口自身的事件给对应的窗口。// 判断触摸点是否产生变化,例如有新的触摸点按下或旧触摸点抬起。// 触摸点ID集合无变化,则不需要进行事件拆分。原创 2022-10-16 13:39:14 · 312 阅读 · 0 评论 -
【input系统】MotionEvent的分解
在打开多窗口的时候,比如A,B两个应用窗口,我们通过onTouchEvent查看log可以发现,在A窗口上的点击事件不会传给B窗口,当有多个点击事件时,A,B接收到的事件是不一样的,也就是说,在InputDispatcher的notifyMotion中的一个MotionEvent,在传送给app的时候,会根据窗口进行拆分。可以看出,touch事件(MotionEvent)的传送多么的不容易,那么多的操作,多次加工,千辛万苦才传给了接收者。在应用中也有类似的拆分处理,原创 2022-09-29 21:03:25 · 566 阅读 · 0 评论 -
[Android Input系统学习]从mouse事件再看input分发
但是,我们较为熟悉的事件接收方法View#onTouchEvent里并没有调进去,在onTouchEvent里添加log,在点击的时候会有输出,但是滑动时没有输出,mouse设备的滑动难道不一样?较为直观的分析方法是打开InputDispatcher里的log开关,可以看到,滑动的时候,还是会走到notifyMotion方法,我们还可以抓取systrace来查看方法调用流程。可以看出,mouse设备的事件分发流程和屏幕touch事件的流程是一样的,只是处理细节不一样。原创 2022-09-10 12:02:48 · 1014 阅读 · 0 评论 -
minitouch点击原理
minitouch的使用不是太方便,从minitouch的通信方式可以受到启发,我们也可以仿照input命令,来实现一个上层调用接口,input命令没有处理多点事件,这里处理一下就可以了,然后通过injectInputEvent来进行事件的注入。minitouch可以实现touch事件的模拟,其touch注入原理和setevent命令类似,都是写input节点来插入input数据。交互方面,通过socket来和调用者通信,接受touch指令。...原创 2022-07-17 21:55:44 · 2928 阅读 · 0 评论 -
Input系统学习-----InputFilter
android input过滤器InputFilter的一些细节原创 2022-06-19 22:03:17 · 626 阅读 · 5 评论 -
Input系统学习-----move事件的合并
android的move事件在应用端进行了合并,合并到history数据中了原创 2022-06-12 21:09:00 · 561 阅读 · 0 评论 -
Input系统学习-----InputDispatcher中的looper
InputReader负责获取设备的输入数据,然后发给InputDispatcher去处理,为了让2个处理独立起来,不相互影响,它们是在不同的线程中执行的,InputDispatcher里的threadLoop方法是继承的Thread的方法,会在一个while中不停的调用起来,不停的调用,会不会太占用资源?4623bool InputDispatcherThread::threadLoop() {4624 mDispatcher->dispatchOnce();4625原创 2022-05-22 22:11:49 · 276 阅读 · 0 评论 -
input在应用端的分发流程分支情况
input的处理细节比较复杂,在app端时,是通过监听input channel的fd,把事件接入到主线程的looper中,所以我们可以看到,相关的处理是在主线程中进行的,再进行一个试验,在onTouchEvent方法中,对MOTION_DOWN和MOTION_MOVE 事件处理分别打印堆栈,大家觉得会是一样的么?试一下,就会发现,处理流程不一样,头尾是相同的,但是中间出现了分支,同样的touch事件,分成了2种流程,一种相思两处闲愁,这样的处理确实让人发愁。move事件的处理调用到chor原创 2022-04-30 18:39:02 · 912 阅读 · 0 评论 -
【Android】从UI刷新的invalidate到input loop的知识链
在手指绘图的示例app方法中,我们可以了解到invalidate方法的调用,每调用一次,会通过Choreographer注册一次Vsycn信号回调,作为绘图onDraw调用的触发。由于是post请求,所以这里不会被阻塞住。观察onTouchEvent和onDraw里的log,我们可以发现,都是主线程,也就是说都是在UI线程中执行的,这就表示,onTouchEvent和onDraw同时作为主线程中的动作,是会相互影响,抢占执行资源。这里又有个概念出来了,设置同步屏障,可以让绘制有更高的优先级。为什么i原创 2022-04-16 15:39:28 · 1019 阅读 · 0 评论 -
Input系统学习-----MotionEvent多点action的产生
在MotionEvent的log中,当多点触碰的时候,我们可以看到action有时候会是105, 205, 106等等这样的形式,这是点index和事件的组合,251 public static final int ACTION_POINTER_DOWN = 5;252253 /**254 * Constant for {@link #getActionMasked}: A non-primary pointer has gone up.255 * &...原创 2022-03-20 19:34:15 · 373 阅读 · 0 评论 -
Android手游手柄touch猜想
在之前的讨论中,根据蓝牙鼠标和手指点击会发生冲突断触的现象,我们得知了一个“常识”,Android手机中不同的设备touch事件会断触,想要不断触,必须重构MotionEvent事件,最近发现某些游戏手柄,竟然做到了和屏幕touch不断触,看起来确实很强,猜测一下其大概原理,我们需要打开开发者选项中input相关的点击轨迹显示,来方便查看touch事件,1.为什么有input注入的权限?一般是系统级应用才可以,或者是通过辅助功能认证的才有权限,但是通过app_process方原创 2022-03-03 22:04:43 · 2746 阅读 · 14 评论 -
[Android]笔记涂画设计思路
在手机画面上进行笔记涂鸦是一种笔记酷炫的记录方式,一般都是在特定的应用里进行涂画,可以在所有的桌面画面上都进行涂画操作么?仿照PointerLocationView显示触碰轨迹的实现,是可以进行这样的操作的,PointerLocationView的处理是新的触碰会清理掉之前的轨迹,这里把逻辑修改下就可以。但是这样的操作会带来另外一个问题:在涂画操作的时候,下面的桌面可能会随着手指的操作一起滑动。要解决这个问题,可以设置一个“钉着”功能按钮,点击后屏蔽掉桌面应用的input事件获取原创 2021-08-30 20:43:05 · 121 阅读 · 0 评论 -
Input系统学习-----GestureDetector的设计
在应用中,监听到点击事件会调用到onTouch(MotionEvent e) 方法,怎么来识别是什么点击操作呢,常用的事件主要是点击,长按,滑动等,我们可以写方法来进行识别判断,写一个判断方法,如果是点击,就调用相应的处理,长按,就调用长按的处理方法,可以设计一个观察者模式listener来进行实现,Google也是这么想的,Android中提供了GestureDetector 来进行常规手势的识别处理,GestureDetector的用法可以参考https://www.原创 2021-07-25 21:15:01 · 158 阅读 · 1 评论