在短视频系统源代码中追踪代码到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:
@Override
public 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; 这样分发出去的右键事件就成返回键了。
本文转载自网络,转载仅为分享干货知识,如有侵权欢迎联系云豹科技进行删除处理