2012-04-16 21 views
3

任何已使用過AndroidPlot庫的人告訴我如何去繪製圖表上的自定義點。到目前爲止,我正在使用LineAndPointRenderer類和設置線來透明。 我想至少改變點的大小,但如果可能的話,有一個自定義圖像。使用AndroidPlot的圖表上的自定義點數

P.S 1500人需要創建一個「AndroidPlot」標籤。

回答

6

通過創建我自己的渲染器解決了這個問題。

import android.graphics.*; 

import com.androidplot.series.XYSeries; 
import com.androidplot.exception.PlotRenderException; 
import com.androidplot.util.ValPixConverter; 
import com.androidplot.xy.LineAndPointFormatter; 
import com.androidplot.xy.XYPlot; 
import com.androidplot.xy.XYSeriesRenderer; 


public class CustomPointRenderer<FormatterType extends LineAndPointFormatter> extends XYSeriesRenderer<FormatterType> { 

    private float circleWidth = 1; 

    public CustomPointRenderer(XYPlot plot) { 
     super(plot); 
    } 

    @Override 
    public void onRender(Canvas canvas, RectF plotArea) throws PlotRenderException { 
     for(XYSeries series : getPlot().getSeriesListForRenderer(this.getClass())) { 
      drawSeries(canvas, plotArea, series, getFormatter(series)); 
     } 
    } 
    @Override 
    protected void doDrawLegendIcon(Canvas canvas, RectF rect, FormatterType formatter) { 
     // horizontal icon: 
     float centerY = rect.centerY(); 
     float centerX = rect.centerX(); 

     if(formatter.getFillPaint() != null) { 
      canvas.drawRect(rect, formatter.getFillPaint()); 
     } 
     if(formatter.getLinePaint() != null) { 
      canvas.drawLine(rect.left, rect.bottom, rect.right, rect.top, formatter.getLinePaint()); 
     } 

     if(formatter.getVertexPaint() != null) { 
      canvas.drawPoint(centerX, centerY, formatter.getVertexPaint()); 
     } 
    } 

    private void drawSeries(Canvas canvas, RectF plotArea, XYSeries series, LineAndPointFormatter formatter) throws PlotRenderException { 
     PointF p = null; 
     XYPlot plot = getPlot(); 
     int size = series.size(); 

     for (int i = 0; i < size; i++) { 
      Number y = series.getY(i); 
      Number x = series.getX(i); 

      if (y != null && x != null) { 
       p = ValPixConverter.valToPix(x, y, plotArea, 
          plot.getCalculatedMinX(), 
          plot.getCalculatedMaxX(), 
          plot.getCalculatedMinY(), 
          plot.getCalculatedMaxY()); 

       if (formatter.getVertexPaint() != null) { 
        boolean offScreen = p.x > plotArea.right || p.y > plotArea.bottom || p.x < plotArea.left || p.y < plotArea.top; 
        if(!offScreen) 
         canvas.drawCircle(p.x, p.y - circleWidth, circleWidth, formatter.getVertexPaint()); 
       }    
      } 
     } 
    } 

    public void setWidth(float width){ 
     circleWidth = width; 
    } 
} 
相關問題