예제 #1
0
  protected void drawDataSet(Canvas c, PieDataSet dataSet) {

    float angle = mChart.getRotationAngle();

    List<Entry> entries = dataSet.getYVals();
    float[] drawAngles = mChart.getDrawAngles();

    for (int j = 0; j < entries.size(); j++) {

      float newangle = drawAngles[j];
      float sliceSpace = dataSet.getSliceSpace();

      Entry e = entries.get(j);

      // draw only if the value is greater than zero
      if ((Math.abs(e.getVal()) > 0.000001)) {

        if (!mChart.needsHighlight(e.getXIndex(), mChart.getData().getIndexOfDataSet(dataSet))) {

          mRenderPaint.setColor(dataSet.getColor(j));
          mBitmapCanvas.drawArc(
              mChart.getCircleBox(),
              (angle + sliceSpace / 2f) * mAnimator.getPhaseY(),
              (newangle - sliceSpace / 2f) * mAnimator.getPhaseY(),
              true,
              mRenderPaint);
        }
      }

      angle += newangle * mAnimator.getPhaseX();
    }
  }
예제 #2
0
  /**
   * This gives all pie-slices a rounded edge.
   *
   * @param c
   */
  protected void drawRoundedSlices(Canvas c) {

    if (!mChart.isDrawRoundedSlicesEnabled()) return;

    PieDataSet dataSet = mChart.getData().getDataSet();

    if (!dataSet.isVisible()) return;

    PointF center = mChart.getCenterCircleBox();
    float r = mChart.getRadius();

    // calculate the radius of the "slice-circle"
    float circleRadius = (r - (r * mChart.getHoleRadius() / 100f)) / 2f;

    List<Entry> entries = dataSet.getYVals();
    float[] drawAngles = mChart.getDrawAngles();
    float angle = mChart.getRotationAngle();

    for (int j = 0; j < entries.size(); j++) {

      float newangle = drawAngles[j];

      Entry e = entries.get(j);

      // draw only if the value is greater than zero
      if ((Math.abs(e.getVal()) > 0.000001)) {

        float x =
            (float)
                ((r - circleRadius)
                        * Math.cos(Math.toRadians((angle + newangle) * mAnimator.getPhaseY()))
                    + center.x);
        float y =
            (float)
                ((r - circleRadius)
                        * Math.sin(Math.toRadians((angle + newangle) * mAnimator.getPhaseY()))
                    + center.y);

        mRenderPaint.setColor(dataSet.getColor(j));
        mBitmapCanvas.drawCircle(x, y, circleRadius, mRenderPaint);
      }

      angle += newangle * mAnimator.getPhaseX();
    }
  }
예제 #3
0
  @Override
  public void drawValues(Canvas c) {

    PointF center = mChart.getCenterCircleBox();

    // get whole the radius
    float r = mChart.getRadius();
    float rotationAngle = mChart.getRotationAngle();
    float[] drawAngles = mChart.getDrawAngles();
    float[] absoluteAngles = mChart.getAbsoluteAngles();

    float off = r / 10f * 3.6f;

    if (mChart.isDrawHoleEnabled()) {
      off = (r - (r / 100f * mChart.getHoleRadius())) / 2f;
    }

    r -= off; // offset to keep things inside the chart

    PieData data = mChart.getData();
    List<PieDataSet> dataSets = data.getDataSets();
    boolean drawXVals = mChart.isDrawSliceTextEnabled();

    int cnt = 0;

    for (int i = 0; i < dataSets.size(); i++) {

      PieDataSet dataSet = dataSets.get(i);

      if (!dataSet.isDrawValuesEnabled() && !drawXVals) continue;

      // apply the text-styling defined by the DataSet
      applyValueTextStyle(dataSet);

      float lineHeight = Utils.calcTextHeight(mValuePaint, "Q") + Utils.convertDpToPixel(4f);

      List<Entry> entries = dataSet.getYVals();

      for (int j = 0,
              maxEntry =
                  Math.min((int) Math.ceil(entries.size() * mAnimator.getPhaseX()), entries.size());
          j < maxEntry;
          j++) {

        Entry entry = entries.get(j);

        // offset needed to center the drawn text in the slice
        float offset = drawAngles[cnt] / 2;

        // calculate the text position
        float x =
            (float)
                (r
                        * Math.cos(
                            Math.toRadians(
                                (rotationAngle + absoluteAngles[cnt] - offset)
                                    * mAnimator.getPhaseY()))
                    + center.x);
        float y =
            (float)
                (r
                        * Math.sin(
                            Math.toRadians(
                                (rotationAngle + absoluteAngles[cnt] - offset)
                                    * mAnimator.getPhaseY()))
                    + center.y);

        float value =
            mChart.isUsePercentValuesEnabled()
                ? entry.getVal() / data.getYValueSum() * 100f
                : entry.getVal();

        ValueFormatter formatter = dataSet.getValueFormatter();

        boolean drawYVals = dataSet.isDrawValuesEnabled();

        // draw everything, depending on settings
        if (drawXVals && drawYVals) {

          drawValue(c, formatter, value, entry, 0, x, y);

          if (j < data.getXValCount())
            c.drawText(data.getXVals().get(j), x, y + lineHeight, mValuePaint);

        } else if (drawXVals && !drawYVals) {
          if (j < data.getXValCount())
            c.drawText(data.getXVals().get(j), x, y + lineHeight / 2f, mValuePaint);
        } else if (!drawXVals && drawYVals) {

          drawValue(c, formatter, value, entry, 0, x, y + lineHeight / 2f);
        }

        cnt++;
      }
    }
  }