2012-09-08 109 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。我该如何解决这个问题? –