2017-02-21 43 views
3

只要拇指在我的imageview上,我想在循环中执行一些连续任务。一旦拇指向上,我想停止这项工作。为此,我在ACTION_DOWN和ACTION_UP上设置了一个标志,我取消了该标志,以便循环可以停止。但是我的循环变得无限。此外,敬酒在循环时不显示。任何帮助将不胜感激。谢谢!!下面的代码Android中的ACTION_DOWN事件无法循环

 ivThumb.setOnTouchListener(new View.OnTouchListener() { 
       @Override 
       public boolean onTouch(View v, MotionEvent event) { 
        if (event.getAction() == MotionEvent.ACTION_DOWN) { 
         Toast.makeText(c, "action down", Toast.LENGTH_SHORT).show(); 
         ivCharger.setVisibility(View.VISIBLE); 
         tvCharging.setVisibility(View.VISIBLE); 
         flag = true; 
    //     while (flag){ 
    //      Toast.makeText(c, "hello", Toast.LENGTH_SHORT).show(); 
    // 
    //     } 

        } 
        else if (event.getAction() == MotionEvent.ACTION_MOVE){ 
         Toast.makeText(c, "move", Toast.LENGTH_SHORT).show(); 
        } 
        else if (event.getAction() == MotionEvent.ACTION_UP) { 
         Toast.makeText(c, "aCTION UP", Toast.LENGTH_SHORT).show(); 
         flag = false; 
         ivCharger.setVisibility(View.GONE); 
         tvCharging.setVisibility(View.GONE); 
         //ivBattery.setImageResource(R.drawable.orange); 
        } 
return true; 
      } 
     }); 

回答

0

我在做什么错了,我正在让我的程序无限循环在同一个线程中。它在循环中陷入困境,所以不能为其他事件返回true。 解决方案是将该循环给予另一个线程,并在其他事件的同一线程中返回true。希望它能帮助其他人。 感谢那些表达他们关注的人。

ivThumb.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 

       switch (event.getAction()) { 
        case MotionEvent.ACTION_DOWN: 
         ivThumb.setPressed(true); 
         Toast.makeText(getBaseContext(), "ACTION_DOWN", Toast.LENGTH_SHORT).show(); 
         chargingFlag = true; 
         Thread thread = new Thread() { 
          @Override 
          public void run() { 
           while (chargingFlag){ 

           } 
          } 
         }; 

         thread.start(); 
//      while (chargingFlag){ 
// 
//      } 
         break; 
        case MotionEvent.ACTION_MOVE: 
         Toast.makeText(getBaseContext(), "ACTION_MOVE", Toast.LENGTH_SHORT).show(); 
         break; 
        case MotionEvent.ACTION_UP: 
         ivThumb.setPressed(false); 
         Toast.makeText(getBaseContext(), "ACTION_UP", Toast.LENGTH_SHORT).show(); 
         chargingFlag = false; 
         break; 
       } 
       return true; 
      } 
     }); 
1

使用来解决问题:

您有回报falseOnTouchListener,这就是为什么不工作我其他事件改变返回值true

public static boolean flag = false; 
ivThumb.setOnTouchListener(new View.OnTouchListener() { 
@Override 
public boolean onTouch(View v, MotionEvent event) { 

switch (event.getAction()) { 
case MotionEvent.ACTION_DOWN: 
Toast.makeText(getBaseContext(), "ACTION_DOWN", Toast.LENGTH_SHORT).show(); 
flag = true; 
new Thread(new Runnable() { 
    @Override 
    public void run() { 
    while (flag) { 
    Log.i(getClass().getSimpleName(), "ACTION_DOWN"); 
    Log.i(getClass().getSimpleName(), "flag=" + flag); 
    } 
} 
}).start(); 

break; 

case MotionEvent.ACTION_MOVE: 
Toast.makeText(getBaseContext(), "ACTION_MOVE", Toast.LENGTH_SHORT).show(); 
break; 

case MotionEvent.ACTION_UP: 
flag = false; 
Toast.makeText(getBaseContext(), "ACTION_UP", Toast.LENGTH_SHORT).show(); 
break; 
} 

return true; 
} 
}); 
+0

你从onTouch()方法返回true。 –

+0

我已经回归真实。另外当我删除/评论循环它工作正常。 – Naila

+0

是你的问题解决? –

2

使用switch并添加setPressed参数,

switch (event.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       ivThumb.setPressed(true); 
       //Your Function 
       break; 

      case MotionEvent.ACTION_MOVE: 
       //Your Function 
       break; 

      case MotionEvent.ACTION_UP: 
       //Your Function 
       ivThumb.setPressed(false); 
       invalidate(); 
       break; 

这应该做的伎俩。我会建议调用一个函数并在那里处理吐司。

编辑: 至于,@Chetan指出你回来应该是true使onTouch工作。