高仿网易云音乐---之扫描本地歌曲

向右看齐 2022-07-24 04:08 264阅读 0赞

最近看到网易云音乐的UI还是挺漂亮的,功能也实用,整体效果还是挺fashion的,于是想花点业余时间高仿一下!虽然目前只完成部分模块,一有时间就会进行补充添加!
git地址:https://github.com/cmlbeliever/NeteaseImmitate

模块1:本地音乐

1、 对本地音乐进行扫描存档

2、获取本地音乐的各种信息,如歌名,歌手、时长等信息

3、实现后的UI
这里写图片描述

扫描歌曲实现方式

1、根据Android提供的Provider进行信息查询

2、进行全盘扫描,将每个文件夹下的音乐文件全都找出来,不过这种实现方式速度还是挺慢的,而且还要识别出具体的音乐格式,不能单纯的根据文件的后缀名来判断

鉴于实现方式的简便,项目中直接使用Android提供的Provider进行扫描,获取出所有注册了的音乐信息,代码量也少,很简便。等有时间了再研究下方案2的扫描方式。

需要注意的是扫描是耗时的操作,需要放到子线程上完成,否则容易造成页面卡顿严重的还可能会导致ANR。推荐使用RxJava实现带有线程切换业务!

UI模块

在扫描的时候,放大镜以自己为中心,半径为30,坐圆周运动

扫描完成后,显示打钩的图片即可

代码模块:

圆周运动实现,使用属性动画进行位置控制核心代码:

  1. animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
  2. @Override
  3. public void onAnimationUpdate(ValueAnimator animation) {
  4. float angle = (float) animation.getAnimatedValue();
  5. float translateX = (float) (radius * Math.cos(angle));
  6. float translateY = (float) (radius * Math.sin(angle));
  7. scanImageView.setTranslationX(translateX);
  8. scanImageView.setTranslationY(translateY);
  9. }
  10. });

: 歌曲扫描以及信息存储核心代码

  1. Observable.create(new Observable.OnSubscribe<Cursor>() {
  2. @Override
  3. public void call(Subscriber<? super Cursor> subscriber) {
  4. if (!subscriber.isUnsubscribed()) {
  5. try {
  6. Thread.sleep(5000);
  7. } catch (InterruptedException e) {
  8. e.printStackTrace();
  9. }
  10. Cursor cursor = context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
  11. subscriber.onNext(cursor);
  12. subscriber.onCompleted();
  13. }
  14. }
  15. }).map(new Func1<Cursor, List<Song>>() {
  16. @Override
  17. public List<Song> call(Cursor cursor) {
  18. List<Song> songs = new ArrayList<Song>();
  19. if (null != cursor && cursor.getCount() > 0) {
  20. // 扫描歌曲
  21. while (isRunning && cursor.moveToNext()) {
  22. int id = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID));
  23. String tilte = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
  24. String album = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM));
  25. String artist = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
  26. String url = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));
  27. int duration = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));
  28. Song song = new Song(id, tilte, album, artist, url, url, duration);
  29. songs.add(song);
  30. //插入db信息
  31. dbClient.replaceSong(song);
  32. //通知界面显示
  33. scanResultSubject.onNext(song.url);
  34. KLog.d(TAG, song);
  35. }
  36. cursor.close();
  37. }
  38. return songs;
  39. }
  40. }).subscribeOn(Schedulers.computation()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Subscriber<List<Song>>() {
  41. @Override
  42. public void onCompleted() {
  43. view.stopScanAnim();
  44. }
  45. @Override
  46. public void onError(Throwable e) {
  47. view.stopScanAnim();
  48. KLog.e(TAG, e);
  49. }
  50. @Override
  51. public void onNext(List<Song> songs) {
  52. //通知界面显示
  53. scanResultSubject.onNext(context.getResources().getString(R.string.local_scan_finish, songs.size()));
  54. }
  55. });

发表评论

表情:
评论列表 (有 0 条评论,264人围观)

还没有评论,来说两句吧...

相关阅读

    相关 仿音乐收藏的小动画

    > 最近在写一个新的项目,新项目中有一个收藏的功能,相信现在的很多app都有收藏和取消收藏的功能。单纯的收藏和取消收藏,如果只是使用setSelect或者setImageRes

    相关 轻松下载音乐中的歌曲

    最近快毕业了,想做一个视频记录一下三年的学习时光,背景音乐准备使用《祝你一路顺风》,找到网易云音乐中的这首曲子,也是原唱,非常满意,但是下载的时候需要安装软件,这就不开心啦,于