All Projects → wangchenyan → Ponymusic

wangchenyan / Ponymusic

Android online music player use okhttp&gson&material design

Programming Languages

java
68154 projects - #9 most used programming language

Projects that are alternatives of or similar to Ponymusic

Byte
A Music Player designed for elementary OS
Stars: ✭ 128 (-93.1%)
Mutual labels:  music-player
So Nice
Small Web interface to control iTunes, Spotify, Rdio, MPD, Rhythmbox, Amarok and XMMS2. ♫
Stars: ✭ 141 (-92.4%)
Mutual labels:  music-player
Vue Soundcloud
🎧 A SoundCloud client built with Vue and Nuxt
Stars: ✭ 141 (-92.4%)
Mutual labels:  music-player
Chucker
🔎 An HTTP inspector for Android & OkHTTP (like Charles but on device)
Stars: ✭ 2,169 (+16.93%)
Mutual labels:  okhttp
Electron Vue Music
基于 electron-vue 开发的音乐播放器,界面模仿QQ音乐,技术栈electron-vue+vue+vuex+vue-router+element- UI。欢迎star
Stars: ✭ 1,901 (+2.48%)
Mutual labels:  music-player
Vgmusicstudio
🎵 A program that lets you listen to the music from popular video game formats. 🎵
Stars: ✭ 142 (-92.35%)
Mutual labels:  music-player
Okhttp Okgo
OkGo - 3.0 震撼来袭,该库是基于 Http 协议,封装了 OkHttp 的网络请求框架,比 Retrofit 更简单易用,支持 RxJava,RxJava2,支持自定义缓存,支持批量断点下载管理和批量上传管理功能
Stars: ✭ 10,407 (+461.02%)
Mutual labels:  okhttp
Jellyamp
Desktop client for listening to music from a Jellyfin server
Stars: ✭ 146 (-92.13%)
Mutual labels:  music-player
Android Base Mvp
Android Base MVP Concept with RXJava, Dagger, Event Bus, Retrofit, Glide, OkHTTP
Stars: ✭ 141 (-92.4%)
Mutual labels:  okhttp
Android Cookie Store
Android InMemory and persistent Cookie Store for HttpURLConnection and OkHttp, with extensions to easily sync cookies in Android WebViews.
Stars: ✭ 144 (-92.24%)
Mutual labels:  okhttp
Lx Music Desktop
一个基于 electron 的音乐软件
Stars: ✭ 14,964 (+706.68%)
Mutual labels:  music-player
Pianobar
Console-based pandora.com player
Stars: ✭ 1,682 (-9.33%)
Mutual labels:  music-player
Okhttp Digest
a digest authenticator for okhttp
Stars: ✭ 141 (-92.4%)
Mutual labels:  okhttp
Discord Bot
A discord bot that can play music, moderate, log events and more
Stars: ✭ 127 (-93.15%)
Mutual labels:  music-player
Musicplayer
A minimal music player built on electron.
Stars: ✭ 145 (-92.18%)
Mutual labels:  music-player
Kingtv
📺 高仿全民直播(全民TV),项目采用 MVP + RXJava + Retrofit + OKHttp + Material Design + Dagger2 + Base + Glide + GreenDao构建。因为全民TV已经凉了,导致App已经连不上。所以本项目已暂停维护。仅供学习。 推荐MVPFrame: https://github.com/jenly1314/MVPFrame 和你值得拥有的MVVMFrame快速开发框架: https://github.com/jenly1314/MVVMFrame
Stars: ✭ 1,594 (-14.07%)
Mutual labels:  okhttp
Ylight Music
Awesome React PWA music streaming app built with Material UI using Youtube API's. Search, Play, Like & Download
Stars: ✭ 141 (-92.4%)
Mutual labels:  music-player
Orchid
very tiny music player
Stars: ✭ 150 (-91.91%)
Mutual labels:  music-player
Dagger2
Kotlin Dagger2 example project
Stars: ✭ 145 (-92.18%)
Mutual labels:  okhttp
Moemusic
一款基于萌否网站api的音乐管理软件
Stars: ✭ 143 (-92.29%)
Mutual labels:  music-player

波尼音乐

由于百度关闭了在线音乐 API 接口,所以本 APP 的在线音乐功能失效,目前还没找到替代方案,不是 bug,请大家不要诧异。

系列文章

前言

毕业设计做的项目,答辩完了,就共享出来。

简介

波尼音乐是一款开源Android在线音乐播放器。

  • 播放本地音乐与在线音乐
  • 在线音乐排行榜,如热歌榜、新歌榜等
  • 高仿云音乐的黑胶唱片专辑封面
  • 歌词显示,自动搜索歌词
  • 编辑歌曲信息
  • 夜间模式
  • 定时关闭

更新说明

v 1.3.0

  • 新增歌词支持上下拖动
  • 新增支持分屏模式
  • 新增本地歌曲支持按大小和时长过滤
  • 新增下载的歌曲文件自动添加专辑封面
  • 新增编辑歌曲信息
  • 新增5.0以上系统支持联动系统媒体中心,锁屏显示播放信息
  • 修复已知bug

v 1.2.3

  • 新增通知栏播放控制
  • 修复魅族手机扫描不到音乐的问题
  • 修复已知bug

v 1.2.0

  • 修复在线音乐无法加载的问题
  • 修复弱网时播放网络歌曲导致ANR的问题
  • 修复每日启动图片无法更新的问题
  • 下载在线歌曲可以显示专辑封面了
  • 修复已知bug

v 1.1.0

  • 支持 Android 6.0 运行时权限
  • 修复已知bug

v 1.0.0

  • First Release

下载地址

V1.3.1

https://github.com/wangchenyan/ponymusic/releases/download/1.3.1/ponymusic-1.3.1.apk

TODO

  • 在线音乐可以免下载加入我的音乐列表
  • 在线音乐自动缓存
  • 编辑音乐信息

项目

公开API

开源技术

关键代码

黑胶唱片专辑封面绘制流程

@Override
protected void onDraw(Canvas canvas) {
    // 1.绘制顶部虚线
    mTopLine.setBounds(0, 0, getWidth(), mTopLineHeight);
    mTopLine.draw(canvas);
    // 2.绘制黑胶唱片外侧半透明边框
    mCoverBorder.setBounds(mDiscPoint.x - mCoverBorderWidth, mDiscPoint.y - mCoverBorderWidth,
            mDiscPoint.x + mDiscBitmap.getWidth() + mCoverBorderWidth, mDiscPoint.y +
                    mDiscBitmap.getHeight() + mCoverBorderWidth);
    mCoverBorder.draw(canvas);
    // 3.绘制黑胶
    // 设置旋转中心和旋转角度,setRotate和preTranslate顺序很重要
    mDiscMatrix.setRotate(mDiscRotation, mDiscCenterPoint.x, mDiscCenterPoint.y);
    // 设置图片起始坐标
    mDiscMatrix.preTranslate(mDiscPoint.x, mDiscPoint.y);
    canvas.drawBitmap(mDiscBitmap, mDiscMatrix, null);
    // 4.绘制封面
    mCoverMatrix.setRotate(mDiscRotation, mCoverCenterPoint.x, mCoverCenterPoint.y);
    mCoverMatrix.preTranslate(mCoverPoint.x, mCoverPoint.y);
    canvas.drawBitmap(mCoverBitmap, mCoverMatrix, null);
    // 5.绘制指针
    mNeedleMatrix.setRotate(mNeedleRotation, mNeedleCenterPoint.x, mNeedleCenterPoint.y);
    mNeedleMatrix.preTranslate(mNeedlePoint.x, mNeedlePoint.y);
    canvas.drawBitmap(mNeedleBitmap, mNeedleMatrix, null);
}

歌词绘制流程

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    // 中心Y坐标
    float centerY = getHeight() / 2 + mTextSize / 2 + mAnimOffset;

    // 无歌词文件
    if (!hasLrc()) {
        float centerX = (getWidth() - mCurrentPaint.measureText(label)) / 2;
        canvas.drawText(label, centerX, centerY, mCurrentPaint);
        return;
    }

    // 画当前行
    String currStr = mLrcTexts.get(mCurrentLine);
    float currX = (getWidth() - mCurrentPaint.measureText(currStr)) / 2;
    canvas.drawText(currStr, currX, centerY, mCurrentPaint);

    // 画当前行上面的
    for (int i = mCurrentLine - 1; i >= 0; i--) {
        String upStr = mLrcTexts.get(i);
        float upX = (getWidth() - mNormalPaint.measureText(upStr)) / 2;
        float upY = centerY - (mTextSize + mDividerHeight) * (mCurrentLine - i);
        // 超出屏幕停止绘制
        if (upY - mTextSize < 0) {
            break;
        }
        canvas.drawText(upStr, upX, upY, mNormalPaint);
    }

    // 画当前行下面的
    for (int i = mCurrentLine + 1; i < mLrcTimes.size(); i++) {
        String downStr = mLrcTexts.get(i);
        float downX = (getWidth() - mNormalPaint.measureText(downStr)) / 2;
        float downY = centerY + (mTextSize + mDividerHeight) * (i - mCurrentLine);
        // 超出屏幕停止绘制
        if (downY > getHeight()) {
            break;
        }
        canvas.drawText(downStr, downX, downY, mNormalPaint);
    }
}

截图

关于作者

掘金:https://juejin.im/user/2313028193754168
微博:https://weibo.com/wangchenyan1993

License

Copyright 2016 wangchenyan

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].