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

来源:互联网 发布:淘宝女鞋品牌排行榜 编辑:程序博客网 时间: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
原创粉丝点击