2017-02-21 28 views
3

Я хочу выполнять некоторые непрерывные задачи в цикле, пока большой палец находится на моем изображении. Как только большой палец вверх, я хочу прекратить эту работу. Для этого я устанавливаю флаг в ACTION_DOWN и в ACTION_UP. Я отменяю этот флаг, чтобы цикл мог остановиться. Но моя петля становится бесконечной. Также Тосты не появляются во время цикла. Любая помощь будет оценена. Благодаря!!Невозможно выполнить цикл во время события ACTION_DOWN в Android

 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 в том же потоке для других событий. Надеюсь, это тоже поможет другим. Благодаря тем, кто проявил свою озабоченность.

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

Используйте ниже код, чтобы решить вашу проблему:

Вы возвращение false из OnTouchListener, то почему другие события не работают я изменить возвращаемое значение 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(). –

+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; 

Это должно сделать трюк. Я бы рекомендовал вызывать функцию и обрабатывать тосты.

EDIT: Как, @Chetan указал, что вы должны быть true, чтобы сделать работу onTouch.