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方法