1 功能需求及技术可行性分析
1.1编写目的
现今社会生活紧张,而欣赏音乐史其中最好的舒缓压力的方式之一,音乐播放类的软 件数不胜数,为什么我还要再写一个播放器出来呢?因为现有的音乐播放器功能实在是有些多了,多未必不好,但是我总想要一个干净纯粹的音乐播放器,只为听歌的播放器,一个有着一些自己想要的功能的播放器,比如“切歌”,一个自己熟悉代码的播放器,甚至,一个可以自定义功能结构的音乐播放器。本项目的目 的是开发一个可以播放主流音乐文件格式的播放器,本设计的实现的这主要功能是播放MP3等音乐文件,并且能够控制播放器播放,暂停,停止,上一曲,下一曲。界面简单,操作简单。 本软件具备音乐播放器的播放歌曲、歌曲列表、拖动进度等基本功能,同时本播放器界面简洁美观,操作简单便捷。
1.2项目背景
随着智能手机的普及,用户需要各种各样的应用软件,音乐播放器肯定是必不可少的。随着计算机的广泛运用,手机市场的迅速发展,各种音频资源也在网上广为流传,这些资源卡是平常,但已经渐渐成为人们生活中必不可少的一部分了。于是各种手机播放器也紧跟着发展起来,但是很多播放器一味最求外观花俏,功能庞大,对用户的手机造成很多资源浪费,比如CPU,内存等的占用率过高,在用户需要多任务操作时,受到不小的影响,带来了许多不便,而对于大多数普通用户,许多功能用不上,形同虚设。针对以上各种弊端,选择了开发多语种的音频播放器,将各种性能优化,继承播放器的常用功能,满足一般用户听歌的需求。
2 程序设计
界面灵感来自,迅雷看看播放器,在安卓里面播放音频用到时MediaPlayer类比较复杂点的有音轨的控制,进度和音轨控制用到的是seekBar:
播放器最重要的一部分就是音轨与歌曲进度同步的实现。音轨设置了两个TextView用来显示当前歌曲播放的进度时间和歌曲的长度。音轨对象SeekBar在歌曲刚开始播放的时候调用方法SeekBar.setMax(),参数传入歌曲的长度。SeekBar.setProgress(1)设置游标的起始进度为1。Android的线程的开始是通过Handler类来进行的,Handler类是线程与线程之间通信的桥梁,实现Runnable接口会实现里面的run方法,当线程开始的时候,Runnable中的run方法会向Handler发一个Message消息,这样,Handler类就可以接收到run方法发送过来的不同的消息进行不同的代码处理。这样就达到了各线程之间的通信。要启动一个线程调用Handler的方法postDelayed(Runnable,1000)表示线程睡眠时间是1000ms。
让播放歌曲的线程每隔1000ms,即每1秒对音轨的TextView重新设置时间且让进度条前进1秒的进度。对音轨进行刷新。这样就实现了歌词同步功能SeekBar有一个监听器,该监听器的作用是一直保持着对进度条的监听,当我们用鼠标向SeekBar的各位置进行点击时,它会自动监听其位置,进行相应的位置显示。这也是进度条上的游标会不停的移动和歌词时间会不停的变动的原因。
主页面是本运用的核心界面,本界面拥有一个Fragment。此时Activity上显示的Fragment为正在播放,此页面运用一张炫酷的网络图片。中间一块专辑及歌曲显示的模块是属于一个自定义模块。底部为音轨模块。
图1 主界面
各按钮水平放置,从左到右依次是上一首、播放、下一首功能按钮。用的是布局中的线性布局LinearLayout,;将其设置为水平,如图所示。LinearLayout中依次放置播放/暂停,上一首、下一首按钮属性。
歌曲专辑图片显示,如果有歌曲图片,才会返回,否则为null。
Android的媒体播放原理:Android源程序已经为我们封装好了一个接口类,叫MediaPlayer。该接口在执行行需要一个数据源,通过如下步骤:
第一步:MediaPlayer.reset();复位操作,为以后的媒体准备播放作准备。
第二步:传入歌曲数据源,这里也是一个数据MediaPlayer.setDataSource(String path);参数需要传一个路径,该接口类在收到路径后将其转化为数据源。
第三步:准备播放数据源,调用方法MediaPlayer.Prepare()。
第四步:MediaPlayer.Start();播放数据源,该数据源播放后,不再与程序有关,需要用MediaPlayer.Stop()方法让其停止或MediaPlayer.Start();让其启动。
3 功能设计
该系统具有以下主要功能:
1)播放歌曲,显示歌曲名字
2)播放上一首歌和下一首歌
3)播放模式可以是循环的,也以是单曲循环
4)可以通过手势调节歌曲进度
5)可以选取歌曲进行播放
4 主要代码
BaseActivity中的代码:
package com.wwj.sb.activity;
import com.wwj.sb.adapter.MenuAdapter;
import com.wwj.sb.utils.Settings;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.view.WindowManager;
public class BaseActivity extends Activity {
public static final String BROADCASTRECEVIER_ACTON="com.wwj.musicmonrecevier";
private CommonRecevier commonRecevier;
public float brightnesslevel=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 设置皮肤背景
Settings setting = new Settings(this, false);
String brightness=setting.getValue(Settings.KEY_BRIGHTNESS);
android.view.WindowManager.LayoutParams attributes = getWindow().getAttributes();
brightnesslevel=attributes.screenBrightness;
if(brightness!=null&&brightness.equals("0")){//夜间模式
attributes.screenBrightness=Settings.KEY_DARKNESS;
getWindow().setAttributes(attributes);
}
this.getWindow().setBackgroundDrawableResource(
setting.getCurrentSkinResId());
commonRecevier=new CommonRecevier();
}
/**
* 设置正常模式和夜间模式
* */
public void setBrightness(View v) {
Settings setting = new Settings(this, true);
String brightness=setting.getValue(Settings.KEY_BRIGHTNESS);
MenuAdapter.ViewHolder viewHolder=(MenuAdapter.ViewHolder)v.getTag();
WindowManager.LayoutParams attributes = getWindow().getAttributes();
if(brightness!=null&&brightness.equals("0")){//夜间模式
viewHolder.tv_title.setText(getResources().getString(R.string.darkness_title));
viewHolder.btn_menu.setBackgroundResource(R.drawable.btn_menu_darkness);
attributes.screenBrightness=brightnesslevel;
setting.setValue(Settings.KEY_BRIGHTNESS, "1");
getWindow().setAttributes(attributes);
}else{//正常模式
viewHolder.tv_title.setText(getResources().getString(R.string.brightness_title));
viewHolder.btn_menu.setBackgroundResource(R.drawable.btn_menu_brightness);
attributes.screenBrightness=Settings.KEY_DARKNESS;
setting.setValue(Settings.KEY_BRIGHTNESS, "0");
getWindow().setAttributes(attributes);
}
}
@Override
protected void onStart() {
super.onStart();
registerReceiver(commonRecevier, new IntentFilter(BROADCASTRECEVIER_ACTON));
}
@Override
protected void onStop() {
super.onStop();
unregisterReceiver(commonRecevier);
}
public class CommonRecevier extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
finish();
}
}
}
更多推荐
个人项目——音乐播放器(一)
发布评论