基于安卓Android的MP3播放器的设计与实现-软件工程毕业论文_第1页
基于安卓Android的MP3播放器的设计与实现-软件工程毕业论文_第2页
基于安卓Android的MP3播放器的设计与实现-软件工程毕业论文_第3页
基于安卓Android的MP3播放器的设计与实现-软件工程毕业论文_第4页
基于安卓Android的MP3播放器的设计与实现-软件工程毕业论文_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

毕 业 论文 题目 基于安卓 Android 的 MP3 播放器 的设计与实现 学生所在学院 电气信息学院 专 业 软件工程 学 号 12153457 学 生 姓 名 代松烨 指 导 教 师 颜 烨 起 止 日 期 2015 12 16 2016 05 17 摘要摘要 摘要摘要 Android 平台是 Google 针对移动设备所推出的一个操作平台 此平台是以 Apache 开源许可的方式的进行发布的 所以使用该系统是免费的 所以开发人 员能够在该平台上开发属于自己的应用 Android 平台是由 操作系统 中间件 用户界面 和 应用程序 组成的 它采用了软件堆层的架构设计 分为三部分 其中底层以 Linux 内核 工作为基础 只提供基本功能来处理事件 中间层包括函数库和虚拟机 负责 系统运行所必须的环境 最上层是各种应用程序 包括 Android 系统自带的通 话 短信 相机等应用 应用软件则由其他自由开发人员或公司自行开发 然 后发布到 Android 应用市场供用户下载 本文以 Android 开发平台为基础 首先简要介绍了 Android 平台的发展历 程 以及当前国内外关于音乐播放器的发展现状 然后描述了 Android 开发平 台的开发环境的搭建 之后便对本播放器做了一个详细的需求分析 再然后便 开始描述本播放器所需使用的数据库的设计 然后对本播放器中的所有功能界 面进行详细介绍和功能实现 关键词 关键词 Android 音乐播放器音乐播放器 Android 平台的开发与设计平台的开发与设计 目录目录 目目 录录 摘要 I 1 概述 1 1 1 项目背景 1 1 2 国内外相关研究现状及发展趋势 1 1 3 项目研究意义 2 1 4 本文主要内容 2 2 ANDROID 开发环境搭建 3 3 项目需求分析 4 3 1 目的 4 3 2 系统背景 4 3 3 问题说明 4 3 4 系统范围 4 3 5 用例图及用例描述 4 3 6 功能摘要 6 3 7 假定与约束 7 4 数据库设计 8 4 1 数据库概念设计 8 4 2 数据表设计 8 4 3 数据库的连接及操作类的编写 11 5 项目实现 14 5 1 欢迎界面 14 5 1 1 欢迎界面概述 14 5 1 2 欢迎界面技术分析 14 5 2 播放器主界面 15 5 2 1 播放器主界面概述 15 5 2 2 主界面技术分析 16 目录目录 5 3 歌曲列表 17 5 3 1 歌曲列表概述 17 5 3 2 歌曲列表实现 17 5 4 网络歌曲榜单界面 18 5 4 1 网络歌曲榜单界面概述 18 5 4 2 网络歌曲榜单界面实现 18 5 5 歌曲详情界面 24 5 5 1 歌曲详情界面概述 24 5 5 2 歌曲详情界面实现 25 5 6 歌曲播放界面 26 5 6 1 歌曲播放界面概述 26 5 6 2 歌曲播放界面实现 26 5 6 3 歌词显示 26 5 7 歌曲播放 29 5 7 1 Service 简介 29 5 7 2 播放服务 PlayService 实现 31 5 8 播放控制 34 6 系统测试 37 6 1 扫描音乐测试 37 6 2 播放音乐测试 37 6 3 切歌测试 38 6 4 搜索歌曲测试 39 总结 40 致谢 41 参考文献 42 毕业设计正文毕业设计正文 1 1 概述概述 1 11 1 项目背景项目背景 在大学前三学年的学习生活中 我学会了 C C Java 这三门编程语言 正因为掌握了编程的基础 于是在大学第四学年中 我自学了 Android 开发 转眼就要毕业了 我想要用我所学到的知识去完成一个基于 Android 的音乐播 放器开发来给我的大学画上一个圆满的句号 至于说为什么想到的会是一款基于 Android 的音乐播放器 我想说既然最 近一学年在学习 Android 开发 那就应该用现阶段自己掌握得最熟练的技术去 开发 至于为什么是音乐播放器 那就得说说音乐在平时生活中所占的比重了 音乐已经成为了人们生活中不可或缺的一部分了 闲暇无聊时听一首安静 的慢歌 朋友聚会时在 KTV 高歌一曲 听歌成了习惯后 软件开发商发现了商 机 各式各样的手机音乐播放器随之被推出 诚然 作为专业的软件应用开发 商所开发的产品功能还是很强大的 不管是在音乐资源还是界面效果上都是很 符合大众口味的 然而秉着虚心学习的态度 都不能抑制我想要开发一款属于 自己的音乐播放器的想法 1 21 2 国内外相关研究现状及发展趋势国内外相关研究现状及发展趋势 目前国内较为流行的几款手机端音乐播放器主要有 网易云音乐 酷狗音 乐 酷我音乐 多米音乐 虾米音乐 天天动听等 这些播放器大都有海量的 曲库支持 专业的音效 炫酷的皮肤 详细的歌曲信息 专辑信息等等 因这 些播放器功能大都雷同 因本次所开发的播放器使用了百度音乐提供的开放接 口 所以此处仅以百度音乐为例介绍其特点 百度音乐 Android 版是一款专为手机定制的功能强大的音乐播放器 数量庞大的音乐资 源提供试听下载 权威的推荐音乐榜单 新鲜的新歌推送 智能语音搜歌 登录账号收藏 音乐 PC 端和手机即可同步显示 而对于国外的音乐播放器 因为接触得少 这里只介绍一款 Beoplayer 是一款丹麦的音乐播放器 Beoplayer 是一款免费软件 由丹麦 的 Bang private static final int VERSION 1 public DataBaseHelper Context context this context DATABASE NAME null VERSION public DataBaseHelper Context context String name SQLiteDatabase CursorFactory cursorFactory int version super context name cursorFactory version Override public void onCreate SQLiteDatabase db db execSQL MyMusicTable CREATE TABLE SQL LOCAL db execSQL MyMusicTable CREATE TABLE SQL DOWNLOAD db execSQL MyMusicTable CREATE TABLE LATELY Override public void onUpgrade SQLiteDatabase db int oldVersion int newVersion 在 DatabaseHelper 类中 通过实现构造方法去创建数据库 然后在 onCreate 方法中执行创建表的语句 当进行应用更新时 再在 onUpgrade 方法 中进行更新数据库的操作 然而到此还并没有完成数据库的连接 可以看到 在构造方法中使用到了 Context 对象 可以想到要连接到数据 库 就需要传入这个 Context 对象 这就需要在 Activity 中对该数据库连接对象 毕业设计正文毕业设计正文 进行实例化了 同时 为了使代码更加简洁 此处将数据库的其他操作方法写 到另一个操作类 MyDatabase 中 在 MyDatabase 中 通过实例化 DataBaseHelper 对象 dbHelper 调用其父类 中的方法 getWiteableDatabase 获取一个 SQLiteDatabase 实例 通过这个实例的 方法就可以进行数据库的增删修改操作了 查询操作查询操作 在本播放器中 并没有针对某项数据进行查询 而是查询某表中所有的歌 曲信息并保存到一个游标集 Cursor 中 然后可通过此表中所拥有的字段再获取 一个信息集合 List 下面代码为根据表名称获取一个 Cursor 对象 public Cursor getTable String tableName SQLiteDatabase db dbHelper getReadableDatabase return db query tableName null null null null null null 插入操作插入操作 此处仅以向本地歌曲表中插入一项数据为例介绍如何插入数据 要向本地 歌曲表中插入数据 需要传入一个 Music 对象 并获取 SQLiteDatabase 的可写 对象 然后执行此对象的 insert 方法即可 代码如下 public long insertToSong String tableName Music music SQLiteDatabase db dbHelper getWritableDatabase ContentValues values new ContentValues values put MyMusicTable SONG ID music getSong id values put MyMusicTable URL music getUrl values put MyMusicTable TITLE music getTitle values put MyMusicTable ARTIST music getArtist values put MyMusicTable ARTIST ID music getArtist id values put MyMusicTable ALBUM music getAlbum values put MyMusicTable ALBUM ID music getAlbum id values put MyMusicTable SIZE music getSize 毕业设计正文毕业设计正文 values put MyMusicTable DURATION music getDuration values put MyMusicTable ALBUM IMAGE music getAlbumImage values put MyMusicTable BITRATE music getBitrate values put MyMusicTable LRC music getLrc values put MyMusicTable SAMPLE RATE music getSampleRate values put MyMusicTable COMMENT music getComment values put MyMusicTable FAVORITE music getFavorite return db insert tableName null values 更新操作更新操作 要更新数据表中数据 可直接调用 SQLiteDatabase 对象的 update 方法 public int update String tableName ContentValues cv String whereClause String args SQLiteDatabase db dbHelper getWritableDatabase return db update tableName cv whereClause args 其中 tableName 表示需要更新的表的名称 cv 表示一个键值对 其键为数 据表中需要修改的字段 值则为更改后的值 whereClause 等价于 sql 更新语句 中的 where 条件 args 数组表示 whereClause 中的 的值 删除操作删除操作 和更新操作一样 要删除某项数据可直接调用 SQLiteDatabase 对象的 delete 方法 public int delete String table String whereClause String args SQLiteDatabase db dbHelper getWritableDatabase return db delete table whereClause args 毕业设计正文毕业设计正文 5 5 项目实现项目实现 从本章节开始 便要逐步开始播放器系统代码的编写了 这其中包括界面 UI 的设计 各个功能的实现 但因代码过多 此处便只贴出部分功能代码 至 于 UI 界面的设计等代码 请查阅源文件 5 15 1 欢迎界面欢迎界面 5 1 1 欢迎界面概述欢迎界面概述 一个应用是很需要一个欢迎界面的 一方面给用户表明应用的性质 一方 面又可在欢迎界面的显示过程中去获取应用配置信息 在本应用的欢迎界面 SplashActivity 中 通过显示一张能够表明主题的图片的同时 去获取应用的基 本配置信息 如是否第一次打开应用 歌曲的播放模式 联网方式 是否打开 了摇一摇切歌等信息 5 1 2 欢迎界面技术分析欢迎界面技术分析 在执行这些可能比较耗时的操作时 我们需要另开辟一个线程去执行这些 方法 在执行完毕后 通过 Handler 的消息处理机制 发送消息给主线程去执 行接下来的操作 在这个另开辟的线程中执行两个方法 当启动此应用时即开 始执行这个 StartThread 线程 其流程图如图 5 1 所示 部分代码如下 class StartThread implements Runnable Override public void run try Thread sleep 2000 catch InterruptedException e e printStackTrace open 毕业设计正文毕业设计正文 欢饮界面 是否第一次使用扫描音乐界面 播放器主界面 是 否 图 5 1 欢迎界面流程图 5 25 2 播放器主界面播放器主界面 5 2 1 播放器主界面概述播放器主界面概述 本应用的设计基本使用 Activity 和 Fragment 的方式进行界面的搭配 除却 欢迎界面 SplashActivity 主界面 MainActivity 便成了其它的 Fragment 的父容器 此外 为方便数据的统一使用 SplashActivity 和 MainActivity 均继承自自定义 的 BaseActivity 减少了代码的冗杂量 主界面上功能流程图如图 5 2 所示 在 MainActivity 中 包括三个界面 顶部的导航界面 底部的当前播放信 息界面 中部则是一个 ViewPager 组件 用于放置 我的 LocalFragment 和 榜单 NetFragment 两个 Fragment 初始状态下显示 我的 界面 当 点击上方的 榜单 或向左滑动时 则可显示网络歌曲推荐榜单界面 主界面 效果如图 5 3 所示 榜单 界面如图 5 4 所示 在主界面中可看到 LocalFragment 通过一个 GridView 组件显示播放器记 录的部分信息 通过读取存于数据库中的歌曲信息 在初始化 GridView 设置其 适配器时将数据显示于界面上 毕业设计正文毕业设计正文 5 2 2 主界面技术分析主界面技术分析 在本应用中 使用到了一个第三方的开源库 SlidingMenu 其效果是可展示 一个侧滑菜单 如常用的手机 QQ 的菜单样式 通过使 BaseActivity 继承其中 的 SlidingFragmentActivity 即可获得这一个菜单对象 再在 MainActivity 的 onCreate 方法中初始化这个对象 效果如图 5 5 所示 初始化 menu 的代码如下 private void initMenu menu getSlidingMenu menu setTouchModeAbove SlidingMenu TOUCHMODE MARGIN menu setMode SlidingMenu LEFT menu setBehindOffsetRes R dimen content width menu setShadowDrawable R drawable shadow menu setShadowWidthRes R dimen menu shadow MenuFragment menuFragment new MenuFragment getSupportFragmentManager beginTransaction replace R id container menu menuFragment commit 主界面MainActivity 本地歌曲界面 LocalFragment 用户选择 网络歌曲界面 NetFragment 本地歌曲列表 MusicLIstFragment 网络歌曲榜单 图 5 2 主界面功能流程图 毕业设计正文毕业设计正文 图 5 3 播放器主界面图 图 5 4 榜单界面图 图 5 5 菜单界面 5 35 3 歌曲列表歌曲列表 5 3 1 歌曲列表概述歌曲列表概述 歌曲列表主要用于显示用户选择的歌单的列表 如本地音乐 我的最爱 最近播放 界面包括上方的导航信息和其余部分的歌曲信息列表 当用户点击 任何一首歌曲即可播放此歌曲 在每一项歌曲的列表项中都对应有菜单选项 用户可根据所需对歌曲进行移除 查看详情等操作 歌曲列表界面上的活动图 如图 5 6 所示 5 3 2 歌曲列表实现歌曲列表实现 根据界面的样式进行 UI 设计 在 MusicListFragment 中找出歌曲列表 ListView 为了给单项歌曲增加菜单选项 我们需要自定义列表项的布局 然 后在 ListView 的 Adapter 中给每个菜单项添加事件 此外 为了实现单机歌曲 项播放歌曲 我们需要给这个 ListView 添加 OnItemClick 事件 除此之外 为 了更方便的实现歌曲项中的菜单点击事件 我们需要定义一个回调接口 OnLocalMusicListMenuClick 并使本界面对应的 Fragment 类 MusicListFragment 实现这个接口中的方法 界面截图如 5 7 所示 毕业设计正文毕业设计正文 图 5 6 歌曲列表活动图 图 5 7 歌曲列表界面 5 45 4 网络歌曲榜单界面网络歌曲榜单界面 5 4 1 网络歌曲榜单界面概述网络歌曲榜单界面概述 网络歌曲榜单界面 NetFragment 主要用来显示由百 度音乐提供的网络歌曲热门榜单 如图 5 8 所示 因其 接口提供数据有限 本播放器仅提供了图左侧的的部分 推荐榜单 右侧则用于显示对应榜单的前 50 首歌曲 同样 这也是播放器主界面的内容 是主界面布局中的 ViewPager 的一个 Fragment 图 5 8 网络歌曲榜单 5 4 2 网络歌曲榜单界面实现网络歌曲榜单界面实现 因为在 NetFragment 的界面中同样是在两侧各放置一个 Fragment 并实现回 调接口 所以需要在 NetFragment 的布局文件中为这两个 Fragment 留出空间以 便于放置 此处就介绍这两个 Fragment ListMenuFragment 和 ListFragment 选择歌曲 将歌曲信息传入播放服务 开始播放 毕业设计正文毕业设计正文 榜单选项界面榜单选项界面 ListMenuFragment 此 Fragment 内容相对简单 仅需要在布局中放置所需的按钮并添加相应的 点击事件即可 为提高代码的简洁性 特为此类声明了一个回调接口 以便在 NetFragment 中直接调用这些方法 接口声明如下 public interface OnListMenuClickListener void onListMenuClick View view 在接口的 onListMenuClick 方法中传入一个 View 参数 在 NetFragment 中 根据此 View 的 ID 判断是点击了哪个按钮 并执行相应的事件方法 方法代码 如下 public void onListMenuClick View view if listFragment null return switch view getId case R id btn list menu newMusic listFragment updateList GetMusicList MUSIC LIST NET break case R id btn list menu hotMusic listFragment updateList GetMusicList MUSIC LIST HOT break case R id btn list menu europeMusic listFragment updateList GetMusicList MUSIC LIST EUROPE break case R id btn list menu classicalMusic listFragment updateList GetMusicList MUSIC LIST CLASSICAL OLD break case R id btn list menu lovewMusic listFragment updateList GetMusicList MUSIC LIST LOVE SONG break 毕业设计正文毕业设计正文 case R id btn list menu movieMusic listFragment updateList GetMusicList MUSIC LIST MOVIE break case R id btn list menu netMusic listFragment updateList GetMusicList MUSIC LIST NET break case R id btn list menu rockMusic listFragment updateList GetMusicList MUSIC LIST ROCK break case R id btn list menu jazzMusic listFragment updateList GetMusicList MUSIC LIST JAZZ break 下面为 ListFragment 中的 updateList 方法 public void updateList int i this type i if activity isNetworkAvailable txt loading setVisibility View VISIBLE new GetNetMusicsTask execute i 可以看到 当传入一个类型参数时 就会开始执行一个 GetNetMusicsTask 的异步任务 在此任务中会从网络获取一段 xml 数据 并在获取以后解析 xml 数据并生成一个 ArrayList对象 异步任务类代码如下 class GetNetMusicsTask extends AsyncTask Integer Integer ArrayList Override protected ArrayList doInBackground Integer params 毕业设计正文毕业设计正文 ArrayList resultArrayList new ArrayList switch params 0 case GetMusicList MUSIC LIST NEW GetMusicList getMusicList GetMusicList MUSIC LIST NET 50 0 resultArrayList break case GetMusicList MUSIC LIST HOT GetMusicList getMusicList GetMusicList MUSIC LIST HOT 50 0 resultArrayList break case GetMusicList MUSIC LIST EUROPE GetMusicList getMusicList GetMusicList MUSIC LIST EUROPE 50 0 resultArrayList break case GetMusicList MUSIC LIST CLASSICAL OLD GetMusicList getMusicList GetMusicList MUSIC LIST CLASSICAL OLD 50 0 resultArrayList break case GetMusicList MUSIC LIST LOVE SONG GetMusicList getMusicList GetMusicList MUSIC LIST LOVE SONG 50 0 resultArrayList break case GetMusicList MUSIC LIST MOVIE GetMusicList getMusicList GetMusicList MUSIC LIST MOVIE 50 0 resultArrayList break case GetMusicList MUSIC LIST NET 毕业设计正文毕业设计正文 GetMusicList getMusicList GetMusicList MUSIC LIST NET 50 0 resultArrayList break case GetMusicList MUSIC LIST ROCK GetMusicList getMusicList GetMusicList MUSIC LIST ROCK 50 0 resultArrayList break case GetMusicList MUSIC LIST JAZZ GetMusicList getMusicList GetMusicList MUSIC LIST JAZZ 50 0 resultArrayList break return resultArrayList Override protected void onPostExecute ArrayList netMusics super onPostExecute netMusics if netMusics null for QueryResult result netMusics Log v result Log v result result toString listViewSetAdapter netMusics txt loading setVisibility View GONE 毕业设计正文毕业设计正文 其中解析 xml 数据时用到了一种非常流行的 Jsoup 处理 xml 文档的方式 Jsoup 是一款基于 Java 的 HTML 解析器 可直接解析某个 URL 地址 HTML XML 文本内容 它提供了一套非常省时省力的 API 可通过 DOM CSS 以及类似于 JQuery 的操作方法直接取出或操作数据 下面是本播 放器解析榜单 XML 文本的方法 public static void getMusicList int type int size int offset ArrayList results String url BASE URL baidu ting billboard billList Document doc null try doc Jsoup connect url timeout 5000 get Elements songs doc select song list select song if results null results new ArrayList else results clear for Element song songs QueryResult result new QueryResult result setSongID Long parseLong song select song id text result setTitle song select title text result setArtist song select author text results add result catch IOException e 毕业设计正文毕业设计正文 e printStackTrace 榜单歌曲列表界面榜单歌曲列表界面 ListFragment 如同歌曲列表界面 MusicListFragment 本界面也同样是实时改变此界面中 的 ListView 的 Adapter 达到改变项数据 所以需要为 ListView 的每个项设置布 局并设计其项上的点击事件 而点击的目的是打开对应歌曲的详情页面 代码 如下 listView setOnItemClickListener new AdapterView OnItemClickListener public void onItemClick AdapterView parent View view int position long id QueryResult result QueryResult parent getAdapter getItem position activity initDetailFragment result getSongID 5 55 5 歌曲详情界面歌曲详情界面 5 5 1 歌曲详情界面概述歌曲详情界面概述 歌曲详情界面主要用来展示用户所选择的歌曲的详细信息 包括歌曲名 歌手 所在专辑 年份 歌词等信息 若歌曲为网络资源文件还可进行下载操 作 页面效果如图 5 10 所示 图 5 10 歌曲详情界面 毕业设计正文毕业设计正文 5 5 2 歌曲详情界面实现歌曲详情界面实现 在歌曲详情界面 DetailFragment 中 需要有一个 ImageView 来加载专辑图 片 多个 TextView 来显示相关的文本信息 在 DetailFragment 中 为不影响主 线程的进行 需要另开启异步任务去加载专辑图片 歌词文本等信息 在获取 歌词的异步任务中的 DoInBackground 方法代码如下 protected Bitmap doInBackground Long params xml GetMusicInfo getMusicDownloadInfo songID if bitrates null bitrates clear bitrates GetMusicInfo getMusicBitrateList xml if bitrates null music GetMusicInfo getMusicInfoFromPlayInterface songID hasBitrate false else music GetMusicInfo getMusicInfo xml bitrates get 0 hasBitrate true Bitmap bitmap null if music getAlbumImage null music getAlbumImage length 0 return BitmapFactory decodeResource getResources R drawable default album image else DiskCacheHelper mHelper new DiskCacheHelper activity bitmap mHelper getBitmapFromDisk music getAlbumImage if bitmap null if mHelper saveToDisk music getAlbumImage bitmap mHelper getBitmapFromDisk music getAlbumImage 毕业设计正文毕业设计正文 return bitmap 5 65 6 歌曲播放界面歌曲播放界面 5 6 1 歌曲播放界面概述歌曲播放界面概述 作为一个音乐播放器 当然需要一个歌曲播放时的详 细信息界面 界面主要展示歌曲名 歌手 专辑图片 歌 词以及对歌曲的播放控制等控件 如图 5 11 所示 图 5 11 播放界面 5 6 2 歌曲播放界面实现歌曲播放界面实现 如图 5 11 所示 较之前面所介绍的页面不同的是 本页面有更多的组件 设计更复杂的 UI 布局 首先在页面顶部是一个返回按钮 以及歌曲的名称和歌 手的文本组件 在界面中部则是歌词和歌曲专辑图片 截图中未显示 当在 屏幕上左划或右划则交替显示专辑图片或歌词 在页面底部 则是当前歌曲的 播放控制的按钮 播放进度 播放模式 上一曲 播放暂停 下一曲 音量按 钮 关于更详细的布局 请查看源文件中 layout 中的 fragment play2 xml 文件 5 6 3 歌词显示歌词显示 本播放器实现了歌曲播放时歌词的同步显示 但由于 Android 官方并没有 提供类似的组件 且网络上对歌曲歌词文件的类型又各有不同 所以本播放器 中采用自定义组件的方式来实现歌词的显示 不同的播放器可能采用不同格式的歌词文件 在本播放器中则采用后缀为 lrc 的歌词文件作为解析源头 当然 在解析之前我们需要先把歌词组件定义出 来 在 Android 中 自定义组件需要继承所有组件的父类 View 或者其子类 此 处则是继承的父类 View 同时实现父类的构造方法 毕业设计正文毕业设计正文 public class Lrc extends View private Scroller scroller private OnLrcClickListener onLrcClickListener public void setOnLrcClickListener OnLrcClickListener onLrcClickListener this onLrcClickListener onLrcClickListener public Lrc Context context super context scroller new Scroller context init public Lrc Context context AttributeSet attrs super context attrs scroller new Scroller context TypedArray a context getTheme obtainStyledAttributes attrs R styleable Lrc 0 0 try textSize int a getDimension R styleable Lrc textSize 25 finally a recycle init public Lrc Context context AttributeSet attrs int defStyleAttr super context attrs defStyleAttr scroller new Scroller context init 毕业设计正文毕业设计正文 因为需要在布局文件中用到自定义的 Lrc 组件 且需要为 Lrc 中的文本设 置字体大小 所以需要在 attr xml 中声明组件的这个属性 在 Lrc 中 对于一个 String 类型的 ArrayList 集合 我们需要分别在 onDraw 方法中绘制这些 String 对于当前正在播放的歌词我们需要定义一个画 笔 hPaint 对于其他歌词需要定义一个画笔 nPaint 当然这两个画笔对象只是以不 同颜色的区别来突出显示当前正在播放的歌词 hlPaint new Paint hlPaint setAntiAlias true hlPaint setTextAlign Paint Align CENTER nPaint new Paint nPaint setTextAlign Paint Align CENTER nPaint setAntiAlias true 在歌词绘制时 需要用到当前组件的高度和宽度 通过实现父类的 onSizeChanged 方法可获取 protected void onSizeChanged int w int h int oldw int oldh super onSizeChanged w h oldw oldh this width w this height h 到此 则可以开始绘制歌词了 为了不多余绘制 仅在当前高度和宽度范 围内绘制相应歌词 下面为 onDraw 方法中部分代码 canvas drawText listList get index getLyc width 2 height 2 hlPaint float temp height 2 毕业设计正文毕业设计正文 for int i index 1 i 0 i temp temp 2 textSize if temp 0 canvas drawText listList get i getLyc width 2 temp nPaint temp height 2 for int i index 1 i listList size i temp temp 2 textSize if temp onCreate onBind Servicerunning onUnbind onDestroy Service stop onBind 将返回给客户端一个 IBind 接口实例 IBind 允许客户端回调服务的 方法 比如得到 Service 的实例 运行状态或其他操作 这个时候把调用者 Context 例如 Activity 会和 Service 绑定在一起 Context 退出了 Srevice 就会调用 onUnbind onDestroy 相应退出 所以调用 bindService 的生命周期为 onCreate onBind 只一次 不可多次绑定 onUnbind onDestory 在 Service 每一次的开启关闭过程中 只有 onStart 可被多次调用 通过多次 startService 调用 其他 onCreate onBind onUnbind onDestory 在一个生命周 期中只能被调用一次 毕业设计正文毕业设计正文 图 5 10 service 启动方式 5 7 2 播放服务播放服务 PlayService 实现实现 自定义 PlayService 类 继承 Service 添加一个继承 Binder 的内部类 MyBinder 实现方法 getPlayService 返回当前 PlayService 对象 并声明一个 MyBinder 对象 public class PlayService extends Service private final IBinder mBinder new MyBinder private final IBinder mBinder new MyBinder public class MyBinder extends Binder public PlayService getPlayService return PlayService this 在 BaseActivity 中初始化服务连接对象 ServiceConnection 毕业设计正文毕业设计正文 private ServiceConnection conn new ServiceConnection Override public void onServiceConnected ComponentName name IBinder service PlayService MyBinder binder PlayService MyBinder service mPlayService binder getPlayService Override public void onServiceDisconnected ComponentName name mPlayService null isBind false 然后通过绑定服务即可调用 PlayService 类中的方法了 public void bindPlayService if isBind Intent intent new Intent this PlayService class bindService intent conn Context BIND AUTO CREATE isBind true Log v on bind true 在 PlayService 中 定义播放歌曲的方法 通过传入一个 Music 对象即可开始 播放歌曲 public void play Music music this music music this isCompleted false thread playMusic null try 毕业设计正文毕业设计正文 mPlayer reset mPlayer setDataSource getApplicationContext Uri parse music getUrl mPlayer prepare mPlayer start if thread playMusic null thread playMusic new Thread new PlayingThread PlayThread thread playMusic start catch IOException e e printStackTrace 自定义方法实现播放过程中的暂停和继续播放 public void start if mPlayer null return if mPlayer isPlaying mPlayer pause else mPlayer start 自定义方法实现拉动进度条从指定位置开始播放 public void seekTo int msec if mPlayer null mPlayer seekTo msec 毕业设计正文毕业设计正文 5 85 8 播放控制播放控制 在播放歌曲时 当然需要对播放模式 进度 歌曲进行控制 在本播放器 中 对播放歌曲时的一些基本控制在 BaseActivity 中便已声明对应方法 以下 为上一曲和下一曲按钮的事件方法 public void next ArrayList musics switch playMode case MODE REPEATE if positon musics size 1 positon 1 positon mPlayService play musics get positon break case MODE SHUFFLE Random random new Random int nextPosition random nextInt musics size 1 while nextPosition positon nextPosition random nextInt musics siz

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论