我正在开发一个使用录音功能的 Android 应用程序,为此我正在点击按钮进行录音,就像用户按住按钮超过 3 秒一样,它将允许录音。
为此,我使用的是触摸侦听器,但问题是,如果用户只是单击按钮而不保持它,那么就会调用录音或函数。我的代码如下:
mBtnSendAudio.setOnTouchListener(new OnTouchListener() {
boolean shouldRecord = true;
@Override
public boolean onTouch(View v, MotionEvent event) {
if(!canChat) {
Toast.makeText(getBaseContext(), "Turned Off Chat", Toast.LENGTH_SHORT).show();
return true;
}
if (event.getAction() == MotionEvent.ACTION_DOWN) {
mLastDown = System.currentTimeMillis();
shouldRecord = true;
startRecording();
mLLAudioRecordingHover.setVisibility(View.VISIBLE);
rectAudioButton = new Rect(v.getLeft(), v.getTop(), v.getRight(), v.getBottom());
mStartTime = System.currentTimeMillis();
mRecordHandler.removeCallbacks(mUpdateTimeTask);
mRecordHandler.postDelayed(mUpdateTimeTask, 100);
} else if (event.getAction() == MotionEvent.ACTION_UP) {
if (shouldRecord) {
mLLAudioRecordingHover.setVisibility(View.GONE);
mLastDuration = System.currentTimeMillis() - mLastDown;
mRecordHandler.removeCallbacks(mUpdateTimeTask);
mLLAudioRecordingHover.setVisibility(View.GONE);
stopRecording(true, mLastDuration);
}
}
if (event.getAction() == MotionEvent.ACTION_MOVE) {
// finger move outside of button's bounds
if (!rectAudioButton.contains(v.getLeft() + (int) event.getX(), v.getTop()+ (int) event.getY()) && shouldRecord) {
mRecordHandler.removeCallbacks(mUpdateTimeTask);
shouldRecord = false;
stopRecording(shouldRecord, 0);
mLLAudioRecordingHover.setVisibility(View.GONE);
}
}
return v.onTouchEvent(event);
}
});
一次尝试如下
mBtnSendAudio.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View arg0, MotionEvent arg1) {
switch (arg1.getAction()) {
case MotionEvent.ACTION_DOWN:
mRecordHandler.postDelayed(run, 3500/* OR the amount of time you want */);
break;
default:
mRecordHandler.removeCallbacks(run);
break;
}
return true;
}
});
这是可以更改录制状态的
Runnable run = new Runnable() {
@Override
public void run() {
shouldRecord = true;
}
};
更新:
然后你必须使用手势检测器,如下所示
private GestureDetector gestureDetector = new GestureDetector(this, new SimpleOnGestureListener {
@Override
public boolean onSingleTapConfirmed(MotionEvent event) {
return true;
}
});
然后在 OnTouchListener 的 onTouch(-,-) 中
if (gestureDetector.onTouchEvent(arg1)) {
// single tap
//write your code for single click
return true;
}
希望它能帮助你。
您在这里有两个选择:首先,您可以忘记3秒并使用View.OnLongClickListener,这是大多数开发人员用来检测按住事件的标准侦听器,或者您可以在if (event.getAction() == MotionEvent.ACTION_DOWN) {}
条件中设置计时器,这是3秒计时器的代码:
new CountDownTimer(3000, 1000) {
public void onTick(long millisUntilFinished) {
}
public void onFinish() {
//your caode
}
}.start();
在方法中使用所需的功能onFinish()
。