使用javaFX做一個(gè)簡(jiǎn)單的音樂(lè)播放器
主要功能
1:加載歌曲列表
2:加載歌曲對(duì)應(yīng)歌詞
3:歌曲播放進(jìn)度顯示
4:歌詞滾動(dòng)
5:播放 暫停 上一首 下一首
界面如下

組件說(shuō)明:
1:頁(yè)面布局 容器 主要是 Group HBox AnchorPane StackPane
2:左側(cè)歌曲列表 使用的ListView 歌曲是下載后放到固定路徑
3:右側(cè)歌詞使用 Text顯示 簡(jiǎn)單設(shè)置了一下樣式 歌詞文件與歌曲一一對(duì)應(yīng),放到本地固定路徑
4:歌曲進(jìn)度使用 ProgressBar
5:按鈕是Button 設(shè)置了一個(gè)小的背景圖片
使用描述:
點(diǎn)擊一首歌曲,開(kāi)始播放,加載條顯示播放進(jìn)度,歌詞向上滾動(dòng),使用上一首,下一首順序切歌,或點(diǎn)擊歌曲列表隨機(jī)切歌。
功能實(shí)現(xiàn)說(shuō)明:
1:加載歌曲列表
//文件前綴 String filePre = "file:///"; Path path = Paths.get(songsPath); try (DirectoryStream<Path> entried = Files.newDirectoryStream(path)) { for (Path entry : entried) { fileList.add(filePre + songsPath + entry.getFileName()); } } ListView<String> listView = new ListView<String>(data); for (int i = 0; i < fileList.size(); i++) { int a = fileList.get(i).lastIndexOf('/'); int b = fileList.get(i).lastIndexOf('.'); data.addAll(fileList.get(i).substring(a + 1, b)); } listView.setItems(data);
2:加載歌詞
FileInputStream fileInputStream = null; InputStreamReader reader = null; BufferedReader reader1 = null; try { String mediaString = media.getSource(); String songName = mediaString.substring(mediaString.lastIndexOf("/") + 1, mediaString.lastIndexOf(".")); File lyricFile = new File(songsLyPath + songName + ".txt"); fileInputStream = new FileInputStream(lyricFile); reader = new InputStreamReader(fileInputStream); reader1 = new BufferedReader(reader); StringBuffer strB = new StringBuffer(songName + "\n------------------\n"); // 最后一行 返回null 不要寫"" 永遠(yuǎn)不會(huì)等于""會(huì) 進(jìn)入死循環(huán)的 String str = ""; while ((str = reader1.readLine()) != null) { strB.append(str + "\n"); } ly.setText(strB.toString()); } catch (FileNotFoundException e) { } finally { reader1.close(); reader.close(); fileInputStream.close(); }
3:播放進(jìn)度條實(shí)現(xiàn)
KeyValue kv = new KeyValue(pbar.progressProperty(), 1); KeyFrame kf1 = new KeyFrame(mediaPlayer.getTotalDuration(), kv); pbTimeLine = new Timeline(); pbTimeLine.getKeyFrames().add(kf1);
4:歌詞滾動(dòng)實(shí)現(xiàn)
// 歌詞動(dòng)作 Pane pane = new Pane(); tt = new TranslateTransition(); tt.setNode(pane); tt.setFromX(0); tt.setToX(800); pane.translateXProperty().addListener(new ChangeListener<Number>() { @Override public void changed(ObservableValue<? extends Number> observableValue, Number number, Number t1) { ly.setTranslateY(-t1.intValue()); } });
5:切歌
/** * 切歌 * * @param flag */ private void changeSong(String flag) { mediaPlayer.stop(); ((Group) scene.getRoot()).getChildren().remove(mediaView); int cunrIndex = next; if ("next".equals(flag)) { //下一首 if (next + 1 < fileList.size()) { cunrIndex = ++next; } } else { //上一首 if (next > 0) { cunrIndex = --next; } } media = new Media(fileList.get(cunrIndex)); mediaPlayer = new MediaPlayer(media); mediaPlayer.setAutoPlay(true); mediaView = new MediaView(mediaPlayer); ((Group) scene.getRoot()).getChildren().addAll(mediaView); setPauseImg(); newSongProSettin(); }
找到那個(gè)感覺(jué) 就算打開(kāi)了那個(gè)腦洞
本文來(lái)自博客園,作者:寫程序到老,轉(zhuǎn)載請(qǐng)注明原文鏈接:http://www.rzrgm.cn/angin-iit/p/16195028.html
浙公網(wǎng)安備 33010602011771號(hào)