Android_弹钢琴(多媒体应用)

Android_弹钢琴(多媒体应用)

所需文件
在这里插入图片描述
在这里插入图片描述
MainActivity

package com.example.a524_11_playpiano;

import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;

import androidx.appcompat.app.AppCompatActivity;

import java.util.HashMap;

public class MainActivity extends AppCompatActivity implements View.OnClickListener
{
   
    private SoundPool soundpool;
    private HashMap<Integer,Integer> map = new HashMap<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
   
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化界面控件,并为控件添加点击事件的监听器
        ImageView iv_do = findViewById(R.id.iv_do);
        ImageView iv_re = findViewById(R.id.iv_re);
        ImageView iv_mi = findViewById(R.id.iv_mi);
        ImageView iv_fa = findViewById(R.id.iv_fa);
        ImageView iv_so = findViewById(R.id.iv_so);
        ImageView iv_la = findViewById(R.id.iv_la);
        ImageView iv_si = findViewById(R.id.iv_si);
        iv_do.setOnClickListener(this);
        iv_re.setOnClickListener(this);
        iv_mi.setOnClickListener(this);
        iv_fa.setOnClickListener(this);
        iv_so.setOnClickListener(this);
        iv_la.setOnClickListener(this);
        iv_si.setOnClickListener(this);
        initSoundPool();//初
这个小例子主要用到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就不会被正常监听到呢。如果哪位同学知道原因的请帮忙解答下
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值