2013-03-12 71 views
0

我希望当你在3秒钟内按住一个按钮时,我会尝试使用上面的代码,但只有当我在暂停期间停止按住时才会执行某些操作。我应该实现一个监听器或类似的东西吗?知道按钮被按住的时间

finishPushing = true; 
. 
. 
.  

button.setOnTouchListener(new OnTouchListener() 
      { 

       @Override 
       public boolean onTouch(View v, MotionEvent event) { 

        if(android.os.SystemClock.elapsedRealtime() - event.getDownTime() > 3000 && (event.getPointerCount() == 1) && finishPushing) 
        { 
         // Do something      

         finishPushing = false; 
        } 
        else{ 
         finishPushing = true; 
        } 
        return false; 
       } 

      }); 
+1

你以正确的方式,但你忘了,这个方法只是获取新的触摸事件解雇。在你坚持下来的时候,最后一个事件就是key_down,下一个将是key_up。你可以开始一个小循环(确保它的异步),在做某件事之前它会计为3。如果您在3秒钟之前收到key_up,则取消它。 – 2013-03-12 09:21:39

+0

是的,我想到了,所以我必须实现一个监听器不是吗? – 2013-03-12 09:22:56

+1

这是一种方式。你也可以启动一个新的线程(AsyncTask会很容易),并且如果它通过,从那里启动你的动作。你可以在AsyncTask上调用.cancel()。请记住,这并不会取消任务,它只是设置一个标志,并且您必须在AsyncTask中检查isCancelled()。 – 2013-03-12 09:24:41

回答

2

解决由于Android Touch Event determining duration

 button.setOnTouchListener(new OnTouchListener() 
     { 
      private final Handler handler = new Handler(); 
      private final Runnable runnable = new Runnable() { 
       public void run() { 
        if(mBooleanIsPressed) 
        { 
         // do whatever 
        } 
       } 
      }; 


      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       if(event.getAction() == MotionEvent.ACTION_DOWN) { 
        // Execute your Runnable after 5000 milliseconds = 5 seconds. 
//After this 5secs it will check if is pressed 
        handler.postDelayed(runnable, 5000);  
        mBooleanIsPressed = true;    
       } 

       if(event.getAction() == MotionEvent.ACTION_UP) { 
        if(mBooleanIsPressed) { 
         mBooleanIsPressed = false; 
         handler.removeCallbacks(runnable); 
        } 
       } 
       return false; 
      } 
     });