单击并按下同一按钮
Click and press-release on same button
我实现了自己的相机来捕捉图像和视频。我想在同一个按钮上执行两个操作。
- 单击按钮时我想执行图像捕获代码。
- 当我连续按下按钮时,我想开始录音,当我松开按钮时,我想停止录音。
假设我有 3 个方法来完成上述任务,即 captureImage()、startVideo() 和 stopVideo()。
如何在同一个按钮上实现以上两个动作?以上三种方法应该什么时候调用?
我尝试使用 onClick、ACTION_DOWN 和 ACTION_UP,但是,在这种情况下,永远不会调用 onClick。总是 ACTION_DOWN 和 ACTION_UP 被调用。
你可以使用onTouchListener
这将 return 具有所需事件的 MotionEvent ACTION_UP ACTION_DOWN ...
使用 OnTouchListener 和 OnClickListener :
View v = find....;
v.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//capture();
}
});
v.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
int action = motionEvent.getAction();
if(action==MotionEvent.ACTION_DOWN)startRecording();
if(action==MotionEvent.ACTION_UP)stopRecording();
return true;//return true to avoid onClick...
}
});
}
我就是这样解决的。 On ACTION_DOWN 1 秒后开始录像。在 ACTION_UP 检查您是否正在捕获视频然后停止捕获,否则捕获图像并取消视频捕获处理程序。
private Runnable mRunnable = new Runnable() {
@Override
public void run() {
isImage = false;
startRecording();
}
};
mCaptureButton.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
// Start recording after 1 sec
isImage = true;
mHandler = new Handler();
mHandler.postDelayed(mRunnable, 1000);
break;
case MotionEvent.ACTION_UP:
// If video recording was started after 1 sec delay then stop recording
// otherwise capture image
if(isImage) {
// Cancel handler for video recording
mHandler.removeCallbacks(mRunnable);
// Capture image
mCamera.takePicture(null, null, mPicture);
} else {
// Stop video recording
stopRecording();
}
break;
}
return true;
}
});
我实现了自己的相机来捕捉图像和视频。我想在同一个按钮上执行两个操作。
- 单击按钮时我想执行图像捕获代码。
- 当我连续按下按钮时,我想开始录音,当我松开按钮时,我想停止录音。
假设我有 3 个方法来完成上述任务,即 captureImage()、startVideo() 和 stopVideo()。
如何在同一个按钮上实现以上两个动作?以上三种方法应该什么时候调用?
我尝试使用 onClick、ACTION_DOWN 和 ACTION_UP,但是,在这种情况下,永远不会调用 onClick。总是 ACTION_DOWN 和 ACTION_UP 被调用。
你可以使用onTouchListener
这将 return 具有所需事件的 MotionEvent ACTION_UP ACTION_DOWN ...
使用 OnTouchListener 和 OnClickListener :
View v = find....;
v.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//capture();
}
});
v.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
int action = motionEvent.getAction();
if(action==MotionEvent.ACTION_DOWN)startRecording();
if(action==MotionEvent.ACTION_UP)stopRecording();
return true;//return true to avoid onClick...
}
});
}
我就是这样解决的。 On ACTION_DOWN 1 秒后开始录像。在 ACTION_UP 检查您是否正在捕获视频然后停止捕获,否则捕获图像并取消视频捕获处理程序。
private Runnable mRunnable = new Runnable() {
@Override
public void run() {
isImage = false;
startRecording();
}
};
mCaptureButton.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
// Start recording after 1 sec
isImage = true;
mHandler = new Handler();
mHandler.postDelayed(mRunnable, 1000);
break;
case MotionEvent.ACTION_UP:
// If video recording was started after 1 sec delay then stop recording
// otherwise capture image
if(isImage) {
// Cancel handler for video recording
mHandler.removeCallbacks(mRunnable);
// Capture image
mCamera.takePicture(null, null, mPicture);
} else {
// Stop video recording
stopRecording();
}
break;
}
return true;
}
});