读书人

android 高仿多米音乐播放器 (有图有

发布时间: 2012-06-20 20:37:21 作者: rapoo

android 高仿多米音乐播放器 (有图有码有真相)

半年前写了个音乐播放器,仿的是多米的UI界面

之前发表在eoe社区,今天也发到csdn上来

不罗嗦,先上效果图:

android 高仿多米音乐播放器 (有图有码有实情)

android 高仿多米音乐播放器 (有图有码有实情)

android 高仿多米音乐播放器 (有图有码有实情)

android 高仿多米音乐播放器 (有图有码有实情)

下面简单介绍下代码:

android 高仿多米音乐播放器 (有图有码有实情)

MusicPlayer 播放音乐的核心类,该类有以下成员变量

private final static String TAG = "MusicPlayer";

private final String BROCAST_NAME = "com.genius.musicplay.brocast";

private MediaPlayer mMediaPlayer; // 播放器对象

private List<MusicData> mMusicFileList; // 音乐文件列表

private int mCurPlayIndex; // 当前播放索引

private int mPlayState; // 播放器状态

private int mPLayMode; // 歌曲播放模式

private Random mRandom;

private Context mContext;

其实该类就是将MediaPlayer做了一层封装,提供出一些播放音乐的相关操作如播放,暂停,上一曲,下一曲等等

MusicService 是播放音乐的服务继承自service,MediaPlayer作为它的成员变量

所以对MediaPlayer的操作就委托给了MusicService

ServiceManager,管理服务的对象,采用AIDL接口方式实现远程操作,对AIDL熟悉的童鞋你懂得

private final static String TAG = "ServiceManager";

private final static String SERVICE_NAME = "com.genius.service.musicservices";

private Boolean mConnectComplete;

private ServiceConnection mServiceConnection;

private MusicConnect mMusicConnect;

private IOnServiceConnectComplete mIOnServiceConnectComplete;

private Context mContext;

MusicConnect就是AIDL接口对象


MusicData音乐歌曲的信息,由于要在AIDL接口传递,所以需要实现Parcelable接口

public class MusicData implements Parcelable{

public final static String KEY_MUSIC_DATA = "MusicData";

private final static String KEY_MUSIC_NAME = "MusicName";

private final static String KEY_MUSIC_TIME = "MusicTime";

private final static String KEY_MUSIC_PATH = "MusicPath";

private final static String KEY_MUSIC_ARITST = "MusicAritst";

public String mMusicName;

public int mMusicTime;

public String mMusicPath;

public String mMusicAritst;

public MusicData()

{

mMusicName = "";

mMusicTime = 0;

mMusicPath = "";

mMusicAritst = "";

}

@Override

public int describeContents() {

// TODO Auto-generated method stub

return 0;

}

@Override

public void writeToParcel(Parcel dest, int flags) {

// TODO Auto-generated method stub

Bundle mBundle=new Bundle();

mBundle.putString(KEY_MUSIC_NAME, mMusicName);

mBundle.putInt(KEY_MUSIC_TIME, mMusicTime);

mBundle.putString(KEY_MUSIC_PATH, mMusicPath);

mBundle.putString(KEY_MUSIC_ARITST, mMusicAritst);

dest.writeBundle(mBundle);

}

public static final Parcelable.Creator<MusicData> CREATOR = new Parcelable.Creator<MusicData>()

{

@Override

public MusicData createFromParcel(Parcel source) {

// TODO Auto-generated method stub

MusicData Data = new MusicData();

Bundle mBundle=new Bundle();

mBundle = source.readBundle();

Data.mMusicName = mBundle.getString(KEY_MUSIC_NAME);

Data.mMusicTime = mBundle.getInt(KEY_MUSIC_TIME);

Data.mMusicPath = mBundle.getString(KEY_MUSIC_PATH);

Data.mMusicAritst = mBundle.getString(KEY_MUSIC_ARITST);

return Data;

}

@Override

public MusicData[] newArray(int size) {

// TODO Auto-generated method stub

return new MusicData[size];

}

};

}


音乐播放模式类

public class MusicPlayMode {

public static final int MPM_SINGLE_LOOP_PLAY = 0; // 单曲循环

public static final int MPM_ORDER_PLAY = 1; // 顺序播放

public static final int MPM_LIST_LOOP_PLAY = 2; // 列表循环

public static final int MPM_RANDOM_PLAY = 3; // 随即播放

}


音乐播放状态类

public class MusicPlayState {

public static final int MPS_NOFILE = -1; // 无音乐文件

public static final int MPS_INVALID = 0; // 当前音乐文件无效

public static final int MPS_PREPARE = 1; // 准备就绪

public static final int MPS_PLAYING = 2; // 播放中

public static final int MPS_PAUSE = 3; // 暂停

public static final String PLAY_STATE_NAME = "PLAY_STATE_NAME";

public static final String PLAY_MUSIC_INDEX = "PLAY_MUSIC_INDEX";

public static final String MUSIC_INVALID = "MUSIC_INVALID";

public static final String MUSIC_PREPARE = "MUSIC_PREPARE";

public static final String MUSIC_PLAY = "MUSIC_PLAY";

public static final String MUSIC_PAUSE = "MUSIC_PAUSE";

public static final String MUSIC_STOP = "MUSIC_STOP";

}


MusicPlayActivity,应用程序主界面,该类代码也最多,不过里面细分了几个内部类,如UIManager里面就包含了很多控件对象以及对它们的操作

private final static String TAG = "MusicPlayActivity";

private final String BROCAST_NAME = "com.genius.musicplay.brocast";

private final static int REFRESH_PROGRESS_EVENT = 0x100;

private final static int ABOUT_DIALOG_ID = 1;

private Handler mHandler;

private UIManager mUIManager;

private ServiceManager mServiceManager; // 本地服务管理

private MusicTimer mMusicTimer; // 检测歌曲进度的定时器

private MusicPlayStateBrocast mPlayStateBrocast; // 音乐播放状态的广播接收器

private SDStateBrocast mSDStateBrocast; // SD卡变化接收器

private List<MusicData> m_MusicFileList; // 音乐列表

private ListViewAdapter mListViewAdapter;

private boolean mIsSdExist = false; // SD卡是否存在

private boolean mIsHaveData = false; // 是否有音乐文件

private int mCurMusicTotalTime = 0;

private int mCurPlayMode = MusicPlayMode.MPM_LIST_LOOP_PLAY;


MySlidingDrawer,自定义抽屉控件,属于UIManager的一部分

MusicTimer,用于定时获取歌曲进度的定时器

其它的东东就不多说了,有兴趣的童鞋自个儿下代码(有注释)看吧

http://download.csdn.net/detail/geniuseoe2012/4373714

16楼yangxl03258小时前
顶了
15楼maketoweng昨天 21:09
绝对是学习的好东西~谢谢~
14楼software7777昨天 19:24
确实不错
13楼yangxl0325昨天 17:33
顶了
12楼liuhhaiffeng昨天 23:54
学习了, 呵呵.
11楼hoachen前天 21:59
不错,,学习了
10楼wnweida3天前 22:15
不错了,支持
9楼liutengteng1303天前 19:36
好棒啊,学习了。
8楼fjbperfect3天前 19:22
好东西,建议作出4.0风格
Re: geniuseoe20123天前 19:33
4.0是神马风格?回复fjbperfect
7楼hljstardust20123天前 16:38
挺好的,谢谢了
6楼liushuijinger3天前 15:26
顶了!
5楼tjy19850013天前 12:21
不错,学习了,正好学习下adroid
4楼zhangning3天前 00:18
我是来扯蛋的。。。。
3楼loveseek4天前 12:28
喔~~~~~~~~~楼主好拽啊~~~~~~~~~
2楼franly_yuer4天前 09:19
C++编程,值得借鉴!
Re: geniuseoe20124天前 12:23
回复franly_yuern何解?
1楼luoxiangyu0014天前 01:04
做的灰常不错呢

读书人网 >Android

热点推荐