感觉有点像是 chart
public class MusicBar extends View {
//条形个数
private int mRectCount;
//单个条形 的宽度
private int mRectWidth;
//条形之间的间距
private int mRectSpace;
//view 的宽高
private int mWidth;
private int mHeight;
//VIEW 默认宽高
private static final int DEFAULT_WITH = 500;
private static final int DEFAULT_HEIGHT = 300;
//用来随机取出rectheight
private Random mRandom = new Random();
private Paint mPaint;
private boolean inited = false;
private LinearGradient mLinearGradient;
public MusicBar(Context context) {
this(context, null);
}
public MusicBar(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public MusicBar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
if (!isInEditMode()) {
init(context, attrs, defStyleAttr);
}
}
private void init(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
TypedArray typedArray = context.obtainStyledAttributes(R.styleable.MusicBar);
mRectSpace = (int) typedArray.getDimension(R.styleable.MusicBar_bar_space, dp2px(10));
mRectWidth = (int) typedArray.getDimension(R.styleable.MusicBar_bar_width, dp2px(20));
typedArray.recycle();
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setStyle(Paint.Style.FILL);
// mPaint.setStrokeWidth(1);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(mesureWidth(widthMeasureSpec), measureHeight(heightMeasureSpec));
}
private int mesureWidth(int widthMeasureSpec) {
int specMode = MeasureSpec.getMode(widthMeasureSpec);
int width = MeasureSpec.getSize(widthMeasureSpec);
if (specMode == MeasureSpec.AT_MOST) {//at most 对应wrapcontent
return Math.min(width, dp2px(DEFAULT_WITH));
}
if (specMode == MeasureSpec.EXACTLY) {
return width;
}
return DEFAULT_WITH;
}
private int measureHeight(int heightMeasureSpec) {
int specMode = MeasureSpec.getMode(heightMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);
if (specMode == MeasureSpec.AT_MOST) {//at most 对应wrapcontent
return Math.min(height, dp2px(DEFAULT_HEIGHT));
}
if (specMode == MeasureSpec.EXACTLY) {
return height;
}
return DEFAULT_HEIGHT;
}
private int dp2px(int dp) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, getContext().getResources().getDisplayMetrics());
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
if (!inited) {
inited = true;
mWidth = getMeasuredWidth();
mHeight = getMeasuredHeight();
mLinearGradient = new LinearGradient(0, 0, mWidth, mHeight,
new int[]{Color.YELLOW, Color.BLUE}, null, Shader.TileMode.CLAMP);
mPaint.setShader(mLinearGradient);
caculateRect();
}
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
drawRect(canvas);
canvas.save();
canvas.restore();
postInvalidateDelayed(1000);
}
private void caculateRect() {
// rCount*rWidth +(rCount+1)*rSpace = width
mRectCount = (mWidth - mRectSpace) / (mRectSpace + mRectWidth);
}
private void drawRect(Canvas canvas) {
for (int i = 0; i < mRectCount; i++) {
if (i == 0) {
//平移一段space 再画矩形
canvas.translate(mRectSpace, 0);
} else {
canvas.translate(mRectSpace + mRectWidth, 0);
}
canvas.drawRect(0, mHeight - mRandom.nextInt(mHeight), mRectWidth, mHeight, mPaint);
}
}