package net.coding.program.common.widget;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.os.Build;
import android.util.AttributeSet;
import android.view.View;
import net.coding.program.R;
import net.coding.program.common.Global;
import java.util.ArrayList;
/**
* Created by Carlos2015 on 2015/8/6.
* 根据音量大小产生音波扩散效果
*/
public class SoundWaveView extends View {
private Context context;
//音波颜色
private int waveColor = 0xfffb8638;
//最小声音大小(分贝)
private final float minDecibel = 15.0f;
//最大声音大小
private final float maxDecibel = 85.0f;
private final int Orientation_Left = 1;
private final int Orientation_Right = 0;
//音波震源位置
private int soundOriginOrientation = Orientation_Right;
private final int waveCout = 9;
//存储声音的队列
private ArrayList<Float> queen = new ArrayList<Float>(waveCout);
private Paint mPaint;
public SoundWaveView(Context context) {
super(context);
init(context, null);
}
public SoundWaveView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}
public SoundWaveView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context, attrs);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public SoundWaveView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init(context, attrs);
}
private void init(Context context, AttributeSet attrs) {
this.context = context;
if (attrs != null) {
TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.SoundWaveView);
waveColor = array.getColor(R.styleable.SoundWaveView_waveColor, 0xfffb8638);
soundOriginOrientation = array.getInt(R.styleable.SoundWaveView_soundOriginOrientation, Orientation_Right);
//array.getInteger(R.styleable.SoundWaveView_soundOriginOrientation,Orientation_Right);
array.recycle();
}
for (int i = 0; i < waveCout; i++) {
queen.add(minDecibel);
}
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setColor(waveColor);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//9个音波,每个宽度6px(2dp),最小高度9px,最大高度36px(12dp)
setMeasuredDimension(Global.dpToPx((waveCout * 2 - 1) * 2), Global.dpToPx(12));
}
/**
* 设置当前音量
*
* @param volume
*/
public synchronized void setVolume(float volume) {
queen.remove(queen.size() - 1);
queen.add(0, volume);
invalidate();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
float scope = maxDecibel - minDecibel;
int height = getMeasuredHeight();
for (int i = 0; i < queen.size(); i++) {
float v = queen.get(i);
if (v >= maxDecibel) {
v = maxDecibel;
} else if (v <= minDecibel) {
v = minDecibel;
}
drawWave(canvas, i, (int) (height * (v - minDecibel) / scope));
}
}
public void reSet() {
for (int i = 0; i < waveCout; i++) {
queen.set(0, minDecibel);
}
postInvalidate();
}
/**
* 绘制单个音波
*
* @param canvas
* @param position
* @param waveHeight
*/
private void drawWave(Canvas canvas, int position, int waveHeight) {
int minWaveHeight = Global.dpToPx(3);
if (waveHeight <= minWaveHeight) {
waveHeight = minWaveHeight;
}
int waveWidth = getMeasuredWidth() / (queen.size() * 2 - 1);
int left = 0;
int top = 0;
int right = 0;
int bottom = 0;
switch (soundOriginOrientation) {
case Orientation_Left:
left = ((position + 1) * 2 - 1) * waveWidth - waveWidth;
break;
case Orientation_Right:
left = ((queen.size() - 1 - position + 1) * 2 - 1) * waveWidth - waveWidth;
break;
}
right = left + waveWidth;
top = (getMeasuredHeight() - waveHeight) / 2;
bottom = top + waveHeight;
int angle = Global.dpToPx(1);
canvas.drawRoundRect(new RectF(left, top, right, bottom), angle, angle, mPaint);
}
}