Android Open Source - Android-Charts Pie Chart






From Project

Back to project page Android-Charts.

License

The source code is released under:

Apache License??Version 2.0, January 2004??http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and condi...

If you think the Android project Android-Charts listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/*
 * PieChart.java/*ww  w .j a  v  a  2s .com*/
 * Android-Charts
 *
 * Created by limc on 2011/05/29.
 *
 * Copyright 2011 limc.cn All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * 
 */
package cn.limc.androidcharts.view;

import java.util.List;

import cn.limc.androidcharts.entity.TitleValueColorEntity;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.RectF;
import android.graphics.Paint.Style;
import android.util.AttributeSet;

/**
 * 
 * <p>
 * PieChart is a kind of graph that display all in a pie-like graph, each of the
 * data will get a part of the pie. another kind of pie chart you can refer from
 * PizzaChart
 * </p>
 * <p>
 * PieChart??????????????????????????????????????PizzaChart?????????????????????
 * </p>
 * <p>
 * PieChart?????????????????????????????????PizzaChart
 * </p>
 * 
 * @author limc
 * @version v1.0 2011/05/29 15:15:03
 * 
 */
public class PieChart extends RoundChart {

  /**
   * <p>
   * Data
   * </p>
   * <p>
   * ???
   * </p>
   * <p>
   * ??????
   * </p>
   */
  protected List<TitleValueColorEntity> data;

  /*
   * (non-Javadoc)
   * 
   * @param context
   * 
   * @see cn.limc.androidcharts.view.AbstractBaseChart#BaseChart(Context)
   */
  public PieChart(Context context) {
    super(context);
  }

  /*
   * (non-Javadoc)
   * 
   * @param context
   * 
   * @param attrs
   * 
   * @param defStyle
   * 
   * @see cn.limc.androidcharts.view.AbstractBaseChart#BaseChart(Context,
   * AttributeSet, int)
   */
  public PieChart(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
  }

  /*
   * (non-Javadoc)
   * 
   * @param context
   * 
   * @param attrs
   * 
   * @see cn.limc.androidcharts.view.AbstractBaseChart#BaseChart(Context,
   * AttributeSet)
   */
  public PieChart(Context context, AttributeSet attrs) {
    super(context, attrs);
  }

  /*
   * (non-Javadoc)
   * 
   * <p>Called when is going to draw this chart</p> <p>???????????????????????</p>
   * <p>???????</p>
   * 
   * @param canvas
   * 
   * @see android.view.View#onDraw(android.graphics.Canvas)
   */
  @Override
  protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    // get safe rect
    int rect = super.getWidth() > super.getHeight() ? super.getHeight()
        : super.getWidth();

    // calculate radius length
    longitudeLength = (int) ((rect / 2f) * 0.90);

    // calculate position
    position = new Point((int) (getWidth() / 2f), (int) (getHeight() / 2f));

    // draw this chart
    drawCircle(canvas);

    // draw data on chart
    drawData(canvas);
  }

  /**
   * <p>
   * Draw a circle
   * </p>
   * <p>
   * ???????
   * </p>
   * <p>
   * ?????
   * </p>
   * 
   * @param canvas
   */
  protected void drawCircle(Canvas canvas) {

    Paint mPaintCircleBorder = new Paint();
    mPaintCircleBorder.setColor(circleBorderColor);
    mPaintCircleBorder.setStyle(Style.STROKE);
    mPaintCircleBorder.setStrokeWidth(2);
    mPaintCircleBorder.setAntiAlias(true);

    // draw a circle
    canvas.drawCircle(position.x, position.y, longitudeLength,
        mPaintCircleBorder);
  }

  /**
   * <p>
   * Draw the data
   * </p>
   * <p>
   * ????????????????
   * </p>
   * <p>
   * ???????????
   * </p>
   * 
   * @param canvas
   */
  protected void drawData(Canvas canvas) {
    if (null != data) {
      // sum all data's value
      float sum = 0;
      for (int i = 0; i < data.size(); i++) {
        sum = sum + data.get(i).getValue();
      }

      Paint mPaintFill = new Paint();
      mPaintFill.setStyle(Style.FILL);
      mPaintFill.setAntiAlias(true);

      Paint mPaintBorder = new Paint();
      mPaintBorder.setStyle(Style.STROKE);
      mPaintBorder.setColor(longitudeColor);
      mPaintBorder.setAntiAlias(true);

      int offset = -90;
      // draw arcs of every piece
      for (int j = 0; j < data.size(); j++) {
        TitleValueColorEntity e = data.get(j);

        // get color
        mPaintFill.setColor(e.getColor());

        RectF oval = new RectF(position.x - longitudeLength, position.y
            - longitudeLength, position.x + longitudeLength, position.y
            + longitudeLength);
        int sweep = Math.round(e.getValue() / sum * 360f);
        canvas.drawArc(oval, offset, sweep, true, mPaintFill);
        canvas.drawArc(oval, offset, sweep, true, mPaintBorder);
        offset = offset + sweep;
      }

      float sumvalue = 0f;
      for (int k = 0; k < data.size(); k++) {
        TitleValueColorEntity e = data.get(k);
        float value = e.getValue();
        sumvalue = sumvalue + value;
        float rate = (sumvalue - value / 2) / sum;
        mPaintFill.setColor(Color.BLUE);

        // percentage
        float percentage = (int) (value / sum * 10000) / 100f;

        float offsetX = (float) (position.x - longitudeLength * 0.5
            * Math.sin(rate * -2 * Math.PI));
        float offsetY = (float) (position.y - longitudeLength * 0.5
            * Math.cos(rate * -2 * Math.PI));

        Paint mPaintFont = new Paint();
        mPaintFont.setColor(Color.LTGRAY);

        // draw titles
        String title = e.getTitle();
        float realx = 0;
        float realy = 0;

        // TODO title position
        if (offsetX < position.x) {
          realx = offsetX - mPaintFont.measureText(title) - 5;
        } else if (offsetX > position.x) {
          realx = offsetX + 5;
        }

        if (offsetY > position.y) {
          if (value / sum < 0.2f) {
            realy = offsetY + 10;
          } else {
            realy = offsetY + 5;
          }
        } else if (offsetY < position.y) {
          if (value / sum < 0.2f) {
            realy = offsetY - 10;
          } else {
            realy = offsetY + 5;
          }
        }

        canvas.drawText(title, realx, realy, mPaintFont);
        canvas.drawText(String.valueOf(percentage) + "%", realx,
            realy + 12, mPaintFont);
      }
    }
  }

  /**
   * @return the data
   */
  public List<TitleValueColorEntity> getData() {
    return data;
  }

  /**
   * @param data
   *            the data to set
   */
  public void setData(List<TitleValueColorEntity> data) {
    this.data = data;
  }
}




Java Source Code List

cn.limc.androidcharts.AndroidChartsActivity.java
cn.limc.androidcharts.common.Axis.java
cn.limc.androidcharts.common.ChartRender.java
cn.limc.androidcharts.common.CrossLines.java
cn.limc.androidcharts.common.HorizontalAxis.java
cn.limc.androidcharts.common.IAxis.java
cn.limc.androidcharts.common.IChart.java
cn.limc.androidcharts.common.ICrossLines.java
cn.limc.androidcharts.common.IDataCursor.java
cn.limc.androidcharts.common.IFlexableGrid.java
cn.limc.androidcharts.common.IGrid.java
cn.limc.androidcharts.common.IQuadrant.java
cn.limc.androidcharts.common.IRender.java
cn.limc.androidcharts.common.Quadrant.java
cn.limc.androidcharts.common.SectionDataCursor.java
cn.limc.androidcharts.common.SimpleDataCursor.java
cn.limc.androidcharts.common.VerticalAxis.java
cn.limc.androidcharts.entity.ColoredStickEntity.java
cn.limc.androidcharts.entity.DateValueEntity.java
cn.limc.androidcharts.entity.IChartData.java
cn.limc.androidcharts.entity.IEntity.java
cn.limc.androidcharts.entity.IHasColor.java
cn.limc.androidcharts.entity.IHasDate.java
cn.limc.androidcharts.entity.IMeasurable.java
cn.limc.androidcharts.entity.IStickEntity.java
cn.limc.androidcharts.entity.LineEntity.java
cn.limc.androidcharts.entity.ListChartData.java
cn.limc.androidcharts.entity.MACDEntity.java
cn.limc.androidcharts.entity.OHLCEntity.java
cn.limc.androidcharts.entity.StickEntity.java
cn.limc.androidcharts.entity.TitleValueColorEntity.java
cn.limc.androidcharts.entity.TitleValueEntity.java
cn.limc.androidcharts.event.IDisplayCursorListener.java
cn.limc.androidcharts.event.IGestureDetector.java
cn.limc.androidcharts.event.ISlipable.java
cn.limc.androidcharts.event.ITouchable.java
cn.limc.androidcharts.event.IZoomable.java
cn.limc.androidcharts.event.OnSlipGestureListener.java
cn.limc.androidcharts.event.OnTouchGestureListener.java
cn.limc.androidcharts.event.OnZoomGestureListener.java
cn.limc.androidcharts.event.SlipGestureDetector.java
cn.limc.androidcharts.event.TouchGestureDetector.java
cn.limc.androidcharts.event.ZoomGestureDetector.java
cn.limc.androidcharts.mole.AbstractMole.java
cn.limc.androidcharts.mole.IMoleProvider.java
cn.limc.androidcharts.mole.IMole.java
cn.limc.androidcharts.mole.RectMole.java
cn.limc.androidcharts.mole.StickMole.java
cn.limc.androidcharts.view.AbstractBaseChart.java
cn.limc.androidcharts.view.BOLLMASlipCandleStickChart.java
cn.limc.androidcharts.view.CandleStickChart.java
cn.limc.androidcharts.view.ColoredSlipStickChart.java
cn.limc.androidcharts.view.DataGridChart.java
cn.limc.androidcharts.view.GridChart.java
cn.limc.androidcharts.view.LineChart.java
cn.limc.androidcharts.view.MACDChart.java
cn.limc.androidcharts.view.MACandleStickChart.java
cn.limc.androidcharts.view.MASlipCandleStickChart.java
cn.limc.androidcharts.view.MASlipStickChart.java
cn.limc.androidcharts.view.MAStickChart.java
cn.limc.androidcharts.view.MinusStickChart.java
cn.limc.androidcharts.view.PeriodDataGridChart.java
cn.limc.androidcharts.view.PieChart.java
cn.limc.androidcharts.view.RadarChart.java
cn.limc.androidcharts.view.RoseChart.java
cn.limc.androidcharts.view.RoundChart.java
cn.limc.androidcharts.view.SlipAreaChart.java
cn.limc.androidcharts.view.SlipBandAreaChart.java
cn.limc.androidcharts.view.SlipCandleStickChart.java
cn.limc.androidcharts.view.SlipLineChart.java
cn.limc.androidcharts.view.SlipMinusStickChart.java
cn.limc.androidcharts.view.SlipStickChart.java
cn.limc.androidcharts.view.SpiderWebChart.java
cn.limc.androidcharts.view.StickChart.java