Want more features on Pastebin? Sign Up, it's FREE!
Guest

Untitled

By: a guest on Nov 12th, 2012  |  syntax: None  |  size: 4.37 KB  |  views: 29  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. import android.graphics.*;
  2. import com.androidplot.exception.PlotRenderException;
  3. import com.androidplot.series.XYSeries;
  4. import com.androidplot.util.ValPixConverter;
  5. import com.androidplot.xy.BarFormatter;
  6. import com.androidplot.xy.XYPlot;
  7. import com.androidplot.xy.XYSeriesRenderer;
  8.  
  9. import java.util.List;
  10. import java.util.Map;
  11. import java.util.TreeMap;
  12.  
  13. /**
  14.  * Renders a point as a Bar
  15.  */
  16. public class OptimisedBarRenderer extends XYSeriesRenderer<BarFormatter> {
  17.  
  18.     private BarWidthStyle style = BarWidthStyle.FIXED_WIDTH;
  19.     private float barWidth = 5;
  20.  
  21.     public OptimisedBarRenderer(XYPlot plot) {
  22.         super(plot);
  23.     }
  24.  
  25.     /**
  26.      * Sets the width of the bars draw.
  27.      * @param barWidth
  28.      */
  29.     public void setBarWidth(float barWidth) {
  30.         this.barWidth = barWidth;
  31.     }
  32.  
  33.     private final TreeMap<Number, XYSeries> tempSeriesMap = new TreeMap<Number, XYSeries>();
  34.  
  35.     @Override
  36.     public void onRender(Canvas canvas, RectF plotArea) throws PlotRenderException {
  37.         int longest = getLongestSeries();
  38.         if(longest == 0) {
  39.             return;  // no data, nothing to do.
  40.         }
  41.         tempSeriesMap.clear();
  42.  
  43.         for(int i = 0; i < longest; i++) {
  44.             tempSeriesMap.clear();
  45.             List<XYSeries> seriesList = getPlot().getSeriesListForRenderer(this.getClass());
  46.             for(XYSeries series : seriesList) {
  47.                 if(i < series.size()) {
  48.                     tempSeriesMap.put(series.getY(i), series);
  49.                 }
  50.             }
  51.             drawBars(canvas, plotArea, tempSeriesMap, i);
  52.         }
  53.     }
  54.  
  55.     @Override
  56.     public void doDrawLegendIcon(Canvas canvas, RectF rect, BarFormatter formatter) {
  57.         canvas.drawRect(rect, formatter.getFillPaint());
  58.         canvas.drawRect(rect, formatter.getBorderPaint());
  59.     }
  60.  
  61.     private int getLongestSeries() {
  62.         int longest = 0;
  63.         List<XYSeries> seriesList = getPlot().getSeriesListForRenderer(this.getClass());
  64.  
  65.         if(seriesList == null)
  66.             return 0;
  67.  
  68.         for(XYSeries series :seriesList) {
  69.             int seriesSize = series.size();
  70.             if(seriesSize > longest) {
  71.                 longest = seriesSize;
  72.             }
  73.         }
  74.         return longest;
  75.     }
  76.  
  77.     private void drawBars(Canvas canvas, RectF plotArea, TreeMap<Number, XYSeries> seriesMap, int x) {
  78. //        Paint p = new Paint();
  79. //        p.setColor(Color.RED);
  80.  
  81.         Object[] oa = seriesMap.entrySet().toArray();
  82.         Map.Entry<Number, XYSeries> entry;
  83.         Number yVal = null;
  84.         Number xVal = null;
  85.  
  86.         float halfWidth = barWidth * 0.5f;
  87.  
  88.         for(int i = oa.length-1; i >= 0; i--) {
  89.             entry = (Map.Entry<Number, XYSeries>) oa[i];
  90.             XYSeries tempEntry = entry.getValue();
  91.  
  92.             if(tempEntry != null) {
  93.                 yVal = tempEntry.getY(x);
  94.                 xVal = tempEntry.getX(x);
  95.  
  96.                 if (yVal != null && xVal != null) {  // make sure there's a real value to draw
  97.                     switch (style) {
  98.                         case FIXED_WIDTH:
  99.                             float pixX = ValPixConverter.valToPix(xVal.doubleValue(), getPlot().getCalculatedMinX().doubleValue(), getPlot().getCalculatedMaxX().doubleValue(), plotArea.width(), false) + plotArea.left;
  100.  
  101.                             float left = pixX - halfWidth;
  102.                             float right = pixX + halfWidth;
  103.  
  104.                             boolean offScreen = left > plotArea.right || right < plotArea.left;
  105.  
  106.                             if(!offScreen){
  107.                                 float pixY = ValPixConverter.valToPix(yVal.doubleValue(), getPlot().getCalculatedMinY().doubleValue(), getPlot().getCalculatedMaxY().doubleValue(), plotArea.height(), true) + plotArea.top;
  108.  
  109.                                 BarFormatter formatter = getFormatter(tempEntry);
  110.                                 if(Math.abs (left - right) > 1f){//Don't draw as it will be hidden anyway.
  111.                                     canvas.drawRect(left, pixY, right, plotArea.bottom, formatter.getFillPaint());
  112.                                 }
  113.                                 canvas.drawRect(left, pixY, right, plotArea.bottom, formatter.getBorderPaint());
  114.  
  115.                             }
  116.                             break;
  117.                         default:
  118.                             throw new UnsupportedOperationException("Not yet implemented.");
  119.                     }
  120.                 }
  121.             }
  122.         }
  123.     }
  124. }
clone this paste RAW Paste Data