这个小应用做得比较早了,一个音乐播放器。在逻辑方面倒是很简单。现在来介绍一下他的实现功能和简单的设计逻辑。
以下是效果图:
很粗糙是吧?功能上,最基本的本地音乐播放器应该有的功能都有了:加入音乐,删除音乐,退出保存用户设置,调节音量大小(本来准备做个可视化和调节进度的功能,不过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 开源在线音乐播放器...
JavaScript基于微信小程序的音乐播放器源码JavaScript基于微信小程序的音乐播放器源码JavaScript基于微信小程序的音乐播放器源码JavaScript基于微信小程序的音乐播放器源码JavaScript基于微信小程序的音乐播放器源码...
软件工程JavaWeb课程设计音乐播放器网页项目源代码。软件工程JavaWeb课程设计音乐播放器网页项目源代码软件工程JavaWeb课程设计音乐播放器网页项目源代码。软件工程JavaWeb课程设计音乐播放器网页项目源代码软件工程...
小程序源码 音乐播放器后端 (代码源)小程序源码 音乐播放器后端 (代码源)小程序源码 音乐播放器后端 (代码源)小程序源码 音乐播放器后端 (代码源)小程序源码 音乐播放器后端 (代码源)小程序源码 音乐播放器后端 ...
基于jQuery的HTML5移动端音乐播放器源码 基于jQuery的HTML5移动端音乐播放器源码 基于jQuery的HTML5移动端音乐播放器源码 基于jQuery的HTML5移动端音乐播放器源码 基于jQuery的HTML5移动端音乐播放器...
Android音乐播放器实战,实现本地歌曲播放控制,可后台播放,拔出耳机暂停,来电暂停,电话挂断继续播放。这个项目很好的结合了Android的四大组件知识。其中音乐来源于手机本地,使用了Content Provider获取,播放...
今天我将带着大家使用 HTML、CSS 和 JS创建 [音乐播放器]...这个音乐播放器最好的部分是它最小化了音乐播放器。是的,您可以最小化和最大化播放器本身。使这个项目成为一个很棒的音乐播放器。
音乐播放器微信小程序的设计与实现 (3).docx音乐播放器微信小程序的设计与实现 (3).docx音乐播放器微信小程序的设计与实现 (3).docx音乐播放器微信小程序的设计与实现 (3).docx音乐播放器微信小程序的设计与实现 (3)...
基于微信小程序云开发的音乐播放器小程序源码(毕业设计).zip 代码完整下载即用,无需修改确保可以运行,高分毕业设计项目,也可作为期末大作业和课程设计。 使用方法 将代码下载下来后,可用微信开发者工具直接...
android简单音乐播放器的播放,暂停,前一首,后一首的控制。简单音乐播放器的播放,暂停,前一首,后一首的控制。简单音乐播放器的播放,暂停,前一首,后一首的控制。简单音乐播放器的播放,暂停,前一首,后一首...
C语言项目——MP3音乐播放器.zip C语言项目——MP3音乐播放器.zip C语言项目——MP3音乐播放器.zip C语言项目——MP3音乐播放器.zip C语言项目——MP3音乐播放器.zip C语言项目——MP3音乐播放器.zip C语言项目——...
Android简易本地音乐播放器源码,基于Android的简易本地音乐播放器源码
小程序源码 音乐播放器前端 (代码源)小程序源码 音乐播放器前端 (代码源)小程序源码 音乐播放器前端 (代码源)小程序源码 音乐播放器前端 (代码源)小程序源码 音乐播放器前端 (代码源)小程序源码 音乐播放器前端 ...
android音乐播放器源码(改进版)。这个版本已经放在了service中,在服务中控制播放音乐,通过BroadcastReceiver传递一些数据,并且实现了在电话打过来时,停止播放音乐,打完电话继续播放。当然还有上一个版本的甩...
主要内容是C/C++写的一个动态链接库,是音乐播放器的逻辑实现。实现的主要功能有播放/暂停、上一曲、下一曲、添加音乐、改变声音、随机播放、顺序播放、单曲循环、文件地址保存等功能。使用VB亲测可用,附上全部源码...
《移动应用开发》小组项目--网易云音乐播放器移动端项目源码《移动应用开发》小组项目--网易云音乐播放器移动端项目源码《移动应用开发》小组项目--网易云音乐播放器移动端项目源码《移动应用开发》小组项目--网易云...
安卓app开发项目-音乐播放器(源码).zip安卓app开发项目-音乐播放器(源码).zip安卓app开发项目-音乐播放器(源码).zip安卓app开发项目-音乐播放器(源码).zip安卓app开发项目-音乐播放器(源码).zip安卓app开发项目-音乐...
html5手机音乐播放器_mp3音乐播放器代码 html5手机音乐播放器_mp3音乐播放器代码
综合运用UI界面设计、Sqlite数据存储、Activity(活动)、Service(服务)、MusicPlayer(音乐播放类)、ListView(列表)、GridView(网格列表)、Fragment(碎片)、...,设计开发一款具有音乐列表的音乐播放器...