2012-04-16 6 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; 
    } 
} 
関連する問題