這個小例子主要用到android手勢部分和Mediaplayer部分的知識。
手勢部分沒啥問題,我們可以通過MotionEvent中定義的Event Code來判斷當前手勢的狀態(按下或者釋放等)
imageButton_white1.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View view, MotionEvent motionEvent) {
if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
play(R.raw.white1);//這個時候建立播放要用的資源檔
imageButton_white1.setImageResource(R.drawable.whiteback1);
}
if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
imageButton_white1.setImageResource(R.drawable.white1);
}
return false;
}
});
Mediaplayer部分目前還有個問題沒有解決:
每次按下鍵盤時我都要調用相應的音符
mediaPlayer01 = MediaPlayer.create(Piano.this, resource);
隨著按鍵次數的增加create的次數也隨著增加。
只要create的次數到了32次之後,再按鍵盤就不會響了,這個時候只要改變一下螢幕的方向程式就可以繼續運行。
我的理解是create後的資源沒有被釋放導致的。
但我在代碼中也加入了
mediaPlayer01.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
public void onCompletion(MediaPlayer arg0) {
mediaPlayer01.release();
Toast.makeText(Piano.this, "資源釋放了!", Toast.LENGTH_SHORT).show();
}
});
這樣的監聽代碼。在資源檔播放完成後釋放。但運行過程中這部分沒有起作用(因為Toast部分沒有執行)。
目前還不知道是什麼原因造成的。
PS: 今天找到一個解決方案
不使用mediaplayer的監聽事件來釋放mediaplayer資源了。直接在play的時候先release一次,然後create資源檔。
不過這種做法稍微有點不大合理
為什麼資源檔在事件觸發的時候才create就不會被正常監聽到呢。如果哪位同學知道原因的請幫忙解答下
源檔案在這裡
MyPiano.rar