安卓基础培训结束了,自己随便做了一个简单的音乐播放器,第一个安卓小项目,先晒晒图片~~~~
界面灵感来自,迅雷看看播放器,在安卓里面播放音频用到时MediaPlayer类
比较复杂点的有音轨的控制,进度和音轨控制用到的是seekBar,自定义样式seekbar_img.xml代码如下:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+android:id/background"
android:drawable="@drawable/bbar_bg"/>
<item
android:id="@+android:id/progress"
android:drawable="@drawable/bbar"/>
</layer-list>
<item
android:id="@+android:id/background"
android:drawable="@drawable/bbar_bg"/>
<item
android:id="@+android:id/progress"
android:drawable="@drawable/bbar"/>
</layer-list>
还有音轨的控制:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+android:id/background"
android:drawable="@drawable/bar_bg"/>
<item
android:id="@+android:id/progress"
android:drawable="@drawable/bar"/>
</layer-list>
<item
android:id="@+android:id/background"
android:drawable="@drawable/bar_bg"/>
<item
android:id="@+android:id/progress"
android:drawable="@drawable/bar"/>
</layer-list>
在实现歌词显示时有点复杂,不过仔细分析歌词文件,就能找到解决办法,歌词文件每句前面都有对应的时间,只要算出当前播放的时间,
然后判断是否匹配,如果匹配就用I/O操作将歌词文件中的对应的歌词读取出来

/**
* 读取歌词文件
*/
public static String read(File path, String filename)
{
StringBuilder sb = new StringBuilder();
Set<String> lrcs = FileUtil.getLrcs(path);
//获取歌词文件名
String lrcfile=filename.substring(0,filename.indexOf("."));
try
{
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(path+"/"+lrcfile+".lrc"),"GBK"));
String con = "";
while ((con = br.readLine()) != null)
{
sb.append(con + "\n");
}
br.close();
} catch (Exception e)
{
e.printStackTrace();
}
return sb.toString();
}
* 读取歌词文件
*/
public static String read(File path, String filename)
{
StringBuilder sb = new StringBuilder();
Set<String> lrcs = FileUtil.getLrcs(path);
//获取歌词文件名
String lrcfile=filename.substring(0,filename.indexOf("."));
try
{
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(path+"/"+lrcfile+".lrc"),"GBK"));
String con = "";
while ((con = br.readLine()) != null)
{
sb.append(con + "\n");
}
br.close();
} catch (Exception e)
{
e.printStackTrace();
}
return sb.toString();
}
接下来就是换算时间了,将当前播放时间换算成时分秒,

public static String formatMS(int ms)
{
int s = ms / 1000;// 秒
int m = s / 60;// 分
int add = s % 60;// 秒
String con = "";
if (add > 10 && m > 10)
con = m + ":" + add;
else if (add < 10 && m > 10)
con = m + ":0" + add;
else if (m < 10&& add < 10)
con = "0" + m + ":0" + add;
else if (m > 10 && add < 10)
con = "" + m + ":0" + add;
else if (m < 10 && add > 10)
con = "0" + m + ":" + add ;
return con;
}
{
int s = ms / 1000;// 秒
int m = s / 60;// 分
int add = s % 60;// 秒
String con = "";
if (add > 10 && m > 10)
con = m + ":" + add;
else if (add < 10 && m > 10)
con = m + ":0" + add;
else if (m < 10&& add < 10)
con = "0" + m + ":0" + add;
else if (m > 10 && add < 10)
con = "" + m + ":0" + add;
else if (m < 10 && add > 10)
con = "0" + m + ":" + add ;
return con;
}
播放时用到一个子线程,用来跟踪播放进度,显示歌词进度,
// 子线程监听进度的改变
private Runnable thread = new Runnable()
{
@Override
public void run()
{
//更新视图
updateTextView();
//自动播放下一首
playNext(true);
//显示歌词
showLrc();
handler.postDelayed(thread, 1000);
}
};
private Runnable thread = new Runnable()
{
@Override
public void run()
{
//更新视图
updateTextView();
//自动播放下一首
playNext(true);
//显示歌词
showLrc();
handler.postDelayed(thread, 1000);
}
};
简单介绍到这里,代码下载点击: