高仿网易云音乐---之扫描本地歌曲
来源:互联网 发布:淘宝女鞋品牌排行榜 编辑:程序博客网 时间:2024/06/10 12:48
最近看到网易云音乐的UI还是挺漂亮的,功能也实用,整体效果还是挺fashion的,于是想花点业余时间高仿一下!虽然目前只完成部分模块,一有时间就会进行补充添加!
git地址:https://github.com/cmlbeliever/NeteaseImmitate
- 模块1:本地音乐
- 1、 对本地音乐进行扫描存档
- 2、获取本地音乐的各种信息,如歌名,歌手、时长等信息
- 3、实现后的UI
- 扫描歌曲实现方式
- 1、根据Android提供的Provider进行信息查询
- 2、进行全盘扫描,将每个文件夹下的音乐文件全都找出来,不过这种实现方式速度还是挺慢的,而且还要识别出具体的音乐格式,不能单纯的根据文件的后缀名来判断
鉴于实现方式的简便,项目中直接使用Android提供的Provider进行扫描,获取出所有注册了的音乐信息,代码量也少,很简便。等有时间了再研究下方案2的扫描方式。
需要注意的是扫描是耗时的操作,需要放到子线程上完成,否则容易造成页面卡顿严重的还可能会导致ANR。推荐使用RxJava实现带有线程切换业务!
- UI模块
- 在扫描的时候,放大镜以自己为中心,半径为30,坐圆周运动
- 扫描完成后,显示打钩的图片即可
- 代码模块:
- 圆周运动实现,使用属性动画进行位置控制核心代码:
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { float angle = (float) animation.getAnimatedValue(); float translateX = (float) (radius * Math.cos(angle)); float translateY = (float) (radius * Math.sin(angle)); scanImageView.setTranslationX(translateX); scanImageView.setTranslationY(translateY); } });
: 歌曲扫描以及信息存储核心代码
Observable.create(new Observable.OnSubscribe<Cursor>() { @Override public void call(Subscriber<? super Cursor> subscriber) { if (!subscriber.isUnsubscribed()) { try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } Cursor cursor = context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER); subscriber.onNext(cursor); subscriber.onCompleted(); } } }).map(new Func1<Cursor, List<Song>>() { @Override public List<Song> call(Cursor cursor) { List<Song> songs = new ArrayList<Song>(); if (null != cursor && cursor.getCount() > 0) { // 扫描歌曲 while (isRunning && cursor.moveToNext()) { int id = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID)); String tilte = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE)); String album = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM)); String artist = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST)); String url = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA)); int duration = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION)); Song song = new Song(id, tilte, album, artist, url, url, duration); songs.add(song); //插入db信息 dbClient.replaceSong(song); //通知界面显示 scanResultSubject.onNext(song.url); KLog.d(TAG, song); } cursor.close(); } return songs; } }).subscribeOn(Schedulers.computation()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Subscriber<List<Song>>() { @Override public void onCompleted() { view.stopScanAnim(); } @Override public void onError(Throwable e) { view.stopScanAnim(); KLog.e(TAG, e); } @Override public void onNext(List<Song> songs) { //通知界面显示 scanResultSubject.onNext(context.getResources().getString(R.string.local_scan_finish, songs.size())); } });
0 0
- 高仿网易云音乐---之扫描本地歌曲
- 高仿网易云音乐一(可扫描本地音乐播放)
- 高仿网易云音乐二
- 仿网易云音乐
- Android高仿网易云音乐播放界面
- 网易云音乐个人收藏歌曲备注
- 仿网易云音乐播放音乐转盘
- React Native之DrawerLayoutAndroid仿网易云音乐滑动菜单
- React Native之DrawerLayoutAndroid仿网易云音乐滑动菜单
- 抓取网易云音乐歌曲热门评论生成词云
- 网易云音乐每日歌曲推荐的原理是什么?
- 网易云音乐歌曲带时间轴歌词的提取
- 高仿网易云音乐客户端的Home页面切换Tabhost-IT蓝豹
- 仿网易云音乐的播放进度条
- 仿网易云音乐分类菜单
- 仿网易云音乐部分UI实现
- iOS-仿网易云音乐控制器
- 仿网易云音乐的滑动效果
- 框架 day27 Struts2 入门(概述,基本xml配置,动态方法调用,Action类,ServletAPI访问,结果集)
- Java学习之接口
- 使用sdl接口实现的读写锁,非写优先
- 数据结构与算法练习-回溯、递归
- mac画图工具 OmniGraffle (一)从工具栏开始
- 高仿网易云音乐---之扫描本地歌曲
- Python opencv图像镜像翻转
- lsof - list open files
- jdbc查询oracle空字段数据时的表现
- JavaScript——1(基本语法,类型,变量与运算符,控制流程,函数)
- Linux chmod命令详解
- Linux环境上zlib1.2.8安装及配置
- MaterialDesign之Snackbar学习笔记
- 第十二周项目 1.3 实现复数类中的运算符重载