2013-03-12 69 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; 
      } 
     });