在项目中有一个触摸发送语音的功能,我使用了view的setOnTouchListener(),监听手指触摸的状态进行相应操作。
mHoldToTalk.setOnTouchListener((v, event) -> {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
LogUtil.log("action_down");
break;
case MotionEvent.ACTION_MOVE:
LogUtil.log("action_move");
break;
case MotionEvent.ACTION_UP:
LogUtil.log("action_up");
break;
default:
break;
}
return true;
});
之前一直是好的,突然间MotionEvent.ACTION_UP不执行了,在网上查了许多资料,都说只要返回true就可以了,但我明明返回的是turn啊,而且也没有什么事件拦截之类的操作,折腾了好久发现其实不是所有的都手机有问题,就我使用的小米8有问题,它确实没有走MotionEvent.ACTION_UP,而是执行了MotionEvent.ACTION_CANCEL,找到问题就好办了,我们只需要将之前MotionEvent.ACTION_UP中的操作在MotionEvent.ACTION_CANCEL里面执行一遍就可以了。
mHoldToTalk.setOnTouchListener((v, event) -> {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
LogUtil.log("action_down");
AudioRecordManager.getInstance(getContextWithinHost()).startRecord();
break;
case MotionEvent.ACTION_MOVE:
LogUtil.log("action_move");
if (isCancelled(v, event)) {
AudioRecordManager.getInstance(getContextWithinHost()).willCancelRecord();
} else {
AudioRecordManager.getInstance(getContextWithinHost()).continueRecord();
}
break;
case MotionEvent.ACTION_UP:
LogUtil.log("action_up");
case MotionEvent.ACTION_CANCEL:
LogUtil.log("action_cancel");
AudioRecordManager.getInstance(getContextWithinHost()).stopRecord();
AudioRecordManager.getInstance(getContextWithinHost()).destroyRecord();
break;
default:
break;
}
return true;
});
好了,完美解决我的问题,折腾了好久,在这里记录一下,希望能够帮到你。