Android - 检测长按结束

时间:2011-05-31 06:40:23

标签: android ontouchevent

我正在处理用户需要长时间按住按钮的应用程序。

如何检测用户:完成按压或移动触摸位置的时刻?

由于

4 个答案:

答案 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 - 侦听器。