源码下载:http://download.csdn.net/detail/heng615975867/6546069
播放声音效果的类:
/******************************************************************************* * Copyright 2011, 2012 Chris Banes. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *******************************************************************************/ package com.handmark.pulltorefresh.library.extras; import java.util.HashMap; import android.content.Context; import android.media.MediaPlayer; import android.view.View; import com.handmark.pulltorefresh.library.PullToRefreshBase; import com.handmark.pulltorefresh.library.PullToRefreshBase.Mode; import com.handmark.pulltorefresh.library.PullToRefreshBase.State; public class SoundPullEventListener<V extends View> implements PullToRefreshBase.OnPullEventListener<V> { private final Context mContext; private final HashMap<State, Integer> mSoundMap; private MediaPlayer mCurrentMediaPlayer; /** * Constructor * * @param context - Context */ public SoundPullEventListener(Context context) { mContext = context; mSoundMap = new HashMap<State, Integer>(); } @Override public final void onPullEvent(PullToRefreshBase<V> refreshView, State event, Mode direction) { Integer soundResIdObj = mSoundMap.get(event); if (null != soundResIdObj) { playSound(soundResIdObj.intValue()); } } /** * Set the Sounds to be played when a Pull Event happens. You specify which * sound plays for which events by calling this method multiple times for * each event. * <p/> * If you've already set a sound for a certain event, and add another sound * for that event, only the new sound will be played. * * @param event - The event for which the sound will be played. * @param resId - Resource Id of the sound file to be played (e.g. * <var>R.raw.pull_sound</var>) */ public void addSoundEvent(State event, int resId) { mSoundMap.put(event, resId); } /** * Clears all of the previously set sounds and events. */ public void clearSounds() { mSoundMap.clear(); } /** * Gets the current (or last) MediaPlayer instance. */ public MediaPlayer getCurrentMediaPlayer() { return mCurrentMediaPlayer; }
//主要是MediaPlayer类播放res/raw的音频资源
private void playSound(int resId) {// Stop current player, if there's one playingif (null != mCurrentMediaPlayer) {mCurrentMediaPlayer.stop();mCurrentMediaPlayer.release();}mCurrentMediaPlayer = MediaPlayer.create(mContext, resId);if (null != mCurrentMediaPlayer) {mCurrentMediaPlayer.start();}}}
使用方式:private State mState = State.RESET; sound.setState(mState);
MediaPlayer类播放res/raw的音频资源的另一个更好的方法:
private void initBeepSound() { if (playBeep && mediaPlayer == null) { // The volume on STREAM_SYSTEM is not adjustable, and users found it // too loud, // so we now play on the music stream. setVolumeControlStream(AudioManager.STREAM_MUSIC); mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); AssetFileDescriptor file = getResources().openRawResourceFd( R.raw.beep); AssetFileDescriptor file1 = getResources().openRawResourceFd( R.raw.voicemail); try { mediaPlayer.setDataSource(file.getFileDescriptor(), file.getStartOffset(), file.getLength()); file.close(); mediaPlayer.setVolume(BEEP_VOLUME, BEEP_VOLUME); mediaPlayer.prepare(); } catch (IOException e) { mediaPlayer = null; } } }