package org.ripple.power.ui.graphics.chart; import java.util.ArrayList; public class XyChartView extends ChartBaseCanvas { /** * */ private static final long serialVersionUID = 1L; private ArrayList<ChartPointSerie> mSeries = new ArrayList<ChartPointSerie>(); private Paint mPnt = new Paint(); public XyChartView(int w, int h) { super(w, h); } public void onDraw(Canvas cnv) { if ((mBmp == null) || (bRedraw)) { getViewSizes(); getXYminmax(); if (p_xscale_auto) calcXgridRange(); if (p_yscale_auto) calcYgridRange(); calcXYcoefs(); reset(); if (p_grid_vis) drawGrid(); if (p_xtext_vis) drawXlabel(); if (p_ytext_vis) drawYlabel(); if (p_border_vis) drawBorder(); if (p_axis_vis) drawAxis(); drawData(); bRedraw = false; } cnv.drawBitmap(mBmp, 0, 0); } public void clearSeries() { while (mSeries.size() > 0) { mSeries.remove(0); } bRedraw = true; } public void addSerie(ChartPointSerie serie) { mSeries.add(serie); bRedraw = true; } public ArrayList<ChartPointSerie> getSeries() { return mSeries; } public void setLineVis(int index, boolean show) { mSeries.get(index).setVisible(show); bRedraw = true; } public void setLineStyle(int index, int color, float size) { mSeries.get(index).setStyle(color, size); bRedraw = true; } public void setLineStyle(int index, int color, float size, boolean usedip) { mSeries.get(index).setStyle(color, size, usedip); bRedraw = true; } protected void getXYminmax() { ChartPointSerie serie; for (int ii = 0; ii < mSeries.size(); ii++) { serie = mSeries.get(ii); if (ii == 0) { mXmin = serie.mXmin; mXmax = serie.mXmax; mYmin = serie.mYmin; mYmax = serie.mYmax; } else { if (serie.mXmin < mXmin) mXmin = serie.mXmin; if (serie.mXmax > mXmax) mXmax = serie.mXmax; if (serie.mYmin < mYmin) mYmin = serie.mYmin; if (serie.mYmax > mYmax) mYmax = serie.mYmax; } } } protected void drawData() { float pX, pY; boolean pValid; ChartPoint point; for (ChartPointSerie serie : mSeries) { if (serie.isVisible()) { mPnt.reset(); mPnt.setStyle(Style.STROKE); mPnt.setColor(serie.mColor); if (serie.mUseDip) mPnt.setStrokeWidth(dipToPixel(serie.mWidth)); else mPnt.setStrokeWidth(serie.mWidth); mPnt.setAntiAlias(true); pValid = false; mPath.reset(); for (int ii = 0; ii < serie.mPointList.size(); ii++) { point = serie.mPointList.get(ii); pX = point.x; pY = point.y; if (Float.isNaN(pX) || Float.isNaN(pY)) { pValid = false; } else if (!pValid) { mPath.moveTo(sX + (pX - bX) * aX, eY - (pY - bY) * aY); pValid = true; } else { mPath.lineTo(sX + (pX - bX) * aX, eY - (pY - bY) * aY); } } mCnv.drawPath(mPath, mPnt); } } } }