Android7.1.1 remap鼠标右键为返回键

2024-08-21 10:08

本文主要是介绍Android7.1.1 remap鼠标右键为返回键,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

需求:客户需求当手机连接鼠标时,可以有开关控制鼠标右键的行为的按钮,打开鼠标右键就为返回键,关闭保持原来行为。如果只是将右键改为返回键还是很好做的,找到点击右键的事件改一下就行,但是现在还需要控制,就涉及到交互的问题了。先看效果图。

按钮
追踪代码到InputReader.cpp文件,位置frameworks/native/services/inputflinger/InputReader.cpp。熟悉android事件输入的朋友可能对该文件很了解,InputReader主要功能是处理EventHub传过来的事件,然后加工,再分发给各个InputDispatcher。其中对鼠标事件处理的方法如下:

uint32_t CursorButtonAccumulator::getButtonState() const {uint32_t result = 0;if (mBtnLeft) {result |= AMOTION_EVENT_BUTTON_PRIMARY;}if (mBtnRight) {//右键事件result |= AMOTION_EVENT_BUTTON_SECONDARY;}if (mBtnMiddle) {result |= AMOTION_EVENT_BUTTON_TERTIARY;}if (mBtnBack || mBtnSide) {result |= AMOTION_EVENT_BUTTON_BACK;}if (mBtnForward || mBtnExtra) {result |= AMOTION_EVENT_BUTTON_FORWARD;}return result;
}

通过加log找到右键事件处理的地方,需要做的就是将其改为返回键,可是这段代码是在native层,如何被上层的apk控制呢,也需你可以想到jni的方式,不过感觉太麻烦了。两边需要通信,为何不找一个媒介做一个配置属性,上层设置这个属性,native层读取。property就是一个很好的媒介,两边都可以操纵。动手加起来。
首先在system.prop中添加一个prop属性:persist.sys.mouse.right.back=false
上层按钮修改其值,按钮是一个preference:

    @Overridepublic boolean onPreferenceChange(Preference preference, Object newValue) {if(preference.getKey().equals(KEY_SET_MOUSE)){String newStrValue = (boolean)newValue ? "true" : "false";SystemProperties.set("persist.sys.mouse.right.back", newStrValue);}}

接下来修改InputReader.cpp代码,在右键事件地方添加代码:

uint32_t CursorButtonAccumulator::getButtonState() const {uint32_t result = 0;if (mBtnLeft) {result |= AMOTION_EVENT_BUTTON_PRIMARY;}if (mBtnRight) {char model[10];__system_property_get("ro.product.model", model);char remapback[10];__system_property_get("persist.sys.mouse.right.back", remapback);if(strcmp(remapback,"true") == 0){result |= AMOTION_EVENT_BUTTON_BACK;}else{result |= AMOTION_EVENT_BUTTON_SECONDARY;}}}if (mBtnMiddle) {result |= AMOTION_EVENT_BUTTON_TERTIARY;}if (mBtnBack || mBtnSide) {result |= AMOTION_EVENT_BUTTON_BACK;}if (mBtnForward || mBtnExtra) {result |= AMOTION_EVENT_BUTTON_FORWARD;}return result;
}

C++中要使用prop要记得先添加 #include <sys/system_properties.h>
主要就是改result |= AMOTION_EVENT_BUTTON_BACK; 这样分发出去的右键事件就成
返回键了。
第一次写技术博客,很多不足还请多多包涵。

这篇关于Android7.1.1 remap鼠标右键为返回键的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1092856

相关文章

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下:

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

基于Spring实现自定义错误信息返回详解

《基于Spring实现自定义错误信息返回详解》这篇文章主要为大家详细介绍了如何基于Spring实现自定义错误信息返回效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录背景目标实现产出背景Spring 提供了 @RestConChina编程trollerAdvice 用来实现 HTT

CSS模拟 html 的 title 属性(鼠标悬浮显示提示文字效果)

《CSS模拟html的title属性(鼠标悬浮显示提示文字效果)》:本文主要介绍了如何使用CSS模拟HTML的title属性,通过鼠标悬浮显示提示文字效果,通过设置`.tipBox`和`.tipBox.tipContent`的样式,实现了提示内容的隐藏和显示,详细内容请阅读本文,希望能对你有所帮助... 效

springMVC返回Http响应的实现

《springMVC返回Http响应的实现》本文主要介绍了在SpringBoot中使用@Controller、@ResponseBody和@RestController注解进行HTTP响应返回的方法,... 目录一、返回页面二、@Controller和@ResponseBody与RestController

韦季李输入法_输入法和鼠标的深度融合

在数字化输入的新纪元,传统键盘输入方式正悄然进化。以往,面对实体键盘,我们常需目光游离于屏幕与键盘之间,以确认指尖下的精准位置。而屏幕键盘虽直观可见,却常因占据屏幕空间,迫使我们在操作与视野间做出妥协,频繁调整布局以兼顾输入与界面浏览。 幸而,韦季李输入法的横空出世,彻底颠覆了这一现状。它不仅对输入界面进行了革命性的重构,更巧妙地将鼠标这一传统外设融入其中,开创了一种前所未有的交互体验。 想象

Windows如何添加右键新建菜单

Windows如何添加右键新建菜单 文章目录 Windows如何添加右键新建菜单实验环境缘起以新建`.md`文件为例第一步第二步第三步 总结 实验环境 Windows7 缘起 因为我习惯用 Markdown 格式写文本,每次新建一个.txt后都要手动修改为.md,真的麻烦。如何在右键新建菜单中添加.md选项呢? 网上有很多方法,这些方法我都尝试了,要么太麻烦,要么不凑效

Unity3D自带Mouse Look鼠标视角代码解析。

Unity3D自带Mouse Look鼠标视角代码解析。 代码块 代码块语法遵循标准markdown代码,例如: using UnityEngine;using System.Collections;/// MouseLook rotates the transform based on the mouse delta./// Minimum and Maximum values can

简单的角色响应鼠标而移动

actor类 //处理移动距离,核心是找到角色坐标在世界坐标的向量的投影(x,y,z),然后在世界坐标中合成,此CC是在地面行走,所以Y轴投影始终置为0; using UnityEngine; using System.Collections; public class actor : MonoBehaviour { public float speed=0.1f; CharacterCo

Android中如何实现adb向应用发送特定指令并接收返回

1 ADB发送命令给应用 1.1 发送自定义广播给系统或应用 adb shell am broadcast 是 Android Debug Bridge (ADB) 中用于向 Android 系统发送广播的命令。通过这个命令,开发者可以发送自定义广播给系统或应用,触发应用中的广播接收器(BroadcastReceiver)。广播机制是 Android 的一种组件通信方式,应用可以监听广播来执行