系列文章

前言

上一节我们讨论了一个音乐播放器应该具有的功能,当我们实现了这些功能后,就该考虑如何扩展这些功能了。本节我们要讲的就是专辑封面的美化,看了市面上的播放器,最喜欢云音乐的黑胶唱片专辑封面,下面我们就来模仿一下。

思路分析

让我们来分析下这个View,这里有5个地方需要绘制

1.最上面的一条虚线,这个简单。

2.黑胶外侧的半透明边框,这个不需要旋转也比较简单。

3.黑胶

4.专辑封面

为了能使黑胶和封面能完美融合,因此我们需要固定它们的尺寸,这里设置黑胶直径为屏幕的3/4,封面直径为屏幕的一半,即封面直径为黑胶直径的2/3。

5.指针,这个在暂停时会有一个旋转动画,因此注意选择好旋转圆心和半径坐标,为了使指针能够放在黑胶正中,我们需要固定指针的高度为黑胶直径的一半。

代码实现

声明变量

// 图片起始坐标

private Point mDiscPoint = new Point();

private Point mCoverPoint = new Point();

private Point mNeedlePoint = new Point();

// 旋转中心坐标

private Point mDiscCenterPoint = new Point();

private Point mCoverCenterPoint = new Point();

private Point mNeedleCenterPoint = new Point();

复制代码

确定图片起始坐标与旋转中心坐标

@Override

protected void onLayout(boolean changed, int left, int top, int right, int bottom) {

super.onLayout(changed, left, top, right, bottom);

initSize();

}

/**

* 确定图片起始坐标与旋转中心坐标

*/

private void initSize() {

int discOffsetY = mNeedleBitmap.getHeight() / 2;

mDiscPoint.x = (getWidth() - mDiscBitmap.getWidth()) / 2;

mDiscPoint.y = discOffsetY;

mCoverPoint.x = (getWidth() - mCoverBitmap.getWidth()) / 2;

mCoverPoint.y = discOffsetY + (mDiscBitmap.getHeight() - mCoverBitmap.getHeight()) / 2;

mNeedlePoint.x = getWidth() / 2 - mNeedleBitmap.getWidth() / 6;

mNeedlePoint.y = -mNeedleBitmap.getWidth() / 6;

mDiscCenterPoint.x = getWidth() / 2;

mDiscCenterPoint.y = mDiscBitmap.getHeight() / 2 + discOffsetY;

mCoverCenterPoint.x = mDiscCenterPoint.x;

mCoverCenterPoint.y = mDiscCenterPoint.y;

mNeedleCenterPoint.x = mDiscCenterPoint.x;

mNeedleCenterPoint.y = 0;

}

复制代码

每次绘制都会进行重复计算,为了优化性能,我们把计算的过程放在onLayout中。

绘制过程

@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);

}

复制代码

到这里我们已经可以实现静态的黑胶唱片专辑封面了,大家根据注释肯定能看懂。

接下来需要添加动画,这里使用匀速的属性动画。

旋转动画

private Runnable mRotationRunnable = new Runnable() {

@Override

public void run() {

if (isPlaying) {

mDiscRotation += DISC_ROTATION_INCREASE;

if (mDiscRotation >= 360) {

mDiscRotation = 0;

}

invalidate();

}

mHandler.postDelayed(this, TIME_UPDATE);

}

};

复制代码

指针动画

mPlayAnimator = ValueAnimator.ofFloat(NEEDLE_ROTATION_PAUSE, NEEDLE_ROTATION_PLAY);

mPlayAnimator.setDuration(300);

mPlayAnimator.addUpdateListener(this);

mPauseAnimator = ValueAnimator.ofFloat(NEEDLE_ROTATION_PLAY, NEEDLE_ROTATION_PAUSE);

mPauseAnimator.setDuration(300);

mPauseAnimator.addUpdateListener(this);

@Override

public void onAnimationUpdate(ValueAnimator animation) {

mNeedleRotation = (float) animation.getAnimatedValue();

invalidate();

}

复制代码

播放控制

public void start() {

if (isPlaying) {

return;

}

isPlaying = true;

mHandler.post(mRotationRunnable);

mPlayAnimator.start();

}

public void pause() {

if (!isPlaying) {

return;

}

isPlaying = false;

mHandler.removeCallbacks(mRotationRunnable);

mPauseAnimator.start();

}

复制代码

播放时启动旋转动画,播放指针动画,暂停时暂停动画,播放指针动画。

OK,让我们来看下效果

基本上和云音乐一样的效果,而且可以自适应屏幕大小,只是看不出来动画效果。

大家可以运行源码或下载波尼音乐查看详细效果。

迁移自我的简书

2016.06.08

android高仿音乐播放器,Android开源音乐播放器之高仿云音乐黑胶唱片相关推荐

  1. android 带记忆功能的播放器源码,【全开源可二开】带后台管理面板的在线音乐播放器Android应用APP源码...

    这是一款带后台管理面板的在线音乐播放器Android应用APP源码,可让您更快地构建在线和离线android音频播放器,代码全开源适合二次开发.该源码自带2个紫色和橙色主题(允许您添加更多主题),多语 ...

  2. MusicPlayer音乐播放器Android

    MusicPlayer音乐播放器Android [音频采集] 你可以使用手机进行现场录音,实现步骤如下: 第一步:在功能清单文件AndroidManifest.xml中添加音频刻录权限: <us ...

  3. Android开发本地及网络Mp3音乐播放器(十二)创建NetMusicListAdapter、SearchResult显示网络音乐列表

    转载请注明出处:http://blog.csdn.net/iwanghang/article/details/51290181 觉得博文有用,请点赞,请留言,请关注,谢谢!~ 实现功能: 实现NetM ...

  4. android4以下的音乐播放器,Android平台四大音乐播放器对比评测

    二.歌曲添加,谁便利 二.歌曲添加,谁便利 对于手机音乐播放器来说,要播放音乐,首先需要添加歌曲.因而添加歌曲的便利性,自然是考评这类软件的一个方面. 1. 天天动听有扫描全部歌曲和浏览文件夹两种添加 ...

  5. poweramp android,Poweramp - 安卓上的王牌音乐播放器 - Android 应用 - 【最美应用】

    智能手机上一个永恒不变的消遣方式就是听音乐,这也导致了 MP3 伴随智能手机的普及而逐渐消失.对于形形色色的安卓手机来说,系统自带的音乐播放器基本就是一个棒槌.如果找到一款好用的安卓音乐播放器对你来说 ...

  6. 视频教程-FFmpeg打造Android万能音频播放器-Android

    FFmpeg打造Android万能音频播放器 从事Android移动端开发多年.主导开发过直播.电商.聊天等各种类型APP和游戏SDK:熟悉Android音视频开发.底层NDK开发等:有开源项目:ht ...

  7. 旧android手机当播放器,android手机立即变无线移动终端播放器 Qloud media 详细教程...

    Ubuntu终端播放器-mocp    作为Linux企业应用管理和维护,常需要putty远程连接维护服务器.Python开发. private void play(long position)// ...

  8. 索尼播放器Android系统,好物推荐 | 索尼ZX505:Android系统的播放器香不香?

    大家好!这里是太平洋电脑网与腾讯数码联合推出的<好物推荐>栏目.本次为大家推荐的好物为索尼ZX505.与以往的索尼播放器大不同的地方在于,这款新品使用了Android系统,之前很多播放器因 ...

  9. android html5播放器,android Html5播放器混音解决方案

    背景 当一个用户正在听音乐而另一个应用需要通知用户一些重要的事情时,用户可能由于音乐声音大而不能听的通知.从Android2.2开始,平台为应用提供了一个协商它们如何使用设备音频输出的途径,这个机制叫 ...

  10. android智能语音播放器,android IM模块-语音-播放篇1

    MediaPlayer MediaPlayer是我们经常用的一个音频播放类 创建的方式有很多种,可以直接new一个,也可以直接调用MediaPlayer.creat(xxx) 常用API有如下 voi ...

最新文章

  1. python游戏中调整箭头下落速度_入门 | 三行Python代码,让数据预处理速度提高2到6倍...
  2. c#中反射技术在Unity中的运用
  3. 云服务器 ECS Linux 系统下使用 dig 命令查询域名解析
  4. SAP CRM代码对数据库表COMM_PRODUCT的读写访问情况明细统计
  5. Http方法:Get请求与Post请求的区别
  6. Unity自带网络功能——NetworkView组件、Serialize、RPC
  7. c 语言 宏 可变 参数,利用C可变参数和宏定义来实现自己的日志系统
  8. Jeasyframe 开源框架 V1.6 发布
  9. 力扣——盛最多水的容器
  10. mysqlbinlog初识
  11. Qt Style Sheets Reference Qt css 样式属性列表[官版]
  12. CPU和GPU的区别是什么?
  13. asp.net 各种小窍门
  14. 【题解】UVA11584 Partitioning by Palindromes
  15. 安防人眼里的“区块链玩法遛狗也能赚钱”
  16. PPT还原苹果12手机的官方海报
  17. 2020云米5G战略新品发布,超越时代探索“互联未来•互动家”
  18. 从LiveJournal后台发展看大规模网站性能优化方法[zz]
  19. MySQL中添加唯一约束和联合唯一约束
  20. 博客介绍——warrent(博文末尾有彩蛋)

热门文章

  1. 如何打造合作型团队——阿里内贸团队敏捷实践
  2. SEO上下线营销思维:二者兼备实现“落地”
  3. php 自定义字段erp,ERP自定义单据界面、自定义字段
  4. 日化用品行业数智化B2B系统简化分销流程,提升日化用品企业供应链竞争力
  5. 采药(洛谷P1048)
  6. 纯干货!live2d动画制作简述以及踩坑
  7. 记录一次 在linux 搭建的mysql迁移到docker容器中
  8. 苹果三代耳机_airpods三代上市时间 苹果第三代蓝牙耳机什么时候上市
  9. C++中地递增递减运算符和指针
  10. swf web 播放