【发布时间】:2025-06-27 21:20:02
【问题描述】:
下面的代码是为一个名为 crash 的按钮处理 ACTION_DOWN 和 ACTION_UP 事件。这个想法是,一旦 if/else 确定 onTouch 事件是由冲突引起的,switch 语句然后根据动作确定要做什么。我不知道问题是否在于 switch 语句没有返回 true 并且可能与问题有关。当我添加返回时,eclipse 说代码无法访问,我不明白。我的印象是,您无法在没有中断的情况下摆脱开关。
实际发生的情况是第一个声音会循环播放,但代码似乎永远不会在释放按钮时检测到动作,因此声音会一直播放。任何帮助将不胜感激。
public boolean onTouch(View v, MotionEvent event) {
MediaPlayer mp = MediaPlayer.create(getBaseContext(), R.raw.*);
if (v.getId() == R.id.*){
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
mp.setLooping(true);
mp.start();
break;
case MotionEvent.ACTION_UP:
mp.pause();
break;
}
}
return true;
}
});
【问题讨论】:
-
即使在添加“return true;”之后我仍然没有采取任何行动。在这种情况下,我什至可以放代码来播放声音,而不是采取行动,它什么也不做。
-
我不确定这一点,但这不会在您每次按下或释放时创建一个新的 MediaPlayer 对象吗?在这种情况下,您将在与调用
start()不同的 MediaPlayer 实例上调用pause()? -
确实有道理。问题是,当我将 mp 的创建移到处理 ACTION_DOWN 事件的逻辑部分时,什么也没有发生。它根本不播放任何声音。我开始考虑完全放弃 MediaPlayer,因为每次播放声音时我都必须创建和销毁对象。我所做的每次搜索都表明您不能即时设置数据源。
-
经过仔细检查,我发现在 if/else 语句中创建了 mp 对象后,logcat 甚至看不到单击按钮的时间。就好像整个听众都坏了一样。
-
嗯。这很奇怪。如果声音在 switch 语句之外通过 MediaPlayer 播放,则它必须达到 ACTION_DOWN 情况。我将在下面的帖子中发表一些想法 - 我现在没有办法对此进行测试,所以一些语法可能会被关闭。
标签: java if-statement switch-statement