freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

基于android系統(tǒng)的midi音樂(lè)播放器的設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)論文-資料下載頁(yè)

2025-06-28 00:42本頁(yè)面
  

【正文】 如下所示。1) 播放功能實(shí)現(xiàn)主要代碼:/* 重置MediaPlayer */ ()。 /* 設(shè)置要播放的文件的路徑 */ (music_path)。 /* 準(zhǔn)備播放 */ ()。 /* 開(kāi)始播放 */ ()。2) 暫停功能實(shí)現(xiàn)主要代碼:()。music_positon = ()。(music_positon)。3) 拖動(dòng)條控制實(shí)現(xiàn)主要代碼:Bundle seekBar_data = (seekBar_data)。int seekBar_progress = (seekBar_progress)。(() * seekBar_progress/ 100)。musicContinue()。()。()。 UI同步顯示實(shí)現(xiàn) UI同步刷新顯示是MIDI音樂(lè)播放器關(guān)鍵實(shí)現(xiàn)技術(shù)之一,另外一個(gè)就是歌詞同步顯示。 Android系統(tǒng)提供的一個(gè)Handler類,Handler類的主要作用就是接受子線程發(fā)送的數(shù)據(jù),并用此數(shù)據(jù)配合主線程更新UI。應(yīng)用程序啟動(dòng)時(shí),Android首先會(huì)開(kāi)啟一個(gè)主線程 (也就是UI線程),主線程為管理界面中的UI控件,進(jìn)行事件分發(fā)。如果此時(shí)需要一個(gè)耗時(shí)的操作,例如:聯(lián)網(wǎng)讀取數(shù)據(jù),你不能把這些操作放在主線程中,如果放在主線程中的話,界面會(huì)出現(xiàn)假死現(xiàn)象,如果5秒鐘還沒(méi)有完成的話,會(huì)收到Android系統(tǒng)的一個(gè)錯(cuò)誤提示“強(qiáng)制關(guān)閉”。這個(gè)時(shí)候我們需要把這些耗時(shí)的操作,放在子線程中,因?yàn)樽泳€程涉及到UI更新,Android主線程是線程不安全的,也就是說(shuō),更新UI只能在主線程中更新,子線程中操作是危險(xiǎn)的。這個(gè)時(shí)候,Handler就出現(xiàn)了來(lái)解決這個(gè)復(fù)雜的問(wèn)題,由于Handler運(yùn)行在主線程中(UI線程中),它與子線程可以通過(guò)Message對(duì)象來(lái)傳遞數(shù)據(jù),這個(gè)時(shí)候,Handler就承擔(dān)著接受子線程傳過(guò)來(lái)的(子線程用sentMessage()方法傳遞)Message對(duì)象(里面包含數(shù)據(jù)),把這些消息放入主線程隊(duì)列中,配合主線程進(jìn)行更新UI。通過(guò)前面對(duì)MediaPlayer類的介紹,在這個(gè)類中提供了getCurrentPosition(),調(diào)用這個(gè)方法可以得到當(dāng)前音樂(lè)播放時(shí)間currentPosition,利用Handler開(kāi)辟一個(gè)線程,每隔1000ms讀取一次currentPosition,同時(shí)根據(jù)currentPosition來(lái)刷新播放控制界面顯示的同步時(shí)間和同步進(jìn)度條,主要實(shí)現(xiàn)代碼如下所示。Runnable updata = new Runnable() { @Override public void run() { // TODO Autogenerated method stub int currentPosition = ()。 int mMax = ()。 (currentPosition * 100 / mMax)。 //更新進(jìn)度條 (curTime, currentPosition)。 (start, 1000)。 } }。public void timeUpdate(TextView curTime,int currentPosition1) { // TODO Autogenerated method stub int currentPosition=currentPosition1/1000。 if((currentPosition)10){ (00:0+(currentPosition))。 } else if((currentPosition)=10amp。amp。(currentPosition)60){ int t_second=currentPosition/10。 int second=currentPosition%10。 (00:+(t_second)+(second))。 } else if(currentPosition=60amp。amp。currentPosition600){ int a_second=currentPosition%60。 (0+(currentPosition/60)+:+(a_second/10)+(a_second%10))。 } } 播放模式模塊的主要技術(shù)實(shí)現(xiàn)為隨機(jī)播放和循環(huán)播放,單曲循環(huán)需調(diào)用MediaPlayer類中的setLooping()方法,就可以實(shí)現(xiàn)單曲循環(huán)。 隨機(jī)播放的實(shí)現(xiàn)方法其實(shí)就是獲取當(dāng)前播放列表的大小,通過(guò)musicDatasList列表的大小來(lái)獲取隨機(jī)數(shù),播放產(chǎn)生的隨機(jī)數(shù)相對(duì)應(yīng)列表中的歌曲就得以實(shí)現(xiàn)了;循環(huán)播放其實(shí)就是當(dāng)播放完列表最后一個(gè)的歌曲,直接播放列表第一個(gè)歌曲,主要實(shí)現(xiàn)代碼如下所示。switch (()) { case : // 順序播放 if (currentListItme == () 1) { currentListItme = () 1。 } else { ++currentListItme。} updateUI(musicDatasList, currentListItme)。 play(musicDatasList, currentListItme)。 (currentListItme)。 //設(shè)定當(dāng)前播放哪個(gè)音樂(lè) (next music(Order model): + currentListItme)。 break。 case : // 隨機(jī)播放 currentListItme = (int) (() * ())。 updateUI(musicDatasList, currentListItme)。 play(musicDatasList, currentListItme)。 (currentListItme)。 //設(shè)定當(dāng)前播放哪個(gè)音樂(lè) (next music(Random model):+ currentListItme)。 break。 case : // 循環(huán)播放 if (currentListItme == () 1) { currentListItme = 0。} else { ++currentListItme。} updateUI(musicDatasList, currentListItme)。 play(musicDatasList, currentListItme)。 (currentListItme)。 //設(shè)定當(dāng)前播放哪個(gè)音樂(lè) (next music(Order model): + currentListItme)。 break。} 歌詞同步顯示實(shí)現(xiàn) 歌詞同步實(shí)現(xiàn)是整個(gè)系統(tǒng)的最關(guān)鍵技術(shù)的實(shí)現(xiàn)?,F(xiàn)在網(wǎng)絡(luò)上的歌詞都是LRC格式,以Beyond的喜歡你的歌詞為例,只需提取出時(shí)間點(diǎn)和對(duì)應(yīng)的歌詞,根據(jù)播放的時(shí)間來(lái)判斷顯示哪一句話歌詞,開(kāi)啟線程,同步刷新。 同步顯示的第一步,就是掃描SD內(nèi)的歌詞文件,將歌詞文件的名字和絕對(duì)路徑存放在ArrayListHashMapString, String lRCList(哈希列表)中存儲(chǔ),具體實(shí)現(xiàn)代碼如下所示:// 獲取歌詞列表函數(shù) private void lRClist() { // TODO Autogenerated method stub File home = new File(MUSIC_PATH)。 if ((new LrcFilter()).length 0) { for (File file : (new LrcFilter())) { HashMapString, String hashMap = new HashMapString, String()。 (lRC_name, ())。 (lRC_path, ())。 (hashMap)。 } } } 獲取歌詞文件實(shí)現(xiàn)了,接下來(lái)就是進(jìn)行歌詞文件解析的實(shí)現(xiàn)。MIDI音樂(lè)播放器對(duì)歌詞解析通過(guò)LrcParse類實(shí)現(xiàn)。 首先進(jìn)行歌詞文件內(nèi)容的讀取,Java中BufferedReader類用于讀取文件,實(shí)現(xiàn)代碼如下所示。public static void init(File file) { BufferedReader br = null。 try { br = new BufferedReader(new InputStreamReader(new FileInputStream(file), GBK))。 StringBuilder sb = new StringBuilder()。 String temp = null。 while ((temp = ()) != null) { (temp).append(\n)。 } init(())。 //調(diào)用下面的,處理讀取的歌詞,把歌詞一句一句分開(kāi)并計(jì)算好時(shí)間 } catch (Exception ex) { ()。 } finally { try { ()。 } catch (Exception ex) { ()。 } } }讀出每一句內(nèi)容之后,時(shí)間標(biāo)記的格式為[mm:]其中mm為分鐘數(shù),ss為秒數(shù),xx為百分之一秒。在這個(gè)類中定義了一個(gè)正則表達(dá)式:(?=\\[).*?(?=\\]),有了這個(gè)表達(dá)式,就可以進(jìn)行字符串匹配了,將時(shí)間提取出來(lái),進(jìn)行時(shí)間轉(zhuǎn)換算法parseTime(String time)函數(shù),之后提取時(shí)間后面的歌詞內(nèi)容substring(([ + s + ]).length()*count),存儲(chǔ)于ArrayListSentence()中。其中Sentence類,存放歌詞文件中的時(shí)間和內(nèi)容。主要實(shí)現(xiàn)代碼如下所示。private static void parseLine(String line) { if (()) { //如果這一行為空直接返回 return。 } if(([ar:)) { //字符串包含[ar:,表示歌手 String singerName = (4, ()1)。 = singerName。 return 。 } String s=。 String content = 。 Matcher matcher = (line)。 //匹配,pattern:上面定義的匹配碼 Matcher matcher2=(line)。 count=0。 //記錄存在時(shí)間點(diǎn)的個(gè)數(shù) while(()){ count++。 } while (()) { //find()相當(dāng)于游標(biāo)的next()\ //匹配到了時(shí)間,存于s s = ()。 //保存取得歌詞內(nèi)容 content = (([ + s + ]).length()*count,())。// (([ + s + ]).length()*count)。 //調(diào)用下面的函數(shù),將時(shí)間字符串轉(zhuǎn)換為毫秒數(shù),存于t中 long t = parseTime(s)。 if (t != 1) {// (匹配這一行且時(shí)間處理后后打印時(shí)間和歌詞 : + t + + content+~~~+count)。 //一行的內(nèi)容時(shí)間作為一個(gè)元素存于list數(shù)組 (new Sentence(content, t))。 } } } private static long parseTime(String time) { String[] ss = (\\:|\\.)。 //遇到: // 如果 是兩位以下,就非法了 if ( 2) { return 1。 } else if ( == 2) { // 如果正好兩位,就算分秒 try { int min = (ss[0])。 int sec = (ss[1])。 if (min 0 || sec 0 || sec = 60) { throw new RuntimeException(數(shù)字不合法!)。 } // (time + (min * 60 + sec) * 1000L)。 return (min * 60 + sec) * 1000L。 } catch (Exception exe) { return 1。 } } else if ( == 3) {// 如果正好三位,就算分秒,十毫秒 try { int min = (ss[0])。 int sec = (ss[1])。 int mm = (ss[2])。 if (min 0 || sec 0 || sec = 60 || mm 0 || mm 99) { throw new RuntimeException(數(shù)字不合法!)。 } // (time + (min * 60 + sec) * 1000L + mm * // 10)。 return (min * 60 + sec) * 1000L + mm * 10。
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評(píng)公示相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1