2013-03-13 23 views
5

Używam AchartEngine do rysowania wykresu liniowego.Kolor gradientu dla wykresu liniowego wewnątrz AchartEngine

co mam zrobić: I chcesz, aby graf krawędziowy ze Korzystanie Achart Engine. Ale z włączonym Różnym gradientem kolorów, tak jak robimy to w Barchart.

Mam utworzyć wykres liniowy bez obawy.

Wiem Gradient jest obsługiwany tylko przez zakres wykresu słupkowego w silniku Achart. Ale chociaż powinno istnieć jakieś obejście tego, jeśli ktoś ma.

mam Czy mój kod jest jak poniżej:

public GraphicalView graph(Context context) { 
     String[] titles = new String[] { "Nike Line Graph" }; 
     List<double[]> values = new ArrayList<double[]>(); 

     values.add(new double[] { 14230, 12300, 14240, 15244, 14900, 12200, 
       11030, 12000, 12500, 15500, 14600, 15000 }); 


     int length = values.get(0).length; 

     Log.d("****length*********", "" + length); 

     int[] colors = new int[] { Color.GREEN }; 
     PointStyle[] styles = new PointStyle[] { PointStyle.POINT }; 

     XYMultipleSeriesRenderer renderer = buildRenderer(colors, styles); 
     setChartSettings(renderer, "Monthly sales in the last 2 years", 
       "Month", "Units sold", 0.75, 12.25, 10000, 19000, 
       Color.argb(0x00, 0x01, 0x01, 0x01), 
       Color.argb(0x00, 0x01, 0x01, 0x01)); 

     renderer.setChartTitleTextSize(20); 
     renderer.setTextTypeface("sans_serif", Typeface.BOLD); 
     renderer.setLabelsTextSize(0f); 
     renderer.setLabelsColor(Color.argb(0x00, 0x01, 0x01, 0x01)); 
     renderer.setAxisTitleTextSize(15); 
     renderer.setApplyBackgroundColor(true); 
     renderer.setBackgroundColor(Color.argb(0x00, 0x01, 0x01, 0x01)); 
     renderer.setLegendTextSize(15); 
     renderer.setScale(10); 
     renderer.setShowAxes(false); 
     renderer.setXLabelsColor(Color.argb(0x00, 0x01, 0x01, 0x01)); 
     renderer.setYLabelsColor(0, Color.argb(0x00, 0x01, 0x01, 0x01)); 
     renderer.setMarginsColor(Color.argb(0x00, 0x01, 0x01, 0x01)); 

     renderer.setPanEnabled(false, false); 
     renderer.setZoomEnabled(false, false); 
     length = renderer.getSeriesRendererCount(); 
     SimpleSeriesRenderer r1 = new SimpleSeriesRenderer(); 

     r1.setGradientEnabled(true); 
     r1.setGradientStart(-50, Color.BLACK); 
     r1.setGradientStop(50, Color.GREEN); 



     Log.d("****length*********", "" + length); 

     for (int i = 0; i < length; i++) { 
      XYSeriesRenderer r = (XYSeriesRenderer) renderer 
        .getSeriesRendererAt(i); 
      r.setLineWidth(5f); 
     } 

     GraphicalView v = ChartFactory.getCubeLineChartView(context, 
       buildBarDataset(titles, values), renderer, 0.5f); 
     return v; 

    } 

Z Mając metoda:

protected XYMultipleSeriesRenderer buildRenderer(int[] colors, 
      PointStyle[] styles) { 
     XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer(); 
     setRenderer(renderer, colors, styles); 
     return renderer; 
    } 

    protected void setRenderer(XYMultipleSeriesRenderer renderer, int[] colors, 
      PointStyle[] styles) { 
     renderer.setAxisTitleTextSize(16); 
     renderer.setChartTitleTextSize(20); 
     renderer.setLabelsTextSize(15); 
     renderer.setLegendTextSize(15); 
     renderer.setPointSize(5f); 

     renderer.setMargins(new int[] { 20, 30, 15, 20 }); 
     int length = colors.length; 
     for (int i = 0; i < length; i++) { 

      XYSeriesRenderer r = new XYSeriesRenderer(); 
       r.setColor(colors[i]); 
      r.setPointStyle(styles[i]);  
      renderer.addSeriesRenderer(r);  

     } 

Co ja dostaję to ScreenShot jak poniżej:

enter image description here

Czego chcę:

enter image description here

Pytanie: chcę dodać Gradient kolorów do tego wykresu liniowego. od jednego koloru do drugiego.

Każda pomoc będzie wysoko ceniona.

Dziękujemy z góry.

+1

Witam, znalazłeś odpowiedź? Szukam tego samego. –

+0

wszystko już rozwiązane? Tego też potrzebuję. – acntwww

Odpowiedz

0

Użyj kilku serii, z których każda ma własny kolor.

0

Jeśli nadal szukasz odpowiedzi: &, każdy znajdzie to samo, więc odpowiedź brzmi: tak, możemy ustawić gradient na wykres liniowy. Roztwór do podklasy Linechart i zastąpić metodę drawSeries samo jak po

@Override 
    public void drawSeries(Canvas canvas, Paint paint, float[] points, 
        SimpleSeriesRenderer seriesRenderer, float yAxisValue, int seriesIndex, int startIndex) { 
      int length = points.length; 
      XYSeriesRenderer renderer = (XYSeriesRenderer) seriesRenderer; 
      float lineWidth = paint.getStrokeWidth(); 
      paint.setStrokeWidth(renderer.getLineWidth()); 
      if (renderer.isFillBelowLine() || renderer.isGradientEnabled()) { 
        int pLength = points.length; 
        float[] fillPoints = new float[pLength + 4]; 
        System.arraycopy(points, 0, fillPoints, 0, length); 
        fillPoints[0] = points[0] + 1; 
        fillPoints[length] = fillPoints[length - 2]; 
        fillPoints[length + 1] = yAxisValue; 
        fillPoints[length + 2] = fillPoints[0]; 
        fillPoints[length + 3] = fillPoints[length + 1]; 
        float max = 0; 
        for (int i = 0; i < length + 4; i += 2) { 
          if (fillPoints[i + 1] < 0) { 
            fillPoints[i + 1] = 0; 
          } 
          else if (fillPoints[i + 1] > max) { 
            max = fillPoints[i + 1]; 
          } 
        } 
        paint.setStyle(Style.FILL); 
        if (renderer.isGradientEnabled()) { 
          Shader s = paint.getShader(); 
          // Create gradient from values set in renderer 
          paint.setShader(new LinearGradient(0, (float)(renderer.getGradientStartValue() * max), 0, (float)(renderer.getGradientStopValue() * max), 
              renderer.getGradientStartColor(), renderer.getGradientStopColor(), Shader.TileMode.MIRROR)); 
          drawPath(canvas, fillPoints, paint, true); 
          // Restore paint's shader to previous value (null) 
          paint.setShader(s); 
        } 
        else { 
          paint.setColor(renderer.getFillBelowLineColor()); 
          drawPath(canvas, fillPoints, paint, true); 
        } 
      } 
      paint.setColor(seriesRenderer.getColor()); 
      paint.setStyle(Style.STROKE); 
      drawPath(canvas, points, paint, false); 
      paint.setStrokeWidth(lineWidth); 
    } 

Jeśli chcesz wyglądać stosując surowe pasty wykorzystanie danych następujący kod:

@Override 
public void drawSeries(Canvas canvas, Paint paint, float[] points, 
     SimpleSeriesRenderer seriesRenderer, float yAxisValue, int seriesIndex, int startIndex) { 
    int length = points.length; 
    XYSeriesRenderer renderer = (XYSeriesRenderer) seriesRenderer; 
    float lineWidth = paint.getStrokeWidth(); 
    paint.setStrokeWidth(renderer.getLineWidth()); 
    if (renderer.isFillBelowLine() || renderer.isGradientEnabled()) { 
     int pLength = points.length; 
     float[] fillPoints = new float[pLength + 4]; 
     System.arraycopy(points, 0, fillPoints, 0, length); 
     fillPoints[0] = points[0] + 1; 
     fillPoints[length] = fillPoints[length - 2]; 
     fillPoints[length + 1] = yAxisValue; 
     fillPoints[length + 2] = fillPoints[0]; 
     fillPoints[length + 3] = fillPoints[length + 1]; 
     float max = 0; 
     for (int i = 0; i < length + 4; i += 2) { 
      if (fillPoints[i + 1] < 0) { 
       fillPoints[i + 1] = 0; 
      } 
      else if (fillPoints[i + 1] > max) { 
       max = fillPoints[i + 1]; 
      } 
     } 
     paint.setStyle(Style.FILL); 
     if (renderer.isGradientEnabled()) { 
      Shader s = paint.getShader(); 
      // Create gradient from values set in renderer 
      paint.setShader(new LinearGradient(0, (float)(renderer.getGradientStartValue() * max), 0, (float)(renderer.getGradientStopValue() * max), 
        renderer.getGradientStartColor(), renderer.getGradientStopColor(), Shader.TileMode.MIRROR)); 
      drawPath(canvas, fillPoints, paint, true); 
      // Restore paint's shader to previous value (null) 
      paint.setShader(s); 
     } 
     else { 
      paint.setColor(renderer.getFillBelowLineColor()); 
      drawPath(canvas, fillPoints, paint, true); 
     } 
    } 
    paint.setColor(seriesRenderer.getColor()); 
    paint.setStyle(Style.STROKE); 
    drawPath(canvas, points, paint, false); 
    paint.setStrokeWidth(lineWidth); 
} 

Jeśli jej pomóc daj mi znać. ALBO już to rozwiązałeś, daj mi znać, jak to zrobiłeś.

Powiązane problemy