package com.elmz.drift; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.util.AttributeSet; import android.util.TypedValue; import android.view.View; import java.util.Iterator; import java.util.LinkedList; public class ChartView extends View{ private double minimum; private double threshold; private double maximum; private Paint pnt; private LinkedList<Double> data; private float dpConversion; public static final int MAXIMUM_DATA_STORAGE = 200; public ChartView(Context context){ super(context); init(); } public ChartView(Context context, AttributeSet attrs){ super(context, attrs); init(); } public ChartView(Context context, AttributeSet attrs, int defStyleAttr){ super(context, attrs, defStyleAttr); init(); } public ChartView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes){ super(context, attrs, defStyleAttr, defStyleRes); init(); } private void init(){ minimum = 0; maximum = 25; threshold = 5; pnt = new Paint(); data = new LinkedList<Double>(); dpConversion = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1, getResources().getDisplayMetrics()); } public double getMinimum(){ return minimum; } public void setMinimum(double minimum){ this.minimum = minimum; setThreshold(threshold); } public double getMaximum(){ return maximum; } public void setMaximum(double maximum){ this.maximum = maximum; setThreshold(threshold); } public double getThreshold(){ return threshold; } public void setThreshold(double threshold){ this.threshold = Math.min(Math.max(threshold, minimum), maximum); } public void pushData(double value){ value = Math.min(Math.max(value, minimum), maximum); data.push(value); if(data.size() > MAXIMUM_DATA_STORAGE){ data.removeLast(); } invalidate(); } private float getScaledY(Canvas canvas, double y){ return (float)(canvas.getHeight()*(1 - (y-minimum)/(maximum-minimum))); } @Override protected void onDraw(Canvas canvas){ super.onDraw(canvas); float thr = getScaledY(canvas, threshold); pnt.setColor(getResources().getColor(R.color.ok_pale)); pnt.setStrokeWidth(0); canvas.drawRect(0, thr, canvas.getWidth(), canvas.getHeight(), pnt); pnt.setColor(getResources().getColor(R.color.warning_pale)); canvas.drawRect(0, 0, canvas.getWidth(), thr, pnt); pnt.setColor(getResources().getColor(R.color.accent)); pnt.setStrokeWidth(2 * dpConversion); Iterator<Double> it = data.iterator(); if(!it.hasNext()){ return; } float dx = (float)getWidth()/MAXIMUM_DATA_STORAGE; float x = getWidth() - 8 * dpConversion; double last = it.next(); while(it.hasNext()){ double next = it.next(); canvas.drawLine(x, getScaledY(canvas, last), x-dx, getScaledY(canvas, next), pnt); last = next; x -= dx; } canvas.drawCircle(getWidth()-8*dpConversion, getScaledY(canvas, data.getFirst()), 4*dpConversion, pnt); } }