一个即时音效的实例

一.SoundPool类

1.SoundPool类用于管理和播放应用程序的声音资源,该类将声音文件加载到内存中,一般将时间小于7秒左右的声音文件用于该技术播放。

2.通过构造方法public SoundPool (int maxStreams,int streamType,int srcQuality)得到SoundPool类的对象。下面介绍其构造方法中的各参数的作用。

   1>maxStreams:该参数用于设置同时能够播放多少音效。例如设置为4,则最多同时可播放4首音效。

   2>streamType:该参数设置音频类型,在游戏中通常设置为:STREAM_MUSIC。

   3>srcQuality:该参数设置音频文件的质量,目前还没有效果,设置为0(默认值)。


二.使用SoundPool类的常用方法,编写一个即时音效的例子。

(1)项目名为Sample

(2)在res目录下新建一个名为raw的文件夹,存放项目中用到的声音文件。


1.编写layout/main.xml文件,设置控件的布局

<span style="font-size:18px;"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <!-- 添加4个Button控件  -->
    <Button
        android:id="@+id/button1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="播放音效1" />

    <Button
        android:id="@+id/button2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="播放音效2" />

    <Button
        android:id="@+id/button1Pause"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="暂停音效1" />

    <Button
        android:id="@+id/button2Pause"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="暂停音效2" />

</LinearLayout>
</span>

2.在src目录下的com.example.sample包中,编写MainActivity.java类
<span style="font-size:18px;">package com.example.sample;

import java.util.HashMap;

import android.app.Activity;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {

	SoundPool sp;
	HashMap<Integer, Integer> spMap;
	Button b1;
	Button b1Pause;
	Button b2;
	Button b2Pause;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		initSoundPool(); // 初始化声音池
		b1 = (Button) findViewById(R.id.button1); // 声音播放控制按钮实例化
		b2 = (Button) findViewById(R.id.button2);
		b1Pause = (Button) findViewById(R.id.button1Pause);
		b2Pause = (Button) findViewById(R.id.button2Pause);

		b1.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				playSound(1, 1); // 播放第一首音效,循环一遍
				Toast.makeText(MainActivity.this, "播放音效1", Toast.LENGTH_SHORT)
						.show();
			}
		});

		b1Pause.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				sp.pause(spMap.get(1));
				Toast.makeText(MainActivity.this, "暂停音效1", Toast.LENGTH_SHORT);
			}
		});

		b2.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				playSound(2, 1); // 播放第二首音效,循环一遍
				Toast.makeText(MainActivity.this, "播放音效2", Toast.LENGTH_SHORT)
						.show();
			}
		});

		b2Pause.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				sp.pause(spMap.get(2));
				Toast.makeText(MainActivity.this, "暂停音效2", Toast.LENGTH_SHORT);
			}
		});

	}

	private void initSoundPool() { // 初始化声音池
		// 第一个参数设置同时能够播放多少音效,第二个参数设置音频类型,第三个参数设置音频文件的质量,目前还没效果,设置为0(默认值)
		sp = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
		spMap = new HashMap<Integer, Integer>();
		spMap.put(1, sp.load(this, R.raw.music1, 1));
		spMap.put(2, sp.load(this, R.raw.music2, 1));
	}

	public void playSound(int sound, int number) {
		AudioManager am = (AudioManager) this
				.getSystemService(this.AUDIO_SERVICE);
		float audioMaxVolumn = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
		float audioCurrentVolumn = am
				.getStreamVolume(AudioManager.STREAM_MUSIC);
		float volumnRatio = audioCurrentVolumn / audioMaxVolumn;
		sp.play(spMap.get(sound), volumnRatio, volumnRatio, 1, number, 1);
	}
}
</span>

说明:

1.在res/raw文件下,添加music1、music2两个声音文件。

2.第23行,是为Activity的onCreate()方法。当创建MainActivity时调用该方法。

3.第33~69行,为播放音效1,播放音效2,暂停播放音效1,暂停播放音效2的初始化及监听方法。

4.第73~79行,初始化声音池,SoundPool调用load方法可加载音频文件,然后将加载了音频文件的SoundPool添加到一个HashMap中,提供给以后使用。

5.第81~89行,为播放音效,调用SoundPool中的play方法,播放声音,参数sound是播放音效的ID,参数number是播放音效的次数。


显示效果:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

走路诗人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值