我正在开发一个钢琴应用程序,它不是最好的,但它是一个开始。
我使用下面的代码来播放声音并通过触摸事件更改按钮的图像。
C4.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
// PRESSED
if (Sustain == "false" ) {
streamI25 = sp.play(SC4, Volume, Volume, 0, 0, 1);
C4.setBackgroundResource(R.drawable.whitekey1cilicked);
}
else {
sp.play(SC4, Volume, Volume, 0, 0, 1);
C4.setBackgroundResource(R.drawable.whitekey1cilicked);
}
// just in case somthings happend
final Handler handler2 = new Handler();
handler2.postDelayed(new Runnable() {
@Override
public void run() {
//Do something after 100ms
C4.setBackgroundResource(R.drawable.whitekey1);
}
}, keyUpTime);
return true; // if you want to handle the touch event
case MotionEvent.ACTION_UP:
// RELEASED
C4.setBackgroundResource(R.drawable.whitekey1);
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
//Do something after 100ms
sp.pause(streamI25);
}
}, releaseTime);
return true; // if you want to handle the touch event
}
return false;
}
});
是不是?为钢琴中的每一个键编写所有这些代码并不愚蠢吗?
我可以在OnClick方法中为我的所有按钮使用几行代码,但我需要onTouch的事件。写72 onTouchListener是否正确?
答案 0 :(得分:1)
您最好在活动中使用OnTouchListener或使用implements OnTouchListener
扩展的其他处理类。您的视图可以有一个您在方法中分析的标记(视图作为参数传递给函数调用)。
你可以写
class MyActivity extends Activity implements View.OnTouchListener
然后
C4.setTag("C4"); // or by XML
C4.setOnTouchListener(this);
并在onTouch中更改view
而不是C4
,并根据标记选择声音。
答案 1 :(得分:1)
多次重复完全相同的代码总是一个坏主意。这里的一个选项是创建一个命名类,例如添加PianoKeyTouchListener,其中包含此事件处理代码。