Android音乐能量柱



import java.util.Arrays;



import android.content.Context;

import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.PorterDuff.Mode;
import android.graphics.Rect;
import android.media.MediaPlayer;
import android.os.Handler;
import android.os.RemoteException;
import android.util.AttributeSet;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;

public class MusicEnergy extends SurfaceView implements Callback {

	private final Handler mHandler = new Handler();
	AudioCapture mAudioCapture = null;
	private int[] mVizData = new int[128];
	private final Paint mPaint = new Paint();
	private final Paint mPaintShadow = new Paint();
	private IMediaPlayerAudioService mPlayer = null;
	private static final int frequency = 1000 / 25;
	public boolean isHide =false;
	public boolean isBluetooth =false;
	public boolean isBluetooth() {
		return isBluetooth;
	}

	public void setBluetooth(boolean isBluetooth) {
		this.isBluetooth = isBluetooth;
	}

	// 边长
	private static final int rectLength = 8;

	// 方块横向距离
	private static final int rectMarginHorizontal = 4;
	// 方块纵向距离
	private static final int rectMarginVertical = 2;

	int mWidth = 0;
	int mCenterY = 0;

	public void setMediaplayer(IMediaPlayerAudioService m) {
		mPlayer = m;
	}
	private boolean pause = false;
	private final Runnable mDrawCube = new Runnable() {
		

		public void run() {
		
			try {
				Thread.sleep(100);
				drawFrame();
			} catch (InterruptedException e) {
				e.printStackTrace();
				return;
				
			}
			
		}
	};
	public void pause(){
		pause = true;
	}
	public void start(){
		pause = false;
	}
	public MusicEnergy(Context context) {
		super(context);
		initPaint();
	}

	public MusicEnergy(Context context, AttributeSet attrs) {
		super(context, attrs);
		initPaint();
	}

	/**
	 * @Title: initPaint
	 * @Description: 初试化画笔
	 */
	private void initPaint() {
		setZOrderOnTop(true);
		getHolder().setFormat(PixelFormat.TRANSLUCENT);

		mAudioCapture = new AudioCapture(AudioCapture.TYPE_FFT, 128);
		mAudioCapture.start();
		mPaint.setColor(0xB2FFFFFF);
		mPaint.setAntiAlias(true);
		mPaint.setStyle(Paint.Style.FILL);
		getHolder().addCallback(this);

		mPaintShadow.setColor(0xB2FFFFFF);
		mPaintShadow.setAntiAlias(true);
		mPaintShadow.setStyle(Paint.Style.FILL);
	}

	void drawFrame() {
		final SurfaceHolder holder = getHolder();
		final Rect frame = holder.getSurfaceFrame();
		final int width = frame.width();
		final int height = frame.height();

		Canvas c = null;
		try {
			c = holder.lockCanvas();
			if (c != null && !pause) {
				drawCube(c);
			}
		} finally {
			if (c != null)
				holder.unlockCanvasAndPost(c);
		}

		mHandler.removeCallbacks(mDrawCube);
	//	thread = new Thread(mDrawCube);
		mHandler.postDelayed(mDrawCube, frequency);
	}

	void drawCube(Canvas c) {
		c.save();
		c.drawColor(Color.TRANSPARENT, Mode.CLEAR);
		if(isHide){
			c.restore();
			return;
		}
		if (mAudioCapture != null) {
			mVizData = mAudioCapture.getFormattedData(1, 2);
			if (mVizData.length == 0) {
				mVizData = new int[128];
				Arrays.fill(mVizData, (int) 0);
			}
		} else {
			Arrays.fill(mVizData, (int) 0);
		}
		if (mPlayer != null) {
			try {
				if (!mPlayer.isMediaPlaying())
					Arrays.fill(mVizData, (int) 0);
			} catch (RemoteException e) {
				e.printStackTrace();
			}
		}
		if (isBluetooth) {
			if(!BluetoothMusicService.mIsPlay)
				Arrays.fill(mVizData, (int) 0);
		}
		
	
		for (int i = 0; i < mVizData.length; i++) {
			// CD部分不画720px
			// if(i*(rectLength+rectMarginHorizontal) > 242 &&
			// i*(rectLength+rectMarginHorizontal) < 471){
			// continue;
			// }
			// CD部分不画768px(待验证)
			// if((i+1)*rectLength+i*rectMarginHorizontal> 278 &&
			// i*(rectLength+rectMarginHorizontal) < 493){
			// continue;
			// }
			if (i * (rectLength + rectMarginHorizontal) < 275) {
				for (int j = 0; j <= Math.abs(mVizData[i]) * 0.6; j++) {
					float right = (i + 1) * rectLength + i * rectMarginHorizontal > 280 ? 280
							: (i + 1) * rectLength + i * rectMarginHorizontal;
					c.drawRect(i * (rectLength + rectMarginHorizontal),
							mCenterY - (j + 1) * (rectLength + rectMarginVertical), right,
							mCenterY - (j) * rectLength - (j + 1) * rectMarginVertical, mPaint);

					mPaintShadow.setAlpha(100 - (100 / 20 * j));
					c.drawRect(i * (rectLength + rectMarginHorizontal),
							mCenterY + (j) * (rectLength + rectMarginVertical), right,
							mCenterY + (j + 1) * rectLength + j * rectMarginVertical, mPaintShadow);
				}
			} else if ((i + 1) * rectLength + i * rectMarginHorizontal > 490) {

				for (int j = 0; j <= Math.abs(mVizData[i]) * 1.3; j++) {
					float left = i * (rectLength + rectMarginHorizontal) < 490 ? 490
							: i * (rectLength + rectMarginHorizontal);
					c.drawRect(left, mCenterY - (j + 1) * (rectLength + rectMarginVertical),
							(i + 1) * (rectLength) + i * rectMarginHorizontal,
							mCenterY - (j) * rectLength - (j + 1) * rectMarginVertical, mPaint);

					mPaintShadow.setAlpha(100 - (100 / 20 * j));
					c.drawRect(left, mCenterY + (j) * (rectLength + rectMarginVertical),
							(i + 1) * rectLength + i * rectMarginHorizontal,
							mCenterY + (j + 1) * rectLength + j * rectMarginVertical, mPaintShadow);
				}

			}

		}

		c.restore();
	}

	@Override
	protected void finalize() throws Throwable {
		super.finalize();
//		if (mAudioCapture != null) {
//			mAudioCapture.stop();
//			mAudioCapture.release();
//			mAudioCapture = null;
//		}
	}

	public void onClose() {
		if (mAudioCapture != null) {
			mAudioCapture.stop();
			mAudioCapture.release();
			mAudioCapture = null;
		}
	}

	public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
		mCenterY = height / 2;
		mWidth = width;
	}

	public void surfaceCreated(SurfaceHolder holder) {
		drawFrame();
	}

	public void surfaceDestroyed(SurfaceHolder holder) {
		mHandler.removeCallbacks(mDrawCube);
	}
}

 

直接在布局中加载

 

        <com.ch.carmedia.music.MusicEnergy
            android:id="@+id/view_music_energy"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

 

 

调用的时候,根据media的状态,调用start,stop方法

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值