我正在处理用户需要长时间按住按钮的应用程序。
如何检测用户:完成按压或移动触摸位置的时刻?
由于
答案 0 :(得分:48)
我认为您最好的选择是使用onLongClickListener()和onTouchListener()组合该按钮。您需要在触摸侦听器上捕获某些事件,因为它会触发每个触摸事件。
尝试以下内容:
class Blah extends Activity {
private Button mSpeak;
private boolean isSpeakButtonLongPressed = false;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.blahlayout);
Button mSpeak = (Button)findViewById(R.id.speakbutton);
mSpeak.setOnLongClickListener(speakHoldListener);
mSpeak.setOnTouchListener(speakTouchListener);
}
private View.OnLongClickListener speakHoldListener = new View.OnLongClickListener() {
@Override
public boolean onLongClick(View pView) {
// Do something when your hold starts here.
isSpeakButtonLongPressed = true;
return true;
}
}
private View.OnTouchListener speakTouchListener = new View.OnTouchListener() {
@Override
public boolean onTouch(View pView, MotionEvent pEvent) {
pView.onTouchEvent(pEvent);
// We're only interested in when the button is released.
if (pEvent.getAction() == MotionEvent.ACTION_UP) {
// We're only interested in anything if our speak button is currently pressed.
if (isSpeakButtonLongPressed) {
// Do something when the button is released.
isSpeakButtonLongPressed = false;
}
}
return false;
}
}
}
答案 1 :(得分:4)
这些答案非常复杂。如果您返回onClick
,则OnClickListener
中的false
仍会在长按结束时被调用。这是检测长按结束的最简单的地方。
这一点尤为重要,因为如果您在从onTouch
返回false
时实施onLongClick
路由(默认AS会为您提供并且经常提供您想要的内容),那么{{1在没有意识到的情况下,可能会在长按结束时调用代码。
以下是基于拍摄照片或视频的示例:
onClick
正如您所看到的,当您让Android将结束触摸事件传播到private boolean takingVideo = false;
captureButton.setOnClickListener(v -> {
// onClick gets called after normal click or long click
if(takingVideo) {
saveVideo();
} else {
takePhoto();
}
});
captureButton.setOnLongClickListener(v -> {
takeVideo();
return false;
});
private void takePhoto() {
// Save the photo
}
private void takeVideo() {
takingVideo = true;
// Start capturing video
}
private void saveVideo() {
takingVideo = false;
// Save the video
}
时,逻辑变得非常简单。
答案 2 :(得分:1)
我认为您可以使用OnTouchListener。
答案 3 :(得分:-1)
我认为可以使用onFocusChanged - 侦听器。