2016-10-04 12 views
0

私はアンドロイドのプロットを使用してアプリケーションを開発しています、私はそれを美化しようとしています、私は画像カスタマイズラベルとポイント

​​

のようにそれをしたいしかし、私はこれらの

のように取得していますtwo

答えて

0

(上記あなたの例の画像のように個々の点のために内側の円を描くこの答がアドレス)

通常、これはLineAndPointFormatterのインスタンスを適切に設定したシリーズを単純に再追加すると2〜3行のジョブになりますが、最近のリリースでは同じ系列が複数回追加されることはありません別のFormatterが提供されているかどうかにかかわらず、同じレンダラーです。

 XYSeries series2b = new SimpleXYSeries(
       Arrays.asList(series2Numbers), SimpleXYSeries.ArrayFormat.Y_VALS_ONLY, "Series2"); 

     LineAndPointFormatter series2bFormat = new LineAndPointFormatter(null, Color.WHITE, null, null); 

     // this adjusts the size of the inner circle: 
     series2bFormat.getVertexPaint().setStrokeWidth(PixelUtils.dpToPix(7)); 

     ... 

     // make sure this line comes AFTER the addSeries call for the copied series: 
     plot.addSeries(series2b, series2bFormat); 

上記の実装の制限があることである:あなたはまだかなり簡単にこれを行うことができ、あなたの系列データの完全な複製を持つ心をいけない場合

(1.2.3リリースで修正されます)複製された凡例アイコン(これもまたリリース1.2.3リリースで扱われます)を描画します。 、そして、

// a custom renderer to draw an second smaller circle for each rendered vertex 
    static class MyLineAndPointRenderer extends LineAndPointRenderer<MyLineAndPointFormatter> { 


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

     @Override 
     protected void renderPoints(Canvas canvas, RectF plotArea, XYSeries series, List<PointF> points, 
       LineAndPointFormatter formatter) { 
      // draw points as normal: 
      super.renderPoints(canvas, plotArea, series, points, formatter); 

      // now draw our inner vertices on top of the previously drawn vertices: 
      for (PointF p : points) { 
       Paint paint = ((MyLineAndPointFormatter) formatter).getInnerPointPaint(); 
       canvas.drawPoint(p.x, p.y, paint); 
      } 
     } 
    } 

    // defines the format for our custom renderer: 
    static class MyLineAndPointFormatter extends LineAndPointFormatter { 

     Paint innerPointPaint = new Paint(); 

     { 
      // setup innPointPaint to draw a white circle a little smaller than the 
      // typical circle drawn for each vertex: 
      innerPointPaint.setAntiAlias(true); 
      innerPointPaint.setStrokeCap(Paint.Cap.ROUND); 
      innerPointPaint.setColor(Color.WHITE); 
      innerPointPaint.setStrokeWidth(PixelUtils.dpToPix(7)); 
     } 

     public MyLineAndPointFormatter(Context context, int xmlCfgId) { 
      super(context, xmlCfgId); 
     } 

     @Override 
     public Class<? extends SeriesRenderer> getRendererClass() { 
      return MyLineAndPointRenderer.class; 
     } 

     @Override 
     public SeriesRenderer getRendererInstance(XYPlot plot) { 
      return new MyLineAndPointRenderer(plot); 
     } 

     public Paint getInnerPointPaint() { 
      return innerPointPaint; 
     } 
    } 

プロットにあなたのシリーズを追加するときに代わりにLineAndPointFormatterの上記を使用します:

MyLineAndPointFormatter series1Format = 
       new MyLineAndPointFormatter(this, R.xml.my_format); 
重複アイコンを避ける別のアプローチは、カスタム、カスタムLineAndPointFormatterとともにLineAndPointRendererに延びようにすることです

この最後のアプローチはより多くのコードですが、最も効率的で拡張性の高いコードです。

+0

ありがとう、ニック、私はこれを試してみます。 –

+0

Nick、私は2番目の解決策を試みましたが、MyLineAndPointFormatterのコンストラクタでエラーが発生しました(コンテキスト、xmlcfg); @overrideでも "シンボルを解決できません" public SeriesRenderer doGetRendererInstance(XYPlot plot){ return MyLineAndPointRenderer(plot); } "メソッドはスーパークラスのメソッドをオーバーライドしません" –

+0

申し訳ありません - 私はそれを書いたときにdevブランチにいました。このメソッドの正しい名前は 'SeriesRenderer getRendererInstance(XYPlot plot)'です。私はこれを反映するために上記のコードを更新しました。 – Nick