作者snowoffish (巧克力老爹)
看板AndroidDev
标题[问题] Snoudpool+TouchEvent一个疑问
时间Sat Apr 16 16:14:05 2011
开发层: (应用/框架/库/核心)
应用
问题:
我用TouchEvent的Dowm&Move来操作Soundpool
让他指到特定的位置後播放音效
可是他会变成连续播放好几次
有什麽办法能让他点一下or滑动只发出一次音效吗??
我有自己写了一个sleep可是他似乎没效果-.-
感谢解答!!
程式码: (请多利用置底文网站)
case MotionEvent.ACTION_MOVE:
if(x>=15&&x<=40){sp[5].play(m[5], 1 , 1 , 0 , 0 , 1 );delay(100);}
break;
这是sleep的程式码~
public void delay(final int t){
new Thread()
{
public void run()
{
try
{
sleep(t);
}
catch (Exception e)
{
e.printStackTrace();
}
}
}.start(); /* 开始执行执行绪 */
}
--
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 122.127.178.123
1F:推 ericinttu:你在模拟器还是手机测的? 04/16 16:23
2F:推 ericinttu:还有就是你确定 MotionEvent.ACTION_MOVE 里,只会送出 04/16 16:27
3F:→ ericinttu:一个事件? (我不确定所以先问看看) 04/16 16:27
手机,我也是觉得只要move到,他就一次送出好多个事件
而我之前是用MediaPlayer不会出现这种问题
但因为我一口气需要6个所以很延迟就改用soundpool
※ 编辑: snowoffish 来自: 122.127.178.123 (04/16 16:35)
4F:→ snowoffish:要如何让他一次只送一个事件阿...>< 04/16 16:36
5F:推 abccbaandy:在你的程式码前面用个boolean判断不就好了? 04/16 16:53
6F:→ abccbaandy:if(x>=15&&x<=40) <=true的话就把那个boolean变false 04/16 16:54
public boolean onTouchEvent(MotionEvent event) {
float x=event.getX();
case MotionEvent.ACTION_MOVE:
if(x>=15&&x<=40){sp[5].play(m[5], 1 , 1 , 0 , 0 , 1 );
return false;}
break;
}
return super.onTouchEvent(event);
}
不好意思我Java没学很深不太会用Boolean的ture&false可否请教要+在哪?
我+在里面没反应还是一样
7F:推 ericinttu:楼上是一种作法. 另一种作法是看看有没有别种事件可以达 04/16 16:59
8F:→ ericinttu:到同样效果但只触发一次. 04/16 16:59
9F:推 ericinttu:我不知道你这的操作的情境是怎样的,所以没办法给明确的 04/16 17:02
10F:→ ericinttu:建议. 04/16 17:02
11F:推 ericinttu:ACTION_DOWN 应该是最接近的, 但不确定有没有反效果. 04/16 17:04
12F:→ snowoffish:down也是一样 我两者都有用@@ 04/16 17:13
※ 编辑: snowoffish 来自: 122.127.178.123 (04/16 17:24)
13F:推 afz096:ACTION_MOVE 会将整个 move 的动作拆成多个 event 04/16 21:40
14F:→ afz096:利用旗标(boolean)的方式,还没播放的时候为 true 04/16 21:41
15F:→ afz096:播放之後为 false,ACTION_UP 之後为 true 04/16 21:41
16F:→ snowoffish:可是我用Action_Down也是一样的情况呢!! 04/16 22:49
public boolean bool;
public boolean onTouchEvent(MotionEvent event)
{
float x=event.getX();
float y=event.getY();
/* 显示触碰点的数量 */
// myText2.setText(""+event.getPointerCount());
/* event的Action判断 */
switch(event.getAction())
{
case MotionEvent.ACTION_MOVE:
if(bool=true){
if(x>=15&&x<=40){sp[5].play(m[5], 1 , 1 , 0 , 0 , 1 );}
if(x>=70&&x<=95){sp[4].play(m[4], 1 , 1 , 0 , 0 , 1 );}
if(x>=113&&x<=140){sp[3].play(m[3], 1 , 1 , 0 , 0 , 1 );}
bool=false;}
break;
/* 触碰事件结束 */
case MotionEvent.ACTION_UP:
bool=true;
break;
}
return super.onTouchEvent(event);
}
还是跟机关枪一样连发~
※ 编辑: snowoffish 来自: 122.127.178.123 (04/16 23:32)
17F:推 realmeat:ACTION_UP 在动作 04/16 23:40
18F:→ snowoffish:没办法耶 我是吉他程式所以要一碰就有 04/16 23:48
19F:推 abccbaandy:你搞错意思了...if(bool){你的程式} 这样才对 04/16 23:52
20F:→ abccbaandy:return XX那个好像有别的意思,有点忘了 04/16 23:52
21F:推 realmeat:吉他程式喔, 那最好DOWN, UP, MOVE要混用 04/16 23:53
22F:→ realmeat:单靠一个的话不太行 04/16 23:54
23F:推 ericinttu:同楼上 04/16 23:54
24F:推 abccbaandy:吉他程式...该不会是专题吧XD 04/16 23:56
25F:→ snowoffish:!!!恍然大悟 对 再做专题xd 04/17 00:01
我似乎失败了...bool完全没效果XD我把它改成false还是可以用move是哪招...
※ 编辑: snowoffish 来自: 122.127.178.123 (04/17 00:17)
26F:→ snowoffish:已经快要被搞死了 囧rz~除了这功能还有一大堆在等我... 04/17 00:22
27F:→ realmeat: == <-- 04/17 00:26
28F:→ realmeat:应该会跳warnning 注意一下compile 讯息 04/17 00:26
29F:→ snowoffish:哦!谢谢!难怪我怎觉得平常都要== 怎麽=没错 04/17 01:07
30F:→ snowoffish:DOWN成功了!可是MOVE还要换个逻辑 感谢各位^^ 04/17 01:09
31F:→ snowoffish:WOW~三样都搞好了 自己的写法虽然感觉有点蠢XDD 04/17 11:11