一、前言——

大家一定在百度音乐上在线听过歌,有没有注意到那个旋转唱片——

就上面那个,当音乐在播放的时候,那个光碟轮子在转,就想旋转木马一般。感觉好好玩啊。

碰巧想起前阵子做音乐播放器,哎,那这个也能够做在手机的音乐播放器上,这样就取代了进度条了。

一想到,就兴奋,于是,首先画圆形,然后放置背景图片,然后使用动画旋转。当音乐播放时,同一时候

開始播放圆形图片的动画,当音乐暂停时,暂停旋转;当音乐停止播放时,就停止动画,图片回到原点。

二、效果——

三、源代码——

(1)MainActivity

  1. <span style="font-size:18px;">public class MainActivity extends Activity {
  2. MediaPlayer m1;
  3. ImageView infoOperatingIV;
  4.  
  5. @Override
  6. protected void onCreate(Bundle savedInstanceState) {
  7. super.onCreate(savedInstanceState);
  8. setContentView(R.layout.activity_main);
  9. infoOperatingIV = (ImageView) findViewById(R.id.infoOperating);
  10.  
  11. Button play = (Button) findViewById(R.id.play);
  12. Button stop = (Button) findViewById(R.id.stop);
  13.  
  14. play.setOnClickListener(new OnClickListener() {
  15. @Override
  16. public void onClick(View v) {
  17. playMusic();
  18. }
  19. });
  20.  
  21. stop.setOnClickListener(new OnClickListener() {
  22. @Override
  23. public void onClick(View v) {
  24. stopMusic();
  25. }
  26. });
  27.  
  28. }
  29.  
  30. private void playMusic() {
  31. m1 = MediaPlayer.create(this, R.raw.quiet);
  32. m1.start();
  33.  
  34. Animation operatingAnim = AnimationUtils.loadAnimation(this, R.anim.tip);
  35. LinearInterpolator lin = new LinearInterpolator();
  36. operatingAnim.setInterpolator(lin);
  37. if (operatingAnim != null) {
  38. infoOperatingIV.startAnimation(operatingAnim);
  39. }
  40.  
  41. m1.setOnCompletionListener(new OnCompletionListener() {
  42. @Override
  43. public void onCompletion(MediaPlayer mp) {
  44. mp.stop();
  45. infoOperatingIV.clearAnimation();
  46. }
  47. });
  48. }
  49.  
  50. private void stopMusic() {
  51. m1.stop();
  52. infoOperatingIV.clearAnimation();
  53. }
  54.  
  55. }</span><span style="font-size: 16pt;">
  56. </span>

(2)画圆的控件,这部分代码參考了网友的。

  1. <span style="font-size:18px;">public class RoundImageView extends ImageView {
  2. private int mBorderThickness = 0;
  3. private Context mContext;
  4. private int defaultColor = 0xFFFFFFFF;
  5. // 假设仅仅有当中一个有值,则仅仅画一个圆形边框
  6. private int mBorderOutsideColor = 0;
  7. private int mBorderInsideColor = 0;
  8. // 控件默认长、宽
  9. private int defaultWidth = 0;
  10. private int defaultHeight = 0;
  11.  
  12. public RoundImageView(Context context) {
  13. super(context);
  14. mContext = context;
  15. }
  16.  
  17. public RoundImageView(Context context, AttributeSet attrs) {
  18. super(context, attrs);
  19. mContext = context;
  20. setCustomAttributes(attrs);
  21. }
  22.  
  23. public RoundImageView(Context context, AttributeSet attrs, int defStyle) {
  24. super(context, attrs, defStyle);
  25. mContext = context;
  26. setCustomAttributes(attrs);
  27. }
  28.  
  29. private void setCustomAttributes(AttributeSet attrs) {
  30. TypedArray a = mContext.obtainStyledAttributes(attrs, R.styleable.roundedimageview);
  31. mBorderThickness = a.getDimensionPixelSize(R.styleable.roundedimageview_border_thickness, 0);
  32. mBorderOutsideColor = a.getColor(R.styleable.roundedimageview_border_outside_color, defaultColor);
  33. mBorderInsideColor = a.getColor(R.styleable.roundedimageview_border_inside_color, defaultColor);
  34. }
  35.  
  36. @Override
  37. protected void onDraw(Canvas canvas) {
  38. Drawable drawable = getDrawable();
  39. if (drawable == null) {
  40. return;
  41. }
  42.  
  43. if (getWidth() == 0 || getHeight() == 0) {
  44. return;
  45. }
  46. this.measure(0, 0);
  47. if (drawable.getClass() == NinePatchDrawable.class)
  48. return;
  49. Bitmap b = ((BitmapDrawable) drawable).getBitmap();
  50. Bitmap bitmap = b.copy(Bitmap.Config.ARGB_8888, true);
  51. if (defaultWidth == 0) {
  52. defaultWidth = getWidth();
  53.  
  54. }
  55. if (defaultHeight == 0) {
  56. defaultHeight = getHeight();
  57. }
  58. // 保证又一次读取图片后不会由于图片大小而改变控件宽、高的大小(针对宽、高为wrap_content布局的imageview,但会导致margin无效)
  59. // if (defaultWidth != 0 && defaultHeight != 0) {
  60. // LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
  61. // defaultWidth, defaultHeight);
  62. // setLayoutParams(params);
  63. // }
  64. int radius = 0;
  65. if (mBorderInsideColor != defaultColor && mBorderOutsideColor != defaultColor) {// 定义画两个边框,分别为外圆边框和内圆边框
  66. radius = (defaultWidth < defaultHeight ? defaultWidth : defaultHeight) / 2 - 2 * mBorderThickness;
  67. // 画内圆
  68. drawCircleBorder(canvas, radius + mBorderThickness / 2, mBorderInsideColor);
  69. // 画外圆
  70. drawCircleBorder(canvas, radius + mBorderThickness + mBorderThickness / 2, mBorderOutsideColor);
  71. } else if (mBorderInsideColor != defaultColor && mBorderOutsideColor == defaultColor) {// 定义画一个边框
  72. radius = (defaultWidth < defaultHeight ? defaultWidth : defaultHeight) / 2 - mBorderThickness;
  73. drawCircleBorder(canvas, radius + mBorderThickness / 2, mBorderInsideColor);
  74. } else if (mBorderInsideColor == defaultColor && mBorderOutsideColor != defaultColor) {// 定义画一个边框
  75. radius = (defaultWidth < defaultHeight ? defaultWidth : defaultHeight) / 2 - mBorderThickness;
  76. drawCircleBorder(canvas, radius + mBorderThickness / 2, mBorderOutsideColor);
  77. } else {// 没有边框
  78. radius = (defaultWidth < defaultHeight ? defaultWidth : defaultHeight) / 2;
  79. }
  80. Bitmap roundBitmap = getCroppedRoundBitmap(bitmap, radius);
  81. canvas.drawBitmap(roundBitmap, defaultWidth / 2 - radius, defaultHeight / 2 - radius, null);
  82. }
  83.  
  84. /**
  85. * 获取裁剪后的圆形图片
  86. *
  87. * @param radius
  88. * 半径
  89. */
  90. public Bitmap getCroppedRoundBitmap(Bitmap bmp, int radius) {
  91. Bitmap scaledSrcBmp;
  92. int diameter = radius * 2;
  93.  
  94. // 为了防止宽高不相等,造成圆形图片变形,因此截取长方形中处于中间位置最大的正方形图片
  95. int bmpWidth = bmp.getWidth();
  96. int bmpHeight = bmp.getHeight();
  97. int squareWidth = 0, squareHeight = 0;
  98. int x = 0, y = 0;
  99. Bitmap squareBitmap;
  100. if (bmpHeight > bmpWidth) {// 高大于宽
  101. squareWidth = squareHeight = bmpWidth;
  102. x = 0;
  103. y = (bmpHeight - bmpWidth) / 2;
  104. // 截取正方形图片
  105. squareBitmap = Bitmap.createBitmap(bmp, x, y, squareWidth, squareHeight);
  106. } else if (bmpHeight < bmpWidth) {// 宽大于高
  107. squareWidth = squareHeight = bmpHeight;
  108. x = (bmpWidth - bmpHeight) / 2;
  109. y = 0;
  110. squareBitmap = Bitmap.createBitmap(bmp, x, y, squareWidth, squareHeight);
  111. } else {
  112. squareBitmap = bmp;
  113. }
  114.  
  115. if (squareBitmap.getWidth() != diameter || squareBitmap.getHeight() != diameter) {
  116. scaledSrcBmp = Bitmap.createScaledBitmap(squareBitmap, diameter, diameter, true);
  117.  
  118. } else {
  119. scaledSrcBmp = squareBitmap;
  120. }
  121. Bitmap output = Bitmap.createBitmap(scaledSrcBmp.getWidth(), scaledSrcBmp.getHeight(), Config.ARGB_8888);
  122. Canvas canvas = new Canvas(output);
  123.  
  124. Paint paint = new Paint();
  125. Rect rect = new Rect(0, 0, scaledSrcBmp.getWidth(), scaledSrcBmp.getHeight());
  126.  
  127. paint.setAntiAlias(true);
  128. paint.setFilterBitmap(true);
  129. paint.setDither(true);
  130. canvas.drawARGB(0, 0, 0, 0);
  131. canvas.drawCircle(scaledSrcBmp.getWidth() / 2, scaledSrcBmp.getHeight() / 2, scaledSrcBmp.getWidth() / 2, paint);
  132. paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
  133. canvas.drawBitmap(scaledSrcBmp, rect, rect, paint);
  134.  
  135. bmp = null;
  136. squareBitmap = null;
  137. scaledSrcBmp = null;
  138. return output;
  139. }
  140.  
  141. /**
  142. * 边缘画圆
  143. */
  144. private void drawCircleBorder(Canvas canvas, int radius, int color) {
  145. Paint paint = new Paint();
  146. /* 去锯齿 */
  147. paint.setAntiAlias(true);
  148. paint.setFilterBitmap(true);
  149. paint.setDither(true);
  150. paint.setColor(color);
  151. /* 设置paint的 style 为STROKE:空心 */
  152. paint.setStyle(Paint.Style.STROKE);
  153. /* 设置paint的外框宽度 */
  154. paint.setStrokeWidth(mBorderThickness);
  155. canvas.drawCircle(defaultWidth / 2, defaultHeight / 2, radius, paint);
  156. }
  157.  
  158. }</span><span style="font-size: 16pt;">
  159. </span>

Android笔记 之 旋转木马的音乐效果的更多相关文章

  1. Android应用--简、美音乐播放器增加音量控制

    Android应用--简.美音乐播放器增加音量控制 2013年6月26日简.美音乐播放器继续完善中.. 题外话:上一篇博客是在6月11号发的,那篇博客似乎有点问题,可能是因为代码结构有点乱的原因,很难 ...

  2. Android -- 常见控件的小效果

    1,EditText控件 ① 修改光标颜色 自定义drawable 创建cursor.xml文件 <?xml version="1.0" encoding="utf ...

  3. Android笔记——Android中数据的存储方式(二)

    我们在实际开发中,有的时候需要储存或者备份比较复杂的数据.这些数据的特点是,内容多.结构大,比如短信备份等.我们知道SharedPreferences和Files(文本文件)储存这种数据会非常的没有效 ...

  4. Android命令行播放MP3音乐

    /*************************************************************************** * Android命令行播放MP3音乐 * 说 ...

  5. Android笔记:触摸事件的分析与总结----TouchEvent处理机制

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://glblong.blog.51cto.com/3058613/1559320   ...

  6. 制作Android Demo GIF:程序演示效果GIF图录制

    [转] 制作Android Demo GIF:程序演示效果GIF图录制   在平时写博客或者分享自己写的程序效果的时候经常需要做成GIF图,以下就是介绍几种常用的GIF录制方法: 一.录制工具 1.( ...

  7. Android应用--简、美音乐播放器获取专辑图片(自定义列表适配器)

    Android应用--简.美音乐播放器获取专辑图片(自定义列表适配器) 2013年7月3日简.美音乐播放器开发 第二阶段已增加功能: 1.歌词滚动显示 2.来电监听 3.音量控制 4.左右滑动切换歌词 ...

  8. Android状态栏透明(沉浸式效果)

    Android状态栏透明(沉浸式效果) 默认效果 沉浸式效果 方式一 源码 下载地址(Android Studio工程):http://download.csdn.net/detail/q487880 ...

  9. 实现图片旋转木马3D浏览效果

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

随机推荐

  1. html5载入JS引用

    直接上代码 w文件 <?xml version="1.0" encoding="UTF-8"? > <div xmlns="http ...

  2. 无法解析该名称 outlook必须处于联机,控制面板删除账户

    无法解析该名称 outlook必须处于联机,控制面板删除账户

  3. codeforces 459D - Pashmak and Parmida&#39;s problem【离散化+处理+逆序对】

    题目:codeforces 459D - Pashmak and Parmida's problem 题意:给出n个数ai.然后定义f(l, r, x) 为ak = x,且l<=k<=r, ...

  4. windows phone (27) 基础Button

    原文:windows phone (27) 基础Button Button 在wp7中因其灵活性经常会用到,我们在ContentPanel中直接添加Button,button默认状态下是把整个grid ...

  5. REDGATE SQLPROMPT 6.0新功能

    原文:REDGATE SQLPROMPT 6.0新功能 REDGATE SQLPROMPT 6.0新功能 下载地址:http://files.cnblogs.com/lyhabc/SQLPrompt6 ...

  6. APUE读书笔记-第13章-守护进程

    第13章 守护进程 13.1 引言 *守护进程也称精灵进程(daemon)是生存期较长的一种进程.它们常常在系统自举时启动,仅在系统关闭时才终止.因为它们没有控制终端,所以说它们是在后台运行的.UNI ...

  7. android面试题 不单单为了面试也是一次非常好的学习

    以以下试题都是在网上找的总结出来的,谢谢大家的分享!希望,我们共同进步,找到自己梦想的公司: 1.android dvm 的进程和Linux的进程,应用程序的进程是否为同一个概念: 答:dvm是dal ...

  8. SQL Server 性能调优培训引言

    原文:SQL Server 性能调优培训引言 大家好,这是我在博客园写的第一篇博文,之所以要开这个博客,是我对MS SQL技术学习的一个兴趣记录. 作为计算机专业毕业的人,自己对技术的掌握总是觉得很肤 ...

  9. oracle错误之 ora-01017

    ora-01017 现象描述: scott用户和其它建立的用户,都登的上.但sys和system用户登录不上 方案一(试过,不行): 1,打开目录:F:\app\Administrator\produ ...

  10. Cocos2d-x Box2D物理引擎编译设置

    找到解决方案TestCpp工程.打开其属性=>C/C++ =>预处理器==>处理器定义. 参加"CC_ENABLE_BOX2D_INTEGRATION=1", 更 ...