zoukankan      html  css  js  c++  java
  • Android笔记 之 旋转木马的音乐效果

    一、前言——

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


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

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

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

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

     

    二、效果——


     

    三、源代码——

    (1)MainActivity   

         

    <span style="font-size:18px;">public class MainActivity extends Activity {
    	MediaPlayer m1;
    	ImageView infoOperatingIV;
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		infoOperatingIV = (ImageView) findViewById(R.id.infoOperating);
    
    		Button play = (Button) findViewById(R.id.play);
    		Button stop = (Button) findViewById(R.id.stop);
    
    		play.setOnClickListener(new OnClickListener() {
    			@Override
    			public void onClick(View v) {
    				playMusic();
    			}
    		});
    
    		stop.setOnClickListener(new OnClickListener() {
    			@Override
    			public void onClick(View v) {
    				stopMusic();
    			}
    		});
    
    	}
    
    	private void playMusic() {
    		m1 = MediaPlayer.create(this, R.raw.quiet);
    		m1.start();
    
    		Animation operatingAnim = AnimationUtils.loadAnimation(this, R.anim.tip);
    		LinearInterpolator lin = new LinearInterpolator();
    		operatingAnim.setInterpolator(lin);
    		if (operatingAnim != null) {
    			infoOperatingIV.startAnimation(operatingAnim);
    		}
    
    		m1.setOnCompletionListener(new OnCompletionListener() {
    			@Override
    			public void onCompletion(MediaPlayer mp) {
    				mp.stop();
    				infoOperatingIV.clearAnimation();
    			}
    		});
    	}
    
    	private void stopMusic() {
    		m1.stop();
    		infoOperatingIV.clearAnimation();
    	}
    
    }</span><span style="font-size: 16pt;">
    </span>

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

    <span style="font-size:18px;">public class RoundImageView extends ImageView {
    	private int mBorderThickness = 0;
    	private Context mContext;
    	private int defaultColor = 0xFFFFFFFF;
    	// 假设仅仅有当中一个有值,则仅仅画一个圆形边框
    	private int mBorderOutsideColor = 0;
    	private int mBorderInsideColor = 0;
    	// 控件默认长、宽
    	private int defaultWidth = 0;
    	private int defaultHeight = 0;
    
    	public RoundImageView(Context context) {
    		super(context);
    		mContext = context;
    	}
    
    	public RoundImageView(Context context, AttributeSet attrs) {
    		super(context, attrs);
    		mContext = context;
    		setCustomAttributes(attrs);
    	}
    
    	public RoundImageView(Context context, AttributeSet attrs, int defStyle) {
    		super(context, attrs, defStyle);
    		mContext = context;
    		setCustomAttributes(attrs);
    	}
    
    	private void setCustomAttributes(AttributeSet attrs) {
    		TypedArray a = mContext.obtainStyledAttributes(attrs, R.styleable.roundedimageview);
    		mBorderThickness = a.getDimensionPixelSize(R.styleable.roundedimageview_border_thickness, 0);
    		mBorderOutsideColor = a.getColor(R.styleable.roundedimageview_border_outside_color, defaultColor);
    		mBorderInsideColor = a.getColor(R.styleable.roundedimageview_border_inside_color, defaultColor);
    	}
    
    	@Override
    	protected void onDraw(Canvas canvas) {
    		Drawable drawable = getDrawable();
    		if (drawable == null) {
    			return;
    		}
    
    		if (getWidth() == 0 || getHeight() == 0) {
    			return;
    		}
    		this.measure(0, 0);
    		if (drawable.getClass() == NinePatchDrawable.class)
    			return;
    		Bitmap b = ((BitmapDrawable) drawable).getBitmap();
    		Bitmap bitmap = b.copy(Bitmap.Config.ARGB_8888, true);
    		if (defaultWidth == 0) {
    			defaultWidth = getWidth();
    
    		}
    		if (defaultHeight == 0) {
    			defaultHeight = getHeight();
    		}
    		// 保证又一次读取图片后不会由于图片大小而改变控件宽、高的大小(针对宽、高为wrap_content布局的imageview,但会导致margin无效)
    		// if (defaultWidth != 0 && defaultHeight != 0) {
    		// LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
    		// defaultWidth, defaultHeight);
    		// setLayoutParams(params);
    		// }
    		int radius = 0;
    		if (mBorderInsideColor != defaultColor && mBorderOutsideColor != defaultColor) {// 定义画两个边框,分别为外圆边框和内圆边框
    			radius = (defaultWidth < defaultHeight ? defaultWidth : defaultHeight) / 2 - 2 * mBorderThickness;
    			// 画内圆
    			drawCircleBorder(canvas, radius + mBorderThickness / 2, mBorderInsideColor);
    			// 画外圆
    			drawCircleBorder(canvas, radius + mBorderThickness + mBorderThickness / 2, mBorderOutsideColor);
    		} else if (mBorderInsideColor != defaultColor && mBorderOutsideColor == defaultColor) {// 定义画一个边框
    			radius = (defaultWidth < defaultHeight ? defaultWidth : defaultHeight) / 2 - mBorderThickness;
    			drawCircleBorder(canvas, radius + mBorderThickness / 2, mBorderInsideColor);
    		} else if (mBorderInsideColor == defaultColor && mBorderOutsideColor != defaultColor) {// 定义画一个边框
    			radius = (defaultWidth < defaultHeight ? defaultWidth : defaultHeight) / 2 - mBorderThickness;
    			drawCircleBorder(canvas, radius + mBorderThickness / 2, mBorderOutsideColor);
    		} else {// 没有边框
    			radius = (defaultWidth < defaultHeight ? defaultWidth : defaultHeight) / 2;
    		}
    		Bitmap roundBitmap = getCroppedRoundBitmap(bitmap, radius);
    		canvas.drawBitmap(roundBitmap, defaultWidth / 2 - radius, defaultHeight / 2 - radius, null);
    	}
    
    	/**
    	 * 获取裁剪后的圆形图片
    	 * 
    	 * @param radius
    	 *            半径
    	 */
    	public Bitmap getCroppedRoundBitmap(Bitmap bmp, int radius) {
    		Bitmap scaledSrcBmp;
    		int diameter = radius * 2;
    
    		// 为了防止宽高不相等,造成圆形图片变形,因此截取长方形中处于中间位置最大的正方形图片
    		int bmpWidth = bmp.getWidth();
    		int bmpHeight = bmp.getHeight();
    		int squareWidth = 0, squareHeight = 0;
    		int x = 0, y = 0;
    		Bitmap squareBitmap;
    		if (bmpHeight > bmpWidth) {// 高大于宽
    			squareWidth = squareHeight = bmpWidth;
    			x = 0;
    			y = (bmpHeight - bmpWidth) / 2;
    			// 截取正方形图片
    			squareBitmap = Bitmap.createBitmap(bmp, x, y, squareWidth, squareHeight);
    		} else if (bmpHeight < bmpWidth) {// 宽大于高
    			squareWidth = squareHeight = bmpHeight;
    			x = (bmpWidth - bmpHeight) / 2;
    			y = 0;
    			squareBitmap = Bitmap.createBitmap(bmp, x, y, squareWidth, squareHeight);
    		} else {
    			squareBitmap = bmp;
    		}
    
    		if (squareBitmap.getWidth() != diameter || squareBitmap.getHeight() != diameter) {
    			scaledSrcBmp = Bitmap.createScaledBitmap(squareBitmap, diameter, diameter, true);
    
    		} else {
    			scaledSrcBmp = squareBitmap;
    		}
    		Bitmap output = Bitmap.createBitmap(scaledSrcBmp.getWidth(), scaledSrcBmp.getHeight(), Config.ARGB_8888);
    		Canvas canvas = new Canvas(output);
    
    		Paint paint = new Paint();
    		Rect rect = new Rect(0, 0, scaledSrcBmp.getWidth(), scaledSrcBmp.getHeight());
    
    		paint.setAntiAlias(true);
    		paint.setFilterBitmap(true);
    		paint.setDither(true);
    		canvas.drawARGB(0, 0, 0, 0);
    		canvas.drawCircle(scaledSrcBmp.getWidth() / 2, scaledSrcBmp.getHeight() / 2, scaledSrcBmp.getWidth() / 2, paint);
    		paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
    		canvas.drawBitmap(scaledSrcBmp, rect, rect, paint);
    		
    		bmp = null;
    		squareBitmap = null;
    		scaledSrcBmp = null;
    		return output;
    	}
    
    	/**
    	 * 边缘画圆
    	 */
    	private void drawCircleBorder(Canvas canvas, int radius, int color) {
    		Paint paint = new Paint();
    		/* 去锯齿 */
    		paint.setAntiAlias(true);
    		paint.setFilterBitmap(true);
    		paint.setDither(true);
    		paint.setColor(color);
    		/* 设置paint的 style 为STROKE:空心 */
    		paint.setStyle(Paint.Style.STROKE);
    		/* 设置paint的外框宽度 */
    		paint.setStrokeWidth(mBorderThickness);
    		canvas.drawCircle(defaultWidth / 2, defaultHeight / 2, radius, paint);
    	}
    
    }</span><span style="font-size: 16pt;">
    </span>





  • 相关阅读:
    python之进程和线程2
    Python学习笔记7:yield生成迭代器
    Python学习笔记6:装饰器
    Python学习你急5:文件打开与处理
    Python学习笔记4:集合方法
    Python学习笔记3:字典方法
    Python学习笔记2:列表操作方法详解
    Python学习笔记1:字符串方法
    番外篇:Vim使用方法
    Day12: 正则表达式
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4051833.html
Copyright © 2011-2022 走看看