Android Open Source - Android-Charts Spider Web 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

/*
 * SpiderWebChart.java//  w w  w .  ja  v  a2s. c o  m
 * 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.ArrayList;
import java.util.List;

import cn.limc.androidcharts.entity.TitleValueEntity;

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

/**
 * 
 * <p>
 * SpiderWebChart is a kind of graph that display data on web-like graph. each
 * data was displayed in the longitude lines,like a area graph.
 * </p>
 * <p>
 * SpiderWebChart????????????????????????????????????????????????????????????????
 * </p>
 * <p>
 * SpiderWebChart????????????????????????????????????????????????
 * </p>
 * 
 * @author limc
 * @version v1.0 2011/05/30 14:01:54
 * 
 */
public class SpiderWebChart extends RoundChart {

  
  /**
   * <p>
   * default longitude numbers
   * </p>
   * <p>
   * ?????????????????
   * </p>
   * <p>
   * ????????
   * </p>
   */
  public static final int DEFAULT_LONGITUDE_NUM = 5;

  /**
   * <p>
   * default should display latitude lines
   * </p>
   * <p>
   * ?????????
   * </p>
   * <p>
   * ??????????
   * </p>
   */
  public static final boolean DEFAULT_DISPLAY_LATITUDE = true;

  /**
   * <p>
   * default latitude numbers
   * </p>
   * <p>
   * ?????????????????
   * </p>
   * <p>
   * ???????
   * </p>
   */
  public static final int DEFAULT_LATITUDE_NUM = 5;

  /**
   * <p>
   * default color for latitude lines
   * </p>
   * <p>
   * ???????????????
   * </p>
   * <p>
   * ??????
   * </p>
   */
  public static final int DEFAULT_LATITUDE_COLOR = Color.BLACK;

  /**
   * <p>
   * default color for display data
   * </p>
   * <p>
   * ????????????????
   * </p>
   * <p>
   * ???????????
   * </p>
   */
  public static final int[] COLORS = { Color.RED, Color.BLUE, Color.YELLOW };

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

  /**
   * <p>
   * longitude numbers
   * </p>
   * <p>
   * ????????
   * </p>
   * <p>
   * ??????
   * </p>
   */
  protected int longitudeNum = DEFAULT_LONGITUDE_NUM;

  

  /**
   * <p>
   * should display latitude lines?
   * </p>
   * <p>
   * ??????????
   * </p>
   * <p>
   * ????????
   * </p>
   */
  protected boolean displayLatitude = DEFAULT_DISPLAY_LATITUDE;

  /**
   * <p>
   * latitude numbers
   * </p>
   * <p>
   * ????????
   * </p>
   * <p>
   * ?????
   * </p>
   */
  protected int latitudeNum = DEFAULT_LATITUDE_NUM;

  /**
   * <p>
   * color for latitude lines
   * </p>
   * <p>
   * ??????
   * </p>
   * <p>
   * ????
   * </p>
   */
  protected int latitudeColor = DEFAULT_LATITUDE_COLOR;

  /**
   * <p>
   * color for background
   * </p>
   * <p>
   * ??????
   * </p>
   * <p>
   * ?????
   * </p>
   */
  protected int backgroundColor = DEFAULT_BACKGROUND_COLOR;

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

  /*
   * (non-Javadoc)
   * 
   * @param context
   * 
   * @param attrs
   * 
   * @param defStyle
   * 
   * @see cn.limc.androidcharts.view.AbstractBaseChart#BaseChart(Context,AttributeSet,
   * int)
   */
  public SpiderWebChart(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 SpiderWebChart(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.getHeight();

    // calculate longitude length
    longitudeLength = (int) ((rect / 2f) * 0.8);

    // calculate position
    position = new Point((int) (super.getWidth() / 2f),
        (int) (super.getHeight() / 2f + 0.2 * longitudeLength));

    // draw this chart
    drawWeb(canvas);

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

  /**
   * <p>
   * calculate the points to draw the latitude lines
   * </p>
   * <p>
   * ???????????????????????????
   * </p>
   * <p>
   * ??????????????????????????????
   * </p>
   * 
   * @param pos
   *            <p>
   *            latitude degree
   *            </p>
   *            <p>
   *            ??
   *            </p>
   *            <p>
   *            ??
   *            </p>
   * 
   * @return?List<PointF>
   *         <p>
   *         result points
   *         </p>
   *         <p>
   *         ???????????
   *         </p>
   *         <p>
   *         ????
   *         </p>
   */
  protected List<PointF> getWebAxisPoints(float pos) {
    List<PointF> points = new ArrayList<PointF>();
    for (int i = 0; i < longitudeNum; i++) {
      PointF pt = new PointF();
      float offsetX = (float) (position.x - longitudeLength * pos
          * Math.sin(i * 2 * Math.PI / longitudeNum));
      float offsetY = (float) (position.y - longitudeLength * pos
          * Math.cos(i * 2 * Math.PI / longitudeNum));
      pt.set(offsetX, offsetY);

      points.add(pt);
    }
    return points;
  }

  /**
   * <p>
   * calculate the points to draw the data
   * </p>
   * <p>
   * ???????????????????????
   * </p>
   * <p>
   * ?????????????????????????
   * </p>
   * 
   * @param data
   *            <p>
   *            data for calculation
   *            </p>
   *            <p>
   *            ??????
   *            </p>
   *            <p>
   *            ????????
   *            </p>
   * 
   * @return?List<PointF>
   *         <p>
   *         result points
   *         </p>
   *         <p>
   *         ???????????
   *         </p>
   *         <p>
   *         ????
   *         </p>
   */
  protected List<PointF> getDataPoints(List<TitleValueEntity> data) {
    List<PointF> points = new ArrayList<PointF>();
    for (int i = 0; i < longitudeNum; i++) {
      PointF pt = new PointF();
      float offsetX = (float) (position.x - data.get(i).getValue() / 10f
          * longitudeLength
          * Math.sin(i * 2 * Math.PI / longitudeNum));
      float offsetY = (float) (position.y - data.get(i).getValue() / 10f
          * longitudeLength
          * Math.cos(i * 2 * Math.PI / longitudeNum));
      pt.set(offsetX, offsetY);

      points.add(pt);
    }
    return points;
  }

  /**
   * <p>
   * draw spider web
   * </p>
   * <p>
   * ????????
   * </p>
   * <p>
   * ?????
   * </p>
   * 
   * @param canvas
   *            Canvas
   */
  protected void drawWeb(Canvas canvas) {
    Paint mPaintWebFill = new Paint();
    mPaintWebFill.setColor(Color.GRAY);
    mPaintWebFill.setAntiAlias(true);

    Paint mPaintWebBorder = new Paint();
    mPaintWebBorder.setColor(Color.WHITE);
    mPaintWebBorder.setStyle(Style.STROKE);
    mPaintWebBorder.setStrokeWidth(2);
    mPaintWebBorder.setAntiAlias(true);

    Paint mPaintWebInnerBorder = new Paint();
    mPaintWebInnerBorder.setColor(Color.LTGRAY);
    mPaintWebInnerBorder.setStyle(Style.STROKE);
    mPaintWebInnerBorder.setAntiAlias(true);

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

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

    Path mPath = new Path();
    List<PointF> pointList = getWebAxisPoints(1);

    // draw border
    if (null != data) {
      for (int i = 0; i < pointList.size(); i++) {
        PointF pt = pointList.get(i);
        if (i == 0) {
          mPath.moveTo(pt.x, pt.y);
        } else {
          mPath.lineTo(pt.x, pt.y);
        }

        // draw title
        String title = data.get(0).get(i).getTitle();
        float realx = 0;
        float realy = 0;

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

        if (pt.y > position.y) {
          realy = pt.y + 10;
        } else if (pt.y < position.y) {
          realy = pt.y - 2;
        } else {
          realy = pt.y - 5;
        }

        canvas.drawText(title, realx, realy, mPaintFont);
      }
    }
    mPath.close();
    canvas.drawPath(mPath, mPaintWebFill);
    canvas.drawPath(mPath, mPaintWebBorder);

    // draw spider web
    for (int j = 1; j < latitudeNum; j++) {

      Path mPathInner = new Path();
      List<PointF> pointListInner = getWebAxisPoints(j * 1f / latitudeNum);

      for (int i = 0; i < pointListInner.size(); i++) {
        PointF pt = pointListInner.get(i);
        if (i == 0) {
          mPathInner.moveTo(pt.x, pt.y);
        } else {
          mPathInner.lineTo(pt.x, pt.y);
        }
      }
      mPathInner.close();
      canvas.drawPath(mPathInner, mPaintWebInnerBorder);
    }

    // draw longitude lines
    for (int i = 0; i < pointList.size(); i++) {
      PointF pt = pointList.get(i);
      canvas.drawLine(position.x, position.y, pt.x, pt.y, mPaintLine);
    }
  }

  /**
   * <p>
   * Draw the data
   * </p>
   * <p>
   * ????????????????
   * </p>
   * <p>
   * ???????????
   * </p>
   * 
   * @param canvas
   */
  protected void drawData(Canvas canvas) {
    if (null != data) {
      for (int j = 0; j < data.size(); j++) {
        List<TitleValueEntity> list = data.get(j);

        Paint mPaintFill = new Paint();
        mPaintFill.setColor(COLORS[j]);
        mPaintFill.setStyle(Style.FILL);
        mPaintFill.setAntiAlias(true);
        mPaintFill.setAlpha(70);

        Paint mPaintBorder = new Paint();
        mPaintBorder.setColor(COLORS[j]);
        mPaintBorder.setStyle(Style.STROKE);
        mPaintBorder.setStrokeWidth(2);
        mPaintBorder.setAntiAlias(true);

        // paint to draw fonts
        Paint mPaintFont = new Paint();
        mPaintFont.setColor(Color.WHITE);

        // paint to draw points
        Paint mPaintPoint = new Paint();
        mPaintPoint.setColor(COLORS[j]);

        Path mPath = new Path();

        // get points to draw
        List<PointF> pointList = getDataPoints(list);
        // initialize path
        for (int i = 0; i < pointList.size(); i++) {
          PointF pt = pointList.get(i);
          if (i == 0) {
            mPath.moveTo(pt.x, pt.y);
          } else {
            mPath.lineTo(pt.x, pt.y);
          }
          canvas.drawCircle(pt.x, pt.y, 3, mPaintPoint);
        }
        mPath.close();

        canvas.drawPath(mPath, mPaintFill);
        canvas.drawPath(mPath, mPaintBorder);
      }
    }
  }

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

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

  /**
   * @return the longitudeNum
   */
  public int getLongitudeNum() {
    return longitudeNum;
  }

  /**
   * @param longitudeNum
   *            the longitudeNum to set
   */
  public void setLongitudeNum(int longitudeNum) {
    this.longitudeNum = longitudeNum;
  }

  /**
   * @return the displayLatitude
   */
  public boolean isDisplayLatitude() {
    return displayLatitude;
  }

  /**
   * @param displayLatitude
   *            the displayLatitude to set
   */
  public void setDisplayLatitude(boolean displayLatitude) {
    this.displayLatitude = displayLatitude;
  }

  /**
   * @return the latitudeNum
   */
  public int getLatitudeNum() {
    return latitudeNum;
  }

  /**
   * @param latitudeNum
   *            the latitudeNum to set
   */
  public void setLatitudeNum(int latitudeNum) {
    this.latitudeNum = latitudeNum;
  }

  /**
   * @return the latitudeColor
   */
  public int getLatitudeColor() {
    return latitudeColor;
  }

  /**
   * @param latitudeColor
   *            the latitudeColor to set
   */
  public void setLatitudeColor(int latitudeColor) {
    this.latitudeColor = latitudeColor;
  }

}




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