一、设计需求
随着人们生活节奏不断加快,需求也随之增加。在Android应用设计中,音频播放功能是一个必不可少的部分。而提升用户体验,实现Android音频播放功能,是我们设计中最为重要的需求。
此处我们采用一个音乐播放器应用作为示例。在音频播放器中,应具备以下4个方面的需求设计:
1. 播放进度条
2. 播放/暂停按钮
3. 快进/快退按钮
4. 歌曲列表
二、抽象设计
现在我们考虑如何通过代码实现设计需求。为了实现4个需求,我们需要设计4个控件:SeekBar(进度条控件)、ToggleButton(播放/暂停按钮控件)、Button(快进/快退按钮控件)、ListView(歌曲列表控件)。因此我们需要进行如下的抽象设计:
1. SeekBar:显示当前播放进度,提供拖动、下滑等操作,来控制进度条的进度
2. ToggleButton:显示当前播放状态(播放/暂停),并可以在两种状态间进行切换
3. Button:提供快进/快退功能,在显示区域上增加快进/快退的按钮
4. ListView:显示歌曲列表,方便用户选择播放
三、代码实现
<SeekBar
android:id="@+id/seekbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="100"
android:progress="0"/>
<ToggleButton
android:id="@+id/togglebutton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textOn="Pause"
android:textOff="Play"/>
<Button
android:id="@+id/fastforward"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=">>"/>
<Button
android:id="@+id/rewind"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="<<"/>
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
上述代码实现了4个控件的外观,接下来需要实现它们的功能。首先,我们需要在Activity类中定义相应的变量:
private SeekBar mSeekBar;
private ToggleButton mToggleButton;
private Button mFastForward;
private Button mRewind;
private ListView mListView;
private MediaPlayer mMediaPlayer;
private AudioManager mAudioManager;
private ArrayList<Song> mSongs;
private int mSongIndex = 0;
接下来,我们需要进行小标题中的内容具体实现。
1、SeekBar
SeekBar代表播放进度条。我们需要在Activity中设置MediaPlayer的播放进度,以便定位到相应的播放位置。我们需要设置一系列函数来控制MediaPlayer并更新SeekBar:
mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mSeekBar.setMax(mp.getDuration());
mp.start();
}
});
mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (mMediaPlayer != null && fromUser) {
mMediaPlayer.seekTo(progress);
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
private Runnable mRunnable = new Runnable() {
@Override
public void run() {
if (mMediaPlayer != null) {
int mCurrentPosition = mMediaPlayer.getCurrentPosition();
mSeekBar.setProgress(mCurrentPosition);
}
mHandler.postDelayed(mRunnable, 1000);
}
};
2、ToggleButton
ToggleButton代表播放/暂停按钮。播放和暂停功能使用MediaPlayer实现。
mToggleButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (mMediaPlayer == null) {
return;
}
if (isChecked) {
mMediaPlayer.start();
} else {
mMediaPlayer.pause();
}
}
});
3、Button
Button代表快进/快退按钮。通过调整MediaPlayer的seekTo()方法来实现。
mFastForward.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mMediaPlayer == null) {
return;
}
int currentPosition = mMediaPlayer.getCurrentPosition();
int duration = mMediaPlayer.getDuration();
if (currentPosition + mSeekBar.getMax() / 10 < duration) {
mMediaPlayer.seekTo(currentPosition + mSeekBar.getMax() / 10);
} else {
mMediaPlayer.seekTo(duration);
}
}
});
mRewind.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mMediaPlayer == null) {
return;
}
int currentPosition = mMediaPlayer.getCurrentPosition();
if (currentPosition - mSeekBar.getMax() / 10 >= 0) {
mMediaPlayer.seekTo(currentPosition - mSeekBar.getMax() / 10);
} else {
mMediaPlayer.seekTo(0);
}
}
});
4、ListView
ListView代表歌曲列表。在Activity的onCreate()方法中设置ListView的适配器,并为ListView的ListItem添加事件监听,以便播放相应的音频文件。
mListView.setAdapter(new MusicListAdapter(this, mSongs));
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
mSongIndex = position;
playSong(mSongs.get(mSongIndex));
mToggleButton.setChecked(true);
}
});
四、总结
除了上述4个方面,我们还需要注意一些细节问题,例如处理播放音频过程中的异常、关闭MediaPlayer等问题。总之,在完成上述设计之后,用户体验得到了大幅提升,用户数据反馈也更加积极。通过对Android音频播放功能的设计,我们达成了提升用户体验的目标。