package com.csound.wizard.view.unit; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Paint.Style; import android.graphics.RectF; import android.view.View; import com.csound.wizard.Const; 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 MeterCenter extends View implements SetSlide { private static int desiredWidth = Const.desiredSliderWidth, desiredHeight = Const.desiredSliderHeight; private float mx = 0.5f; private Paint paint = new Paint(); private Rect mRect = new Rect(); private static final int n = 11, olive = Const.getColor("olive"), yellow = Const.getColor("yellow"), red = Const.getColor("red"); private static final float offset = 5; private Range mRange; private boolean mIsHor; public MeterCenter(Context context, Range range, boolean isHor) { super(context); ViewUtils.initPaint(paint); mRange = range; mIsHor = isHor; } @Override public void setSlide(float x) { mx = ViewUtils.withinBounds(mRange.toRelative(x)); invalidate(); } protected void onDraw(Canvas canvas) { mRect.setView(this); if (mRect.getHeight() < mRect.getWidth()) { drawHor(canvas); } else { drawVer(canvas); } } private void drawHor(Canvas canvas) { paint.setColor(olive); mRect.drawRimRounded(canvas, paint); paint.setStyle(Style.FILL); int m = Math.round(n * Math.abs(mx - 0.5f)); float dx = mRect.getWidth() / n; float cx = mRect.getCenterX(); canvas.drawRoundRect( new RectF(cx - 0.5f * dx + offset, mRect.getTop(), cx + 0.5f * dx - offset, mRect.getBottom()), 2 * offset, 2 * offset, paint); for (int i = 0; i < m; i++) { if (i == 0) { paint.setColor(yellow); } if (i == 3) { paint.setColor(red); } if (mx > 0.5f) { canvas.drawRoundRect( new RectF(cx + dx * (i + 0.5f) + offset, mRect.getTop() + offset, cx + dx * (i + 1 + 0.5f) - offset, mRect.getBottom() - offset), 2 * offset, 2 * offset, paint); } else { canvas.drawRoundRect( new RectF(cx - dx * (i + 1 + 0.5f) + offset, mRect.getTop()+ offset, cx - dx * (i + 0.5f) - offset, mRect.getBottom()- offset), 2 * offset, 2 * offset, paint); } } } private void drawVer(Canvas canvas) { paint.setColor(olive); mRect.drawRimRounded(canvas, paint); paint.setStyle(Style.FILL); int m = Math.round(n * Math.abs(mx - 0.5f)); float dy = mRect.getHeight() / n; float cy = mRect.getCenterY(); canvas.drawRoundRect( new RectF(mRect.getLeft(), cy - 0.5f * dy + offset, mRect.getRight(), cy + 0.5f * dy - offset), 2 * offset, 2 * offset, paint); for (int i = 0; i < m; i++) { if (i == 0) { paint.setColor(yellow); } if (i == 3) { paint.setColor(red); } if (mx > 0.5f) { canvas.drawRoundRect( new RectF( mRect.getLeft() + offset, cy + dy * (i + 0.5f) + offset, mRect.getRight() - offset, cy + dy * (i + 1 + 0.5f) - offset), 2 * offset, 2 * offset, paint); } else { canvas.drawRoundRect( new RectF( mRect.getLeft() + offset, cy - dy * (i + 1 + 0.5f) + offset, mRect.getRight() - offset, cy - dy * (i + 0.5f) - 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); } }; }