【问题标题】:Mp android chart, bar chart with bar gradient backgroundMp android图表,条形渐变背景条形图
【发布时间】:2020-05-29 11:50:44
【问题描述】:

亲爱的社区,我面临以下问题,我正在使用此处提供的 MP android Chart 库创建条形图:https://github.com/PhilJay/MPAndroidChart。

我想为我的条设置渐变背景,使用以下代码我能够设置渐变背景并获得以下结果。

val barDataSet = BarDataSet(dummyYValues, "DataSet 1")
barDataSet.axisDependency = YAxis.AxisDependency.RIGHT

val startColor = ContextCompat.getColor(context!!, R.color.top_graph)
val endColor = ContextCompat.getColor(context!!, R.color.bottom_graph)

val gradientColors: MutableList<GradientColor> = ArrayList()
gradientColors.add(GradientColor(endColor, startColor))

barDataSet.gradientColors = gradientColors
dataSets.add(barDataSet)
val finalData = BarData(dataSets)
finalData.barWidth =(0.3f)

我正在尝试归档类似以下示例的内容

如果您看到主要区别在于以统一方式显示渐变颜色的预期行为,则意味着它根据图表而不是根据值显示颜色。

另外,如果有人知道如何在条形顶部添加圆角,那也会很有帮助。 谢谢。

【问题讨论】:

    标签: android mpandroidchart


    【解决方案1】:

    我不知道最佳解决方案,但我将 BarChart 渲染器类复制为:

    public class RoundedBarChartRenderer extends BarLineScatterCandleBubbleRenderer{
        protected void drawDataSet(Canvas c, IBarDataSet dataSet, int index) {
    
        //Use this to replace the line c.drawRect(.....)
        RectF rectF = new RectF(buffer.buffer[j], buffer.buffer[j + 1], buffer.buffer[j + 2],
            buffer.buffer[j + 3]);
        c.drawRoundRect(rectF,15f,15f, mRenderPaint);
    }}
    

    像这样使用上面的类:

    chart.renderer = RoundedBarChartRenderer(
        chart,
        chart.animator,
        chart.viewPortHandler
    )
    

    【讨论】:

      【解决方案2】:

      要为条形图创建渐变背景,请使用以下代码。

      barDataSet.setGradientColor(Color.parseColor("#00FF5722"),Color.parseColor("#FFFF5722");
      

      然后使用它来弯曲条形图的角。我从另一个来源得到了这个,它工作得很好。这是代码。

      CustomBarChartRender barChartRender = new CustomBarChartRender(barchart,barchart.getAnimator(), barchart.getViewPortHandler());
      barChartRender.setRadius(12);
      barchart.setRenderer(barChartRender);
      

      创建一个新类 CustomBarChartRender 并添加它,

      public class CustomBarChartRender extends BarChartRenderer {
      
          private final RectF mBarShadowRectBuffer = new RectF();
      
          private int mRadius;
      
          public CustomBarChartRender(BarDataProvider chart, ChartAnimator animator, ViewPortHandler viewPortHandler) {
              super(chart, animator, viewPortHandler);
          }
      
          public void setRadius(int mRadius) {
              this.mRadius = mRadius;
          }
      
          protected void drawDataSet(Canvas c, @NotNull IBarDataSet dataSet, int index) {
      
              Transformer trans = mChart.getTransformer(dataSet.getAxisDependency());
              mBarBorderPaint.setColor(dataSet.getBarBorderColor());
              mBarBorderPaint.setStrokeWidth(Utils.convertDpToPixel(dataSet.getBarBorderWidth()));
              mShadowPaint.setColor(dataSet.getBarShadowColor());
              boolean drawBorder = dataSet.getBarBorderWidth() > 0f;
      
              float phaseX = mAnimator.getPhaseX();
              float phaseY = mAnimator.getPhaseY();
      
              if (mChart.isDrawBarShadowEnabled()) {
                  mShadowPaint.setColor(dataSet.getBarShadowColor());
      
                  BarData barData = mChart.getBarData();
      
                  float barWidth = barData.getBarWidth();
                  float barWidthHalf = barWidth / 2.0f;
                  float x;
      
                  int i = 0;
                  double count = Math.min(Math.ceil((int) (double) ((float) dataSet.getEntryCount() * phaseX)), dataSet.getEntryCount());
                  while (i < count) {
      
                      BarEntry e = dataSet.getEntryForIndex(i);
      
                      x = e.getX();
      
                      mBarShadowRectBuffer.left = x - barWidthHalf;
                      mBarShadowRectBuffer.right = x + barWidthHalf;
      
                      trans.rectValueToPixel(mBarShadowRectBuffer);
      
                      if (!mViewPortHandler.isInBoundsLeft(mBarShadowRectBuffer.right)) {
                          i++;
                          continue;
                      }
      
                      if (!mViewPortHandler.isInBoundsRight(mBarShadowRectBuffer.left))
                          break;
      
                      mBarShadowRectBuffer.top = mViewPortHandler.contentTop();
                      mBarShadowRectBuffer.bottom = mViewPortHandler.contentBottom();
      
                      c.drawRoundRect(mBarRect, mRadius, mRadius, mShadowPaint);
      
                      /*if (mRadius > 0)
                          c.drawRoundRect(mBarRect, mRadius, mRadius, mHighlightPaint);
                      else
                          c.drawRect(mBarRect, mHighlightPaint);*/
      
                      i++;
                  }
              }
      
              // initialize the buffer
              BarBuffer buffer = mBarBuffers[index];
              buffer.setPhases(phaseX, phaseY);
              buffer.setDataSet(index);
              buffer.setInverted(mChart.isInverted(dataSet.getAxisDependency()));
              buffer.setBarWidth(mChart.getBarData().getBarWidth());
      
              buffer.feed(dataSet);
      
              trans.pointValuesToPixel(buffer.buffer);
      
              boolean isSingleColor = dataSet.getColors().size() == 1;
      
              if (isSingleColor) {
                  mRenderPaint.setColor(dataSet.getColor());
              }
      
      
              int j = 0;
              while (j < buffer.size()) {
      
                  if (!mViewPortHandler.isInBoundsLeft(buffer.buffer[j + 2])) {
                      j += 4;
                      continue;
                  }
      
                  if (!mViewPortHandler.isInBoundsRight(buffer.buffer[j]))
                      break;
      
                  if (!isSingleColor) {
                      // Set the color for the currently drawn value. If the index
                      // is out of bounds, reuse colors.
                      mRenderPaint.setColor(dataSet.getColor(j / 4));
                  }
      
                  if (dataSet.getGradientColor() != null) {
                      GradientColor gradientColor = dataSet.getGradientColor();
                      mRenderPaint.setShader(new LinearGradient(
                              buffer.buffer[j],
                              buffer.buffer[j + 3],
                              buffer.buffer[j],
                              buffer.buffer[j + 1],
                              gradientColor.getStartColor(),
                              gradientColor.getEndColor(),
                              android.graphics.Shader.TileMode.MIRROR));
                  }
      
                  if (dataSet.getGradientColors() != null) {
                      mRenderPaint.setShader(new LinearGradient(
                              buffer.buffer[j],
                              buffer.buffer[j + 3],
                              buffer.buffer[j],
                              buffer.buffer[j + 1],
                              dataSet.getGradientColor(j / 4).getStartColor(),
                              dataSet.getGradientColor(j / 4).getEndColor(),
                              Shader.TileMode.MIRROR));
                  }
                  Path path2 = roundRect(new RectF(buffer.buffer[j], buffer.buffer[j + 1], buffer.buffer[j + 2],
                          buffer.buffer[j + 3]), mRadius, mRadius);
                  c.drawPath(path2, mRenderPaint);
                  if (drawBorder) {
                      Path path = roundRect(new RectF(buffer.buffer[j], buffer.buffer[j + 1], buffer.buffer[j + 2],
                              buffer.buffer[j + 3]), mRadius, mRadius);
                      c.drawPath(path, mBarBorderPaint);
                  }
      
                  j += 4;
              }
      
          }
      
          @NotNull
          private Path roundRect(@NotNull RectF rect, float rx, float ry) {
              float top = rect.top;
              float left = rect.left;
              float right = rect.right;
              float bottom = rect.bottom;
              Path path = new Path();
              if (rx < 0) rx = 0;
              if (ry < 0) ry = 0;
              float width = right - left;
              float height = bottom - top;
              if (rx > width / 2) rx = width / 2;
              if (ry > height / 2) ry = height / 2;
              float widthMinusCorners = (width - (2 * rx));
              float heightMinusCorners = (height - (2 * ry));
      
              path.moveTo(right, top + ry);
              path.rQuadTo(0, -ry, -rx, -ry);//top-right corner
              path.rLineTo(-widthMinusCorners, 0);
              path.rQuadTo(-rx, 0, -rx, ry); //top-left corner
              path.rLineTo(0, heightMinusCorners);
      
              path.rLineTo(0, ry);
              path.rLineTo(rx, 0);
      
              path.rLineTo(widthMinusCorners, 0);
              path.rLineTo(rx, 0);
              path.rLineTo(0, -ry);
      
              path.rLineTo(0, -heightMinusCorners);
      
              path.close();//Given close, last lineto can be removed.
      
              return path;
          }}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-14
        • 1970-01-01
        • 1970-01-01
        • 2021-12-09
        • 1970-01-01
        相关资源
        最近更新 更多