package com.silencedut.knowweather.common.customview;
import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.os.Build;
import android.text.TextPaint;
import android.util.AttributeSet;
import android.view.View;
import com.silencedut.knowweather.R;
import com.silencedut.knowweather.utils.Check;
import com.silencedut.knowweather.utils.UIUtil;
import java.util.ArrayList;
import java.util.List;
/**
* Created by SilenceDut on 16/10/18.
*/
public class LevelView extends View {
private Paint mGradientPaint;
private Paint mTextPaint;
private List<LevelColorPair> mLevelColors;
private int mWidth;
private int mPaintStroke;
private RectF mRectLeft;
private RectF mRectRight;
private int mLevelCount;
private int mTextSize;
private int mPaddingTop;
private int mCurrentValue;
public LevelView(Context context) {
super(context);
}
public LevelView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public LevelView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public LevelView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
private void init() {
mWidth = getMeasuredWidth();
mGradientPaint = new Paint();
mGradientPaint.setAntiAlias(true);
mTextPaint = new TextPaint();
mTextPaint.setAntiAlias(true);
mTextSize = UIUtil.dipToPx(getContext(), 10.0f);
mTextPaint.setTextSize(mTextSize);
mPaintStroke = UIUtil.dipToPx(getContext(), 4.0f);
mPaddingTop = mPaintStroke;
mRectLeft = new RectF(0, mPaddingTop - mPaintStroke / 2, mPaintStroke, mPaintStroke + mPaddingTop - mPaintStroke / 2);
mRectRight = new RectF(mWidth - mPaintStroke, mPaddingTop - mPaintStroke / 2, mWidth, mPaintStroke + mPaddingTop - mPaintStroke / 2);
mGradientPaint.setStyle(Paint.Style.FILL);
}
public void setColorLever(int[] colorIds, int[] levels) {
if (colorIds.length != levels.length) {
return;
}
mLevelColors = new ArrayList<>();
for (int index = 0; index < colorIds.length; index++) {
mLevelColors.add(new LevelColorPair(levels[index], UIUtil.getColor(getContext(), colorIds[index])));
}
mLevelCount = mLevelColors.size();
invalidate();
}
public void setColorLever(List<LevelColorPair> colorLevelInfo) {
if (colorLevelInfo == null) {
return;
}
mLevelColors = new ArrayList<>();
mLevelColors.clear();
mLevelColors.addAll(colorLevelInfo);
mLevelCount = mLevelColors.size();
invalidate();
}
public void setCurrentValue(int value) {
this.mCurrentValue = value;
invalidate();
}
public int getSectionColor() {
int sectionColor = UIUtil.getColor(getContext(), R.color.colorAccent);
for (LevelColorPair levelColorPair : mLevelColors) {
if (levelColorPair.levelNumber > mCurrentValue) {
sectionColor = levelColorPair.color;
break;
}
}
return sectionColor;
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
init();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (Check.isEmpty(mLevelColors)) {
return;
}
mGradientPaint.setColor(mLevelColors.get(0).color);
canvas.drawArc(mRectLeft, 90, 180, true, mGradientPaint);
float widthIndex = mPaintStroke / 2;
mGradientPaint.setStrokeWidth(mPaintStroke);
float perGap = (mWidth - mPaintStroke) * 1.0f / mLevelColors.get(mLevelCount - 1).levelNumber;
int lastNumber = 0;
String text = "0";
canvas.drawText(text, 0, mPaddingTop + mPaintStroke + mTextSize, mTextPaint);
float cursorCenter = widthIndex + mCurrentValue * perGap;
for (int index = 0; index < mLevelCount; index++) {
LevelColorPair levelColorPair = mLevelColors.get(index);
mGradientPaint.setColor(levelColorPair.color);
float perLength = perGap * (levelColorPair.levelNumber - lastNumber);
canvas.drawLine(widthIndex, mPaddingTop, widthIndex + perLength, mPaddingTop, mGradientPaint);
widthIndex += perLength;
lastNumber = levelColorPair.levelNumber;
if (index == mLevelCount - 1) {
text = "+";
} else {
text = levelColorPair.levelNumber + "";
}
canvas.drawText(text, widthIndex - mTextSize / 2, mPaddingTop + mPaintStroke + mTextSize, mTextPaint);
}
canvas.drawArc(mRectRight, 270, 180, true, mGradientPaint);
mGradientPaint.setColor(UIUtil.getColor(getContext(), R.color.colorAccent));
canvas.drawCircle(cursorCenter, mPaddingTop, mPaintStroke, mGradientPaint);
}
public static class LevelColorPair {
int levelNumber;
int color;
public LevelColorPair(int levelNumber, int color) {
this.levelNumber = levelNumber;
this.color = color;
}
}
}