这个小应用做得比较早了,一个音乐播放器。在逻辑方面倒是很简单。现在来介绍一下他的实现功能和简单的设计逻辑。
以下是效果图:
很粗糙是吧?功能上,最基本的本地音乐播放器应该有的功能都有了:加入音乐,删除音乐,退出保存用户设置,调节音量大小(本来准备做个可视化和调节进度的功能,不过JMF API我看的很粗,而且做的快,于是就没有加入- -)。
功能上都有。而且我的代码分离的还不错(不得不说MVC很基础也很重要,基本做得什么项目就很自然的用上了,在以后的观看分析代码、修改程序组成方面很有优势),所以可以很方便地更改音乐引擎(我用的是JMF,属于很早的项目了,现在java的多媒体引擎还不少,有必要的情况下直接往接口上一套就行)、界面的话花店精力也能做出酷狗、QQ音乐那种好看的界面。简单介绍就到这儿,下面分析一下我的思路和结构。
代码结构如下:
主要接口有:
com.yuncong.music_player.construction包下的
1.PlayerAdapter播放引擎接口,上图的JMFPlayerAdapter实现了此接口以实现播放功能。该接口代码如下
/**
* 音乐播放适配器接口
* 通过实现其中的方法来进行音乐播放引擎的方法调用
* @author Jiang
* 强烈建议包含PropertyChangeSupport对象以实现对自身属性的监听和信息的发布
*/
public interface PlayerAdapter{
///以下为属性的描述,借以表示某个属性,当通知监听者和监听者处理监听事例时使用之作为参数
String STATE = ""+1;
String CURRENT_MUSIC = ""+2;
String VOLUMN = ""+3;
String CURRENT_TIME = ""+4;
String TOTEL_TIME = ""+5;
String MESSAGE = ""+6;
void applyTo(Player player);
/**
* 添加属性监听者
* @param listener
*/
void addListener(PropertyChangeListener listener);
/**
* 移除属性监听器
*/
void removeListener(PropertyChangeListener listener);
/**
* 通知监听者
*/
void notifyListeners(String caption, Object oldValue, Object newValue);
/**
* 播放具体音乐
*/
void play(Music e);
/**
* 播放当前音乐
*/
void play();
/**
* 暂停播放
*/
void pause();
/**
* 停止播放
*/
void stop();
/**
* 获取播放状态
*/
boolean isPlaying();
/**
* 获取当前音乐
*/
Music getCurrentMusic();
/**
* 获取当前音量(0-100)
*/
int getVolumn();
/**
* 设置当前音量
*/
void setVolumn(int level);
/**
* 获取当前进度时间(ms)
*/
long getProgressTime();
/**
* 设置进度时间(ms)
*/
void setProgressTime(long time);
/**
* 获取总进度时间
*/
long getTotalProgressTime();
}
-------------------------------------------------------
2.抽象类PlayMode
/**
* 播放模式
* 通过实现此类来对不同的播放模式调用不同的播放顺序
* @author Jiang
*
*/
public abstract class PlayMode {
/**
* 模式名
* @return
*/
public abstract String getName();
/**
* 对当前播放列表应用下一首播放方法,
*/
public abstract void next(PlayerAdapter adapter, List<Music> musics);
/**
* 执行上一首操作
*/
public void previous(PlayerAdapter adapter, List<Music> musics){
//获得当前播放音乐在当前播放列表中的索引
Music m = adapter.getCurrentMusic();
if(m == null)
return;
int mIndex = musics.indexOf(m);
//根据当前播放音乐索引决定上一首歌曲的播放
if(mIndex > 0){
adapter.play(musics.get(mIndex-1));
}else if(mIndex == 0){
adapter.play(musics.get(musics.size()-1));
}else if(mIndex == -1){
System.out.println("异常 :当前播放音乐居然不在当前播放列表中!");
}
}
@Override
public String toString(){
return getName();
}
}
-------------------------------------
3.UIPart UI组件接口
/**
* 一个UI组件接口。所有的需要获取PlayerAdapter内部属性的Ui组件都应该实现之以便对
* PlayerAdapter内部属性动态监控。
* @author Jiang
*
*/
public interface UIPart extends PropertyChangeListener{
}
实现了此接口的UI组件如下:
上述组件都在应用展示中用到了,因为没有什么特殊性,故不展示内部代码。
-------------------------------------
4.类Model,顾名,这是一个数据类;它包含了一个自定义类型Music集合,为外界提供了CRUD方法。远离很简单,代码我也不放了。
------------------------------
5.自定义类型Music,代码简单,使用URL作为音乐文件的标识,一个URL只能对应一个音乐文件,并且单例创建(因为简单到不涉及多线程和序列化,故使用了很简单的单例模式,如果有上述需求可以再稍作修改)。代码如下:
public class Music implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1385044731319859058L;
private File f ;
protected Music(File f){
this.f = f;
}
/**
* 创建某路径关联的Music实例
* @param f
* @return
*/
public static Music create(File f){
return new Music(f);
}
/**
* 获取路径url
* @return
*/
public URL getURL(){
URL url = null;
try {
url = f.toURI().toURL();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return url;
}
/**
* 获取文件名
* @return
*/
public String getName(){
return f.getName();
}
@Override
public String toString(){
return getName();
}
}
-----------------------------------------------
6.MVC中的View。作为UI,要实现更加酷炫的界面就只要修改这里就可以了(毕竟我的界面真的难以直视)比如使用JavaFX啊什么的。下面放出部分代码,具体代码脑补就行,也不难,没有技术含量。
private void init() {
// 基本设置
this.setLayout(new FlowLayout());
this.setPreferredSize(new Dimension(600, 470));
// 加入UIPart组件集
parts = new ArrayList<>(16);
// 加入“前一首”、“后一首”、“暂停|开始”、“添加音乐”按钮
addControlbuttons();
// 加入模式选择框
addModes();
// 加入旋转图片面板
addRotator();
// 加入音量条
addVolumnbar();
// 加入音乐集合显示板
addCollectionPane();
// 加入信息显示标签
addInfoLabel();
// 将UIPart组件集全部适用监听数据变化情况
for (UIPart p : parts) {
player.addAdapterListener(p);
}
}
----------------------------------------------------------
7.配置文件读取/创建类 ConfigForXML
/**
* xml配置文件读存工具类 该配置文件File在工具类生成时就已经决定好了,之后的操作只涉及对文件内容的操作 操作包含
* :添加键值,移除键值,修改键值,保存配置,获得对应键的值,获得键集合,获得(键值)set集合;
*
* @author Jiang
*
*/
public class ConfigForXML {
private Properties properties;
private File file;
/**
* 方便创建默认的xml文件
*
* @param fileName
* 想要创建的文件名 当文件名不存在时依然允许生成配置文件,但有可能出现未知的异常
*/
public static void createAEmptyConfig(String fileName){
OutputStream outs = null;
try {
outs = new FileOutputStream(new File(fileName));
} catch (FileNotFoundException e1) {
e1.printStackTrace();
System.out.println("fail to create&find file.");
return;
}finally{
try {
outs.close();
} catch (IOException e) {
e.printStackTrace();
System.out.println("fail to close stream.");
}
}
//在目标文件中生成必要的xml内容
try {
ConfigForXML xml = new ConfigForXML();
File f = new File(fileName);
xml.file = f;
xml.store();
} catch (IOException e) {
e.printStackTrace();
System.out.println("Fail to write to file.");
}
}
/**
* 默认的构造函数,提供给类方法调用
*/
protected ConfigForXML(){
this.properties = new Properties();
}
/**
* 构造函数,包括了读取文件操作
* @param file
* @throws InvalidPropertiesFormatException
* @throws FileNotFoundException
* @throws IOException
*/
public ConfigForXML(File file) throws InvalidPropertiesFormatException,
FileNotFoundException, IOException {
this.file = file;
properties = new Properties();
properties.loadFromXML(new FileInputStream(file));
}
/**
* 获得对应键的值
* @param key 目标键
* @return 对应的值
*/
public String get(String key){
return properties.getProperty(key);
}
/**
* 添加或者重设键值 当目标键不存在时添加,否则重设值
*
* @param key
* 目标键
* @param value
* 要设置的值
*/
public void set(String key, String value) {
properties.setProperty(key, value);
}
/**
* 移除键值
*
* @param key
* 要移除的键 若不存在则不做操作
*/
public void remove(String key) {
properties.remove(key);
}
/**
* 保存配置操作 ~将同时保存当时的日期
*
* @throws FileNotFoundException
* 文件路径不存在时
* @throws IOException
* 输入Io异常
*/
public void store() throws FileNotFoundException, IOException {
properties.storeToXML(new FileOutputStream(file), Calendar
.getInstance().getTime().toString());
}
/**
* 获得配置的所有键的集合 ~虽然键都是String类型的,但是返回了Object类型的集合
*
* @return 配置的键的集合
*/
public Enumeration<Object> keys() {
return properties.keys();
}
/**
* 获取配置的键值对的集合 同样,键值对的内容都为Object类型,但是键值都为Object
*
* @return 配置键值对集合
*/
public Set<Entry<Object, Object>> keyAndValues() {
return properties.entrySet();
}
}
----------------------------------------------------------
基本逻辑就是上面了,简单易懂,如果你是个想要做小音乐播放器的javaER,希望我的思路能给你带来帮助。【ps:由于JMF的限制,只能播放mp3和wav等少量格式,要播放其他格式则要寻找其他java音乐播放引擎了。】
另外,我的UI中有些是我编写的工具类jar包中(因为经常用到)。如动态容器类ActiveContainer,它实现了动态加入和删除音乐按钮,同时反映到了数据模型Model上。文件常用方法类ycUtil,实现了对文件的各种常用操作。代码也很简单,就不放出来了。结构图如下:
相关推荐
音乐播放器音乐播放器音乐播放器音乐播放器音乐播放器音乐播放器音乐播放器音乐播放器音乐播放器音乐播放器音乐播放器音乐播放器音乐播放器音乐播放器音乐播放器音乐播放器音乐播放器音乐播放器音乐播放器音乐播放器...
还有简单的密码验证 开发软件:Android StudioAndroid 开源在线音乐播放器Android 开源在线音乐播放器Android 开源在线音乐播放器Android 开源在线音乐播放器Android 开源在线音乐播放器Android 开源在线音乐播放器...
小程序源码 音乐播放器后端 (代码源)小程序源码 音乐播放器后端 (代码源)小程序源码 音乐播放器后端 (代码源)小程序源码 音乐播放器后端 (代码源)小程序源码 音乐播放器后端 (代码源)小程序源码 音乐播放器后端 ...
在这个“音乐播放器”项目中,我们看到Verilog被用来创建一个能够播放音乐的硬件系统。让我们深入探讨一下这个项目的核心知识点。 首先,`music.v`很可能是该音乐播放器的主要模块代码,它可能包含了音乐播放器的...
JavaScript基于微信小程序的音乐播放器源码JavaScript基于微信小程序的音乐播放器源码JavaScript基于微信小程序的音乐播放器源码JavaScript基于微信小程序的音乐播放器源码JavaScript基于微信小程序的音乐播放器源码...
软件工程JavaWeb课程设计音乐播放器网页项目源代码。软件工程JavaWeb课程设计音乐播放器网页项目源代码软件工程JavaWeb课程设计音乐播放器网页项目源代码。软件工程JavaWeb课程设计音乐播放器网页项目源代码软件工程...
本项目是基于Android开发的音乐播放器设计源码,主要使用Java进行开发。项目共包含71个文件,其中XML配置文件17个,PNG图片文件16个,编译后的Java字节码文件13个,WebP图片文件10个,Git忽略配置文件3个,Gradle...
微信小程序练手项目-音乐播放器(完整代码)微信小程序练手项目-音乐播放器(完整代码)微信小程序练手项目-音乐播放器(完整代码)微信小程序练手项目-音乐播放器(完整代码)微信小程序练手项目-音乐播放器(完整代码)微信...
在Android平台上,开发一款音乐播放器应用是一项常见的任务,它涉及到多媒体处理、用户界面设计以及与设备硬件的交互等多个方面。本项目是一个基于Android Studio的音乐播放器APP源码,对于学习Android应用开发,...
HTML5音乐播放器多种风格源码,好看的音乐播放器源码,酷炫音乐播放器源码,音乐随心听,三种风格布局,适合页面任何位置,常规播放风格,正常图片加文字,进度条,音量控制大小;纯图标播放,适用背景音乐;带歌词...
安卓app开发项目-音乐播放器(源码).zip安卓app开发项目-音乐播放器(源码).zip安卓app开发项目-音乐播放器(源码).zip安卓app开发项目-音乐播放器(源码).zip安卓app开发项目-音乐播放器(源码).zip安卓app开发项目-音乐...
基于jQuery的HTML5移动端音乐播放器源码 基于jQuery的HTML5移动端音乐播放器源码 基于jQuery的HTML5移动端音乐播放器源码 基于jQuery的HTML5移动端音乐播放器源码 基于jQuery的HTML5移动端音乐播放器...
在Android平台上,开发一款音乐播放器是常见的任务之一,它涉及到多媒体处理、用户界面设计以及服务组件等多个核心知识点。这份“安卓音乐播放器相关-原生Android4.4音乐播放器源码原封未动原滋原味的代码学习最基本...
音乐播放器的VHDL实现是一项复杂而有趣的电子设计自动化(EDA)项目,它涉及到数字逻辑设计、硬件描述语言(HDL)、FPGA(Field-Programmable Gate Array)编程等多个领域。在这个项目中,我们将重点讨论VHDL语言、...
在Android 4.0(冰淇淋三明治)版本中,音乐播放器是一个重要的系统组件,为用户提供了丰富的音频体验。这个版本的音乐播放器引入了一系列改进和新特性,旨在提升用户体验,使其更加现代化和功能全面。 首先,...
Android音乐播放器实战,实现本地歌曲播放控制,可后台播放,拔出耳机暂停,来电暂停,电话挂断继续播放。这个项目很好的结合了Android的四大组件知识。其中音乐来源于手机本地,使用了Content Provider获取,播放...
基于 LabVIEW 的音乐播放器设计 LabVIEW 是一款图形化编程语言,广泛应用于科学研究、工程设计、自动化控制等领域。基于 LabVIEW 的音乐播放器设计可以实现播放 MP3 文件、显示播放进度、控制音量大小、显示曲目...
基于Python开发的音乐播放器源码.zip基于Python开发的音乐播放器源码.zip基于Python开发的音乐播放器源码.zip基于Python开发的音乐播放器源码.zip基于Python开发的音乐播放器源码.zip基于Python开发的音乐播放器源码...
【C语言音乐播放器源码】是一个用于学习和实践C语言编程技能的项目,它涵盖了后端音频处理和播放的基本概念。在这个项目中,开发者可以深入理解如何利用C语言来控制计算机的音频系统,实现音乐播放功能。下面将详细...
这个技术使得开发者可以创建出功能丰富的、跨平台的音乐播放器,支持多种音频格式,特别是MP3格式,这在移动设备上非常常见。在本文中,我们将深入探讨HTML5音乐播放器的核心知识点,以及如何利用它来构建一个MP3...