2012-09-08 139 views
0

我有一個應用程序,我需要在ImageButton每次觸摸後有一個延遲。OnTouch延遲(Android)

我試過Thread.sleep()方法,但我不確定這是否是處理它的最好方法。

你們推薦什麼?

任何幫助被讚賞!

還有一件事:我想讓onTouch()事件的內容被觸發,那麼我想延遲下一個onTouch()事件的「X」秒。這就像阻止用戶在按鈕中點擊過多次。

+0

也許更多關於你正在嘗試做什麼......你是否試圖在延遲後發生事件?那麼'Handler.postDelayed()'可能是正確的解決方案 – JRaymond

+0

JRaymond,你可以發佈一些示例代碼嗎?我是一個noob! =) –

+0

我會的,但帕維爾的回答幾乎正是我告訴你要做:) – JRaymond

回答

3

因爲所有的觸摸事件都是由UI線程處理的,所以Thread.sleep()會阻塞你的UI線程,這是我希望不是你要找的東西。 我想爲您解決問題的最正確的方法是使用你的onClick處理postDelayed(Runnable, long)接口,使您的延後執行:

@Override 
public void onClick(View v) 
{ 
    postDelayed(new Runnable() 
    { 

     @Override 
     public void run() 
     { 
      // do your stuff here 
     } 
    }, 10000); //10sec delay 
} 

UPDATE:

如果希望用戶防止點擊過快上你的形象的看法,我強烈建議您onClick而非onTouch去(除非有嚴重的原因)

但是,請查看代碼片斷這可能會幫助您:

private boolean blocked = false; 
private Handler handler = new Handler(); 

@Override 
public boolean onTouchEvent(MotionEvent event) 
{ 
    if (event.getAction() == MotionEvent.ACTION_DOWN) 
    { 
     if (!blocked) 
     { 
      blocked = true; 
      handler.postDelayed(new Runnable() 
      { 
       @Override 
       public void run() 
       { 
        blocked = false; 
       } 
      }, 1000); 
     } else 
     { 
      return false; 
     } 
    } 
    return super.onTouchEvent(event); 
} 
+1

謝謝你的回答帕維爾杜德卡。我正在使用onTouch()事件...是否也可以將您的解決方案與onTouch()一起使用? –

+0

當然,但是正如你所知,onTouch在每次用戶交互時不會被調用一次,所以你可能需要引入一些標誌來運行你的延遲的東西一次,或者檢查運動事件的類型(例如,只對'ACTION_DOWN'事件作出反應,取決於在你的需求基本上... –

+0

再次感謝你的答覆。我正在使用ACTION_DOWN事件,以確保我得到它只是一次。我試圖使用你的代碼,但編譯器說我需要創建方法postDelayed並且我必須將onTouch()事件的arg1聲明爲final。我該如何解決這個問題? –