首页 文章 精选 留言 我的

精选列表

搜索[web开发框架],共10000篇文章
优秀的个人博客,低调大师

android音乐播放器开发 SweetMusicPlayer 实现思路

一,实现效果 眼下还不是特别完好,主要有下面几个功能, 1,载入歌曲列表(实现a-z字母检索) 2,播放本地音乐 3。智能匹配本地歌词 4。智能载入在线歌词(事实上不算智能。发现歌词迷api提供的歌词好多难以解析) 5。摇一摇换歌功能 先上几张截图吧 另外,素材来自天天动听和百度音乐。。。毕竟作为一个码农,p图什么的太累。 。 。 楼主也是一介菜鸟。想记录一下做过的东西。做一个总结。 二。实现思路 1。主要界面设计 1)用tabs实现歌曲,近期。艺术家,专辑等分类,眼下楼主仅仅实现了歌曲部分。 2)主界面底部有个bottomactionbar用来操作歌曲状态,点击后弹出歌词播放界面。(这里必需要吐槽下,我眼下的实现方案不是非常好,用的最外层包裹的一层ScrollView,把歌词界面和歌曲界面放进去,操作时滚动到需要的界面位置,本想模仿天天动听能够把歌词界面拖拽出来,技术有限。弄了三四种方案,成了现在蹩脚的样子) 3)歌词界面,实现歌词部分,歌词调整进度。 2,主要实现思路 用一个MusicManager类控制播放器的主要事件及操作。然后广播通知ui控件更新。 在MusicManager设置一个ListView成员变量作为当前播放的控件。 由于可能用户不通过歌曲列表播放,可能通过近期播放列表。艺术家列表等等。 MusicManager包括各种状态以及操作,比方播放音乐。随机一个音乐。下一曲等等。 然后去通知播放音乐的service。先简介一下吧,然后再总结详细实现。 package com.huwei.sweetmusicplayer.datamanager; import java.util.ArrayList; import java.util.List; import java.util.Random; import android.content.Context; import android.content.Intent; import android.provider.MediaStore; import android.view.View; import android.widget.BaseAdapter; import android.widget.ListView; import com.huwei.sweetmusicplayer.enums.MusicState; import com.huwei.sweetmusicplayer.models.Song; import com.huwei.sweetmusicplayer.ui.fragments.PlayingFragment; public class MusicManager { private int nowplaying_index=-1; public static boolean isPlaying=false; public static final String BOTTOMACTIONBAR_UPDATE="BOTTOMACTIONBAR_UPDATE"; public static final String BOTTOMACTIONBAR_CHECKED="BOTTOMACTIONBAR_CHECKED"; public static final String BOTTOMACTIONBAR_UNCHECKED="BOTTOMACTIONBAR_UNCHECKED"; public static final String PLAY_BTN_CHECKED="PLAY_BTN_CHECKED"; public static final String PLAY_BTN_UNCHECKED="PLAY_BTN_UNCHECKED"; private static MusicManager instance; private Context context; private List<Song> songLists=new ArrayList<Song>(); //启动应用从数据库都进来时候的列表 private ListView nowPlayingListView; //正在播放音乐的列表控件 /** * 定义查找音乐信息数组。0.标题,1音乐时间,2.艺术家,3.音乐id,4.显示名字,5.全路径,6,专辑ID,7最后加入时间。 */ public static String[] media_info = new String[] { MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.DURATION, MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media._ID, MediaStore.Audio.Media.DISPLAY_NAME, MediaStore.Audio.Media.DATA, MediaStore.Audio.Media.ALBUM_ID ,MediaStore.MediaColumns.DATE_ADDED}; public static MusicManager getInstance(){ if(null==instance){ instance=new MusicManager(); } return instance; } //加入song到songLists public void addSong(Song song){ songLists.add(song); } public void bind(Context context){ this.context=context; } public void play(){ Intent intent=new Intent(); Song song=(Song) nowPlayingListView.getAdapter().getItem(nowplaying_index); intent.setAction("com.huwei.sweetmusicplayer.services.LocalMusicService"); intent.putExtra("song", song); intent.putExtra("op", MusicState.PLAYING.ordinal()); //播放选项 context.startService(intent); //通知playButton Intent intent3=new Intent(PLAY_BTN_CHECKED); context.sendBroadcast(intent3); isPlaying=true; } //先停止,再播放 public void restartPlay(){ stopUnNotifyView(); play(); } public void previousSong(){ setNowplaying_index(nowplaying_index-1); restartPlay(); } public void nextSong(){ //都要用set方法。便于通知更新视图 setNowplaying_index(nowplaying_index+1); restartPlay(); } //随机播放一首歌 public void random_a_song(){ getRandom_song(); restartPlay(); } public void pause(){ Intent intent=new Intent(); intent.setAction("com.huwei.sweetmusicplayer.services.LocalMusicService"); intent.putExtra("op", MusicState.PAUSE.ordinal()); //播放选项 context.startService(intent); isPlaying=false; //通知playButton Intent intent3=new Intent(PLAY_BTN_UNCHECKED); context.sendBroadcast(intent3); } //发送停止音乐广播,可是不更新视图 public void stopUnNotifyView(){ Intent intent=new Intent(); intent.setAction("com.huwei.sweetmusicplayer.services.LocalMusicService"); intent.putExtra("op", MusicState.STOP.ordinal()); //播放选项 context.startService(intent); } //停止音乐 public void stop(){ stopUnNotifyView(); } //设置音乐进度 public void setProgress(int progress){ Intent intent=new Intent("com.huwei.sweetmusicplayer.services.LocalMusicService"); intent.putExtra("progress", progress); intent.putExtra("op", MusicState.PROGRESS_CHANGE.ordinal()); context.startService(intent); } //随机得到一首歌 public int getRandom_song(){ int random=new Random().nextInt(nowPlayingListView.getAdapter().getCount()); setNowplaying_index(random); return nowplaying_index ; } public List<Song> getSongLists() { return songLists; } public int getNowplaying_index() { return nowplaying_index; } public void setNowplaying_index(int i) { int count=nowPlayingListView.getCount(); nowplaying_index=(i+count)%count; //通知ListView控件刷新 BaseAdapter adapter=(BaseAdapter) nowPlayingListView.getAdapter(); adapter.notifyDataSetChanged(); //通知bottomActionBar更新 Intent intent=new Intent(BOTTOMACTIONBAR_UPDATE); context.sendBroadcast(intent); //通知PlaySong界面更新 Intent intent2=new Intent(PlayingFragment.PLAYSONG_UPDATE); context.sendBroadcast(intent2); } public ListView getNowPlayingListView() { return nowPlayingListView; } public void setNowPlayingListView(ListView nowPlayingListView) { this.nowPlayingListView = nowPlayingListView; } public Song getNowPlayingSong(){ return (Song) nowPlayingListView.getAdapter().getItem(nowplaying_index); } //歌词界面操作状态 public static class OperateState{ public static String READLRC_SUCCESS="READLRC_SUCCESS"; public static String READLRC_LISTNULL="READLRC_LISTNULL"; public static String READLRC_ONLINE="READLRC_ONLINE"; public static String READLRCFILE_FAIL="READLRCFILE_FAIL"; public static String READLRCONLINE_FAIL="READLRCONLINE_FAIL"; } public Song getSongByIndex(int index){ return (Song) nowPlayingListView.getAdapter().getItem(index); } } 本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5265129.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

iOS开发-CGAffineTransformMakeRotation改变了中心解决的方法

坑爹的。 为了这个问题折腾了2个小时。 恼.. 今天在写一个时钟demo的时候, 时针的旋转用到了CGAffineTransformMakeRotation, 按理说. 图像的旋转是以图像本身的中心(center)为锚点的, 也就是在旋转过程中, 它的中心是固定的。 就和我们时针的效果一样。 比方我以下的时针, 分针, 秒针旋转的代码: NSDate *today = [NSDate date]; NSCalendar *calendar = [NSCalendar currentCalendar]; unsigned flags = NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit; NSDateComponents *todayComponents = [calendar components:flags fromDate:today]; int hour = [todayComponents hour]; int min = [todayComponents minute]; int sec = [todayComponents second]; float fineHour = (hour % 12) + min /60.0; hourHand.transform = CGAffineTransformMakeRotation(M_PI * 2 * fineHour / 12.0); minuteHand.transform = CGAffineTransformMakeRotation(M_PI * 2 * min / 60.0); secondHand.transform = CGAffineTransformMakeRotation(M_PI * 2 * sec / 60.0); 代码是没问题的。 可是, 执行起来的时候, 发现旋转过程中中心变了。 出现了明显的位移... 折腾了半天。 原来是自己主动布局搞的鬼.. 蛋疼。 解决的办法: 1. 关掉自己主动布局。 2.你应当设置center的约束,而不是边缘位置的约束。 攻克了。 睡觉了.. 本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5239612.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

ios开发之分享一个特效 Cube

新版 iOS5 通知中心 在更新通知的时候会在 屏幕上方 用这个类似立方体滚动的效果 作为更新动画。 这个效果原有一个私有方法可以调出来。 这里提供一个 非私有的基于 QuartzCore 和CoreAnimation 的实现方法 关键词有以上 QuartzCore,CoreAnimation,CATransform3D,interpolation,Block 要求 sdk4.0以上。源码工程见附件。 里面包含了一个简单的实现 但是没有很好的调用封装 ,使用的同学可以根据具体需要来简单封装一下。我发的目的主要在分享原理上。 通过Block的帮助可以很简单的构建一个 CAKeyFrameAnimation。并且可以将动画的回调 闭包的写出来,实在是大爱block。 实现原理其实较简单将要旋转的两个面按照 立方体的两个面进行layout 计算 立方体旋转时发生的轨迹改变 CATransform3D 即可 CubeEffect.zip 本文转自qianqianlianmeng博客园博客,原文链接:http://www.cnblogs.com/aimeng/archive/2012/02/06/2339653.html,如需转载请自行联系原作者

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册