使用javaFX做一个简单的音乐播放器
主要功能
1:加载歌曲列表
2:加载歌曲对应歌词
3:歌曲播放进度显示
4:歌词滚动
5:播放 暂停 上一首 下一首
界面如下
组件说明:
1:页面布局 容器 主要是 Group HBox AnchorPane StackPane
2:左侧歌曲列表 使用的ListView 歌曲是下载后放到固定路径
3:右侧歌词使用 Text显示 简单设置了一下样式 歌词文件与歌曲一一对应,放到本地固定路径
4:歌曲进度使用 ProgressBar
5:按钮是Button 设置了一个小的背景图片
使用描述:
点击一首歌曲,开始播放,加载条显示播放进度,歌词向上滚动,使用上一首,下一首顺序切歌,或点击歌曲列表随机切歌。
功能实现说明:
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 不要写"" 永远不会等于""会 进入死循环的 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:播放进度条实现
KeyValue kv = new KeyValue(pbar.progressProperty(), 1); KeyFrame kf1 = new KeyFrame(mediaPlayer.getTotalDuration(), kv); pbTimeLine = new Timeline(); pbTimeLine.getKeyFrames().add(kf1);
4:歌词滚动实现
// 歌词动作 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(); }
找到那个感觉 就算打开了那个脑洞
本文来自博客园,作者:写程序到老,转载请注明原文链接:https://www.cnblogs.com/angin-iit/p/16195028.html