2010-10-13 101 views
0

下面的代码是处理名为clash的按钮的ACTION_DOWN和ACTION_UP事件。这个想法是,一旦if/else确定onTouch事件是由冲突引起的,并且switch语句根据该动作确定要执行的操作。我不知道是否问题是switch语句没有返回true,并且可能与问题有关。当我添加一个返回时,eclipse说代码无法访问,我不明白。我的印象是,你不能没有休息地突破开关。问题if/else和switch语句

实际发生的事情是,第一个声音会循环播放,但是当释放按钮时代码从未检测到动作,所以声音永远播放。任何帮助,将不胜感激。

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; 
} 
    }); 
+0

即使添加“返回true”后我仍然没有得到任何行动。在这种情况下,我甚至可以让代码播放声音,而不是采取行动,它什么也不做。 – Prmths 2010-10-13 19:51:42

+3

我不确定这一点,但是不会在每次按OR释放时创建新的MediaPlayer对象吗?在这种情况下,你会在不同的MediaPlayer实例上调用'pause()'而不是调用'start()'? – kcoppock 2010-10-13 20:04:18

+0

确实有意义。问题是,当我将mp的创建移动到处理ACTION_DOWN事件的逻辑部分时,没有任何反应。它根本不播放任何声音。我开始考虑彻底放弃MediaPlayer,因为每次播放声音时都必须创建并销毁对象。我做的每一个搜索都说你不能动态设置数据源。 – Prmths 2010-10-13 20:14:18

回答

3
//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()? -> }); 

只是一个想法。

+0

,工作得很好。非常感谢,伙计。这是一个基本的问题,但我不能为我的生活得到它的权利。 – Prmths 2010-10-13 21:10:34

+0

没问题!很高兴为你工作。 – kcoppock 2010-10-13 21:19:32