проблема с операторами if/else и switch

следующий код предназначен для обработки событий ACTION_DOWN и ACTION_UP для кнопки с именем Clash. идея состоит в том, что однажды if/else определяет, что событие onTouch было вызвано конфликтом, а оператор switch затем определяет, что делать, основываясь на действии. я не знаю, проблема в том, что операторы switch не возвращают true, и это может быть связано с проблемой. когда я добавляю возврат, eclipse говорит, что код недоступен, чего я не понимаю. У меня сложилось впечатление, что вы не можете вырваться из переключателя без перерыва.

что на самом деле происходит, так это то, что первый звук будет повторяться, но код, похоже, никогда не обнаружит действие, когда кнопка будет отпущена, и поэтому звук воспроизводится вечно. любая помощь будет оценена.

 public boolean onTouch(View v, MotionEvent event) {
 MediaPlayer mp = MediaPlayer.create(getBaseContext(), R.raw.clash);
 if (v.getId() == R.id.clash){

 switch (event.getAction()){

 case MotionEvent.ACTION_DOWN:
  mp.setLooping(true);
  mp.start();
   break;

 case MotionEvent.ACTION_UP:
  mp.pause();
  break;
 }

}
return true;
}
   });

person Prmths    schedule 13.10.2010    source источник
comment
даже после добавления return true; я все еще ничего не получаю на действие вверх. я даже могу поставить код для воспроизведения звука в этом случае, а не для действия, и он ничего не делает.   -  person Prmths    schedule 13.10.2010
comment
Я не уверен в этом, но не будет ли это создавать новый объект MediaPlayer каждый раз, когда вы нажимаете ИЛИ отпускаете? В каком случае вы будете вызывать pause() в другом экземпляре MediaPlayer, чем start()?   -  person Kevin Coppock    schedule 14.10.2010
comment
это имеет смысл. проблема в том, что когда я перемещаю создание mp в часть логики, которая обрабатывает событие ACTION_DOWN, ничего не происходит. он вообще не воспроизводит никаких звуков. я начинаю думать о том, чтобы полностью отказаться от MediaPlayer, так как мне приходится создавать и уничтожать объект каждый раз, когда воспроизводится звук. Каждый поиск, который я делаю, утверждает, что вы не можете установить DataSource на лету.   -  person Prmths    schedule 14.10.2010
comment
после более тщательного изучения я обнаружил, что при создании объекта mp в операторе if/else logcat даже не видит, когда нажимается кнопка. как будто весь слушатель сломан.   -  person Prmths    schedule 14.10.2010
comment
Хм. Это странно. Если звук воспроизводится с MediaPlayer вне оператора switch, то он должен достигать случая ACTION_DOWN. Я собираюсь опубликовать некоторые мысли в посте ниже — у меня нет возможности проверить это прямо сейчас, поэтому некоторый синтаксис может быть отключен.   -  person Kevin Coppock    schedule 14.10.2010


Ответы (1)


//Add the following line in the code before your setOnTouchListener()
MediaPlayer mp;

public boolean onTouch(View v, MotionEvent event) { 

    if (v.getId() == R.id.clash){ 

        switch (event.getAction()) { 

        case MotionEvent.ACTION_DOWN: 
            mp = MediaPlayer.create(getBaseContext(), R.raw.clash); 
            mp.setLooping(true); 
            mp.start(); 
            break; 

        case MotionEvent.ACTION_UP: 
            if(mp != null) 
            {
                mp.pause(); 
                mp.release();
            }
            break; 
        } 
    } 
} 

// I'm assuming this was from the onTouchListener()? -> }); 

Просто мысль.

person Kevin Coppock    schedule 13.10.2010
comment
это работает просто отлично. большое спасибо, чувак. это была основная проблема, но я не мог на всю жизнь решить ее правильно. - person Prmths; 14.10.2010