安卓基礎培訓結束了,自己隨便做了一個簡單的音樂播放器,第一個安卓小項目,先曬曬圖片~~~~
界面靈感來自,迅雷看看播放器,在安卓里面播放音頻用到時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);
}
};
簡單介紹到這里,代碼下載點擊: