package com.csound.wizard.view.unit;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.view.View;
import com.csound.wizard.Const;
import com.csound.wizard.layout.param.ColorParam;
import com.csound.wizard.layout.param.Types.Range;
import com.csound.wizard.view.ViewUtils;
import com.csound.wizard.view.GraphUtils.Rect;
import com.csound.wizard.view.Listener.SetSlide;
import com.csound.wizard.view.ViewUtils.OnMeasure;
public class Meter extends View implements SetSlide {
private static int
desiredWidth = Const.desiredSliderWidth,
desiredHeight = Const.desiredSliderHeight;
private ColorParam mColor;
private boolean mIsHor;
private float mx = 0.5f;
private Paint paint = new Paint();
private Rect mRect = new Rect();
private static final int
n = 12,
green = Color.parseColor("#2ECC40"),
yellow = Color.parseColor("#FFDC00"),
red = Color.parseColor("#FF4136");
private static final float offset = 3;
private Range mRange;
public Meter(Context context, Range range, boolean isHor, ColorParam color) {
super(context);
ViewUtils.initPaint(paint);
mRange = range;
mIsHor = isHor;
mColor = color;
}
@Override
public void setSlide(float x) {
mx = ViewUtils.withinBounds(mRange.toRelative(x));
invalidate();
}
protected void onDraw(Canvas canvas) {
mRect.setRect(getPaddingLeft(), getPaddingTop(), getWidth(), getHeight());
paint.setColor(mColor.getBkgColor());
mRect.draw(canvas, paint);
mRect.setView(this);
if (mRect.getHeight() < mRect.getWidth()) {
drawHor(canvas);
} else {
drawVer(canvas);
}
}
private void drawHor(Canvas canvas) {
paint.setColor(green);
int m = Math.round(n * mx);
float dx = mRect.getWidth() / n;
for (int i = 0; i < m; i++) {
if (i == n - 4) {
paint.setColor(yellow);
}
if (i == n - 2) {
paint.setColor(red);
}
canvas.drawRoundRect(
new RectF(mRect.getLeft() + dx * i + offset ,
mRect.getTop(),
mRect.getLeft() + dx * (i + 1) - offset,
mRect.getBottom()),
2 * offset, 2 * offset,
paint);
}
}
private void drawVer(Canvas canvas) {
paint.setColor(green);
int m = Math.round(n * mx);
float dy = mRect.getHeight() / n;
for (int i = 0; i < m; i++) {
if (i == n - 4) {
paint.setColor(yellow);
}
if (i == n - 2) {
paint.setColor(red);
}
canvas.drawRoundRect(
new RectF(mRect.getLeft(),
mRect.getBottom() - dy * (i + 1) + offset,
mRect.getRight(),
mRect.getBottom() - dy * i - offset),
2 * offset, 2 * offset,
paint);
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
if (mIsHor) {
ViewUtils.mkOnMeasure(widthMeasureSpec, heightMeasureSpec, desiredWidth, desiredHeight, onMeasureRunner);
} else {
ViewUtils.mkOnMeasure(widthMeasureSpec, heightMeasureSpec, desiredHeight, desiredWidth, onMeasureRunner);
}
}
private OnMeasure onMeasureRunner = new OnMeasure() {
@Override
public void apply(int width, int height) {
setMeasuredDimension(width, height);
}
};
}