热门手机android系统的音乐播放器设计与实现.docx
《热门手机android系统的音乐播放器设计与实现.docx》由会员分享,可在线阅读,更多相关《热门手机android系统的音乐播放器设计与实现.docx(11页珍藏版)》请在冰豆网上搜索。
热门手机android系统的音乐播放器设计与实现
1功能介绍
设计的音乐播放器是能够实现音乐的播放、暂停、声音控制、播放时间和歌曲的选择用户可以选择播放的音乐,播放器也可以显示该音乐的歌曲名以及歌曲的播放总时间,播放进度等歌曲的相关功能;用户还可以通过音乐增减按钮调节声音大小。
2各功能模块图
播放\暂停
3设计思想
通过在IDD_MUSICPLAY_DIALOG对话框中添加控件,并设置相应的属性值。
并且为其添加进度条ID为:
IDC_SLIDER1,音量控制ID为:
IDC_SLIDER2
一个大致的轮廓已经出来,没有类似酷我或天天静音的皮肤,但通过LoadBitmap()加载位图,来改变现在的外观,
4播放器界面的设计
创建一个基于对话框的工程命名为MusicPlayer。
并为对话框添加控制按钮
用Photoshop为播放器设计一个背景图像并将其载入工程
重载对话框的OnCtlColor()
HBRUSHCMusicPlayerDlg:
:
OnCtlColor(CDC*pDC,CWnd*pWnd,UINTnCtlColor)
{
HBRUSHhbr=CDialog:
:
OnCtlColor(pDC,pWnd,nCtlColor);
//TODO:
ChangeanyattributesoftheDChere
if(nCtlColor==CTLCOLOR_DLG)
returnm_brBack;
//TODO:
Returnadifferentbrushifthedefaultisnotdesired
returnhbr;
}
为播放器添加不规则个性按钮。
轴线需要在对话框类中定义按钮的ID及按钮变量。
enum{MY_OPEN=1010,MY_PLAY=1011,MY_PAUSE=1012,
MY_STOP=1013,MY_REPEAT=1014,MY_HIDE=1015,
MY_EXIT=1016,MY_MIN=1017,MY_MAX=1018,MY_QUITE=1019;
CMybuttonm-Open,M-Play,m_Pause,m_Stop
m-Repeat,m_Hide,Exit,m_Min,m_Max,m_Quite:
在对话框的初始化框中创建这些按钮对象
BOOLCMusicPlayerDlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
//Add"About..."menuitemtosystemmenu.
//IDM_ABOUTBOXmustbeinthesystemcommandrange.
ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX<0xF000);
CMenu*pSysMenu=GetSystemMenu(FALSE);
if(pSysMenu!
=NULL)
{
CStringstrAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if(!
strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
}
}
//Settheiconforthisdialog.Theframeworkdoesthisautomatically
//whentheapplication'smainwindowisnotadialog
SetIcon(m_hIcon,TRUE);//Setbigicon
SetIcon(m_hIcon,FALSE);//Setsmallicon
m_bmBack.DeleteObject();
m_brBack.DeleteObject();
m_bmBack.LoadBitmap(IDB_BACK);
m_brBack.CreatePatternBrush(&m_bmBack);
//TODO:
Addextrainitializationhere
HRGNc;
HRGNr1;
intx,y,i=0;
x=37;
y=115;
COLORREFForeColor,hoverColor,downColor;
ForeColor=RGB(50,50,50);
hoverColor=RGB(120,120,120);
downColor=RGB(180,180,120);
HRGNmin;
min=CreateRectRgn(0,0,20,15);
m_Min.Create("_",WS_CHILD|WS_VISIBLE,CPoint(320,7),min,this,MY_MIN,1,ForeColor,downColor,hoverColor,GetSysColor(COLOR_BTNFACE));
m_Max.Create("||",WS_CHILD|WS_VISIBLE|WS_DISABLED,CPoint(346,7),min,this,MY_MAX,1,ForeColor,downColor,hoverColor,GetSysColor(COLOR_BTNFACE));
m_Quite.Create("X",WS_CHILD|WS_VISIBLE,CPoint(372,7),min,this,MY_QUITE,1,ForeColor,downColor,hoverColor,GetSysColor(COLOR_BTNFACE));
c=CreateRectRgn(8,0,55,31);
r1=CreateEllipticRgn(48,8,15+48,15+8);
CombineRgn(c,c,r1,RGN_OR);
m_Open.Create("Open",WS_CHILD|WS_VISIBLE,CPoint(x+48*(i++),y),c,this,MY_OPEN,1,ForeColor,downColor,hoverColor,GetSysColor(COLOR_BTNFACE));
r1=CreateEllipticRgn(0,8,15,15+8);
CombineRgn(c,c,r1,RGN_DIFF);
m_Play.Create("Play",WS_CHILD|WS_VISIBLE,CPoint(x+48*(i++),y),c,this,MY_PLAY,1,ForeColor,downColor,hoverColor,GetSysColor(COLOR_BTNFACE));
m_Pause.Create("Pause",WS_CHILD|WS_VISIBLE,CPoint(x+48*(i++),y),c,this,MY_PAUSE,1,ForeColor,downColor,hoverColor,GetSysColor(COLOR_BTNFACE));
m_Stop.Create("Stop",WS_CHILD|WS_VISIBLE,CPoint(x+48*(i++),y),c,this,MY_STOP,1,ForeColor,downColor,hoverColor,GetSysColor(COLOR_BTNFACE));
m_Repeat.Create("Repeat",WS_CHILD|WS_VISIBLE,CPoint(x+48*(i++),y),c,this,MY_REPEAT,1,ForeColor,downColor,hoverColor,GetSysColor(COLOR_BTNFACE));
m_Hide.Create("Hide",WS_CHILD|WS_VISIBLE,CPoint(x+48*(i++),y),c,this,MY_HIDE,1,ForeColor,downColor,hoverColor,GetSysColor(COLOR_BTNFACE));
c=CreateRectRgn(8,0,63,31);
r1=CreateEllipticRgn(0,8,15,15+8);
CombineRgn(c,c,r1,RGN_DIFF);
m_Exit.Create("Exit",WS_CHILD|WS_VISIBLE,CPoint(x+48*(i++),y),c,this,MY_EXIT,1,ForeColor,downColor,hoverColor,GetSysColor(COLOR_BTNFACE));
DeleteObject(c);
DeleteObject(r1);
m_ctlSlider.SetRange(0,1000);
m_voice.SetRange(0,10);
m_voice.SetPos(7);
SetWindowText("TT-Play");
returnTRUE;//returnTRUEunlessyousetthefocustoacontrol
}
绘制播放器界面
由于有些音频文件信息及播放状态需要爱界面上时时更新,所以要重载OnPaint()函数。
voidCMusicPlayerDlg:
:
OnPaint()
{
CPaintDCdc(this);//devicecontextforpainting
if(m_bOpen)
{
CSizesize;
CDCmemDC,maskDC;
CStringstr;
COLORREFfileColor,timeColor,infoColor;
size=dc.GetTextExtent(m_strMusic);
fileColor=RGB(156,196,94);
timeColor=RGB(255,0,0);
infoColor=RGB(105,121,148);
m_titleRect.left-=1;
if(m_titleRect.left<-size.cx)
{
m_titleRect.left=size.cx;
m_changed=0;
Invalidate();
}
m_titleRect.top=0;
m_titleRect.right=size.cx;
m_titleRect.bottom=size.cy;
memDC.CreateCompatibleDC(&dc);
maskDC.CreateCompatibleDC(&dc);
CBitmapbkbmp;
bkbmp.CreateCompatibleBitmap(&dc,size.cx,size.cy);
memDC.SelectObject(&bkbmp);
maskDC.SelectObject(&bkbmp);
memDC.SetTextColor(RGB(50,250,160));
memDC.DrawText(m_strMusic,&m_titleRect,DT_BOTTOM);
maskDC.SetTextColor(RGB(0,0,0));
maskDC.DrawText(m_strMusic,&m_titleRect,DT_BOTTOM);
dc.SetBkMode(TRANSPARENT);
dc.SetTextColor(fileColor);
if(m_titleRect.left>=0)
{
dc.BitBlt(30+m_titleRect.left,30,size.cx-m_titleRect.left,size.cy,&maskDC,m_titleRect.left,0,MERGEPAINT);
dc.BitBlt(30+m_titleRect.left,30,size.cx-m_titleRect.left,size.cy,&memDC,m_titleRect.left,0,SRCAND);
}
else
{
dc.BitBlt(30,30,size.cx+m_titleRect.left,size.cy,&maskDC,0,0,MERGEPAINT);
dc.BitBlt(30,30,size.cx+m_titleRect.left,size.cy,&memDC,0,0,SRCAND);
}
dc.SetTextColor(infoColor);
if(m_bRepeat)
{
switch(m_state)
{
case1:
str.Format("状态:
播放-Repeat");
break;
case2:
str.Format("状态:
暂停-Repeat");
break;
case3:
str.Format("状态:
播放-Repeat");
break;
}
}
else
{switch(m_state)
{
case1:
str.Format("状态:
播放-NoRepeat");
break;
case2:
str.Format("状态:
暂停-NoRepeat");
break;
case3:
str.Format("状态:
停止-NoRepeat");
break;
}
}
dc.TextOut(30,48,str);
dc.SetTextColor(fileColor);
str.Format("%s-%s",m_Author,m_title);
dc.TextOut(30,65,str);
dc.SetTextColor(timeColor);
str.Format("%02d:
%02d:
%02d/%02d:
%02d:
%02d",
int(m_curPos)/360,int(m_curPos)/60,
int(m_curPos)%60,int(m_time)/360,
int(m_time)/60,int(m_time)%60);
dc.TextOut(260,50,str);
}
}
监控音乐的播放器进度
为了能都时时更新进度滑块的位置,以及滚轮标题的位置,还需要实现定时器事件在OnPlay()函数中启动了一个定时器。
SetTimer(0,20,NULL);
实现定时器处理函数,更新当前界面显示信息。
voidCMusicPlayerDlg:
:
OnTimer(UINTnIDEvent)
{
m_changed++;
m_curPos=m_ActiveMovie.GetCurrentPosition();
m_ctlSlider.SetPos(m_curPos);
CRectrect;
rect.left=30;
rect.top=30;
rect.right=398;
rect.bottom=50;
CRgnrgn1,rgn2;
rgn1.CreateRectRgnIndirect(&rect);
rgn2.CreateRectRgn(260,50,350,65);
rgn1.CombineRgn(&rgn1,&rgn2,RGN_OR);
InvalidateRgn(&rgn1,2);
if(m_curPos==0&&m_bRepeat)
m_ActiveMovie.Run();
elseif(m_curPos==0)
m_state=3;
CDialog:
:
OnTimer(nIDEvent);
}
总结
由于对编程语言的不熟悉所以也遇到了一些问题,由于平时积累不够,对于编程不是那么的连贯和详细,实现一个具体的功能请教了很多人,但是没有有真正的弄懂它的使用方法,所以出现很多问题。
通过自己慢慢地实现一个个的功能理解和消化相关的知识,对于解决不了的问题,小组讨论或向老师和同学们求助,最后慢慢成功。
我觉的这次实验非常有意义,是我了解了很多!
4.2解决我觉的这次课设非常有意义,虽然,短短的三周不可能真正的掌握android相关的知识,但是,通过这次课设,让我们接触了社会比较前沿的编程知识,为即将毕业的我们找工作有了一定的帮助,也为以后从事android打下一个小小的基础。
方法
由于android是用java语言编写的,自己学习java还比较可以,语言不是主要的问题,主要的问题就是android那四个组件的使用和理解,对于老师课堂上没有讲清楚的我下来主要是采用网上查找资料和自己到图书馆查阅相关的书籍,对于其一些接口查阅android的相关API接口文档,通过自己慢慢地实现一个个的功能理解和消化相关的知识,对于解决不了的问题,向老师和同学们求助,然后自己在一点点的理解。
我觉的这次实验非常有意义,虽然,短短的三周不可能真正的掌握android相关的知识,但是,通过这次课设,让我们接触了社会比较前沿的编程知识,为即将毕业的我们找工作有了一定的帮助,也为以后从事android打下一个小小的基础。
4.3收获体会
通过这次三周的课程设计,让我更加全面的复习和掌握了java语言,对android编程知识有了基本的认识和了解,基本掌握了android的四大组件的相关知识,虽然自己以前没有接触过android,但是系统的学习过java语言,对语言知识有一定的理解,但是,android中相关组件和接口非常的繁琐和多,所以,对于初学者不可能一下子全部的掌握所有组件以及接口,但是,通过这三周设计播放器和通讯录,让我明白了android平台和知识的基本使用,虽然设计中遇到了很多的问题,但是通过网上查阅和图书馆介于相关的书籍弄懂了自己不会的知识。
自然学习任何语言和新知识,都会有疑问和困难,所以,自己必须通过查阅相关知识自己解决。
所以,我觉的这次课设非常有意义,虽然,短短的三周不可能真正的掌握android相关的知识,但是,通过这次课设,让我们接触了社会比较前沿的编程知识,为即将毕业的我们找工作有了一定的帮助,也为以后从事android打下一个小小的基础。
参考文献
[1]李宁.Android应用开发实战.北京.机械工业出版社.2012
[2]高彩丽.Android应用开发范例精解.北京.清华大学出版社.2012
[3]李宁.Android开发完全讲义.北京.中国水利水电出版社.2012
[4]张元亮.Android开发应用实战详解.北京.中国铁道出版社.2011
[5]本文由转载。