分享一下图形统计的成果:
activity_statistics.xml
Activity文件:
StatisticsActivity.java
import java.util.ArrayList;
import java.util.List;
import com.landtool.gdsc.R;
import com.landtool.gdsc.common.utils.ViewUtil;
import com.landtool.gdsc.db.GeometryDao;
import com.landtool.gdsc.db.WatComInfoNDao;
import com.landtool.gdsc.db.WatComInfoYDao;
import com.landtool.gdsc.view.chart.PieChart;
import com.landtool.gdsc.view.chart.TitleValueColorEntity;
import android.app.Activity;
import android.content.res.Resources;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.TextView;
/**
* 图形统计
* @author cyj
*
*/
public class StatisticsActivity extends Activity {
public static final int MAX_RECT_HEIGHT = 300;
private PieChart piechart;
private int checkedNum;
private int uncheckedNum ;
private int addNum;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_statistics);
checkedNum = countCheckedCompany();
uncheckedNum = countUnCheckedCompany();
addNum = countAddCompany();
initPieChart();
initRectChart();
}
private void initRectChart(){
int sum = checkedNum + uncheckedNum + addNum;
TextView totalCountView = (TextView) findViewById(R.id.count_finish);
totalCountView.setText(checkedNum+"");
TextView checkCountView = (TextView) findViewById(R.id.count_total);
checkCountView.setText("合计数据:"+sum+" 笔");
TextView uncheckCountView = (TextView) findViewById(R.id.count_undo);
uncheckCountView.setText(uncheckedNum+"");
TextView addCountView = (TextView) findViewById(R.id.count_add);
addCountView.setText(addNum+"");
float checkedPer = 0.0F;
float uncheckedPer = 0.0F;
float addPer = 0.0F;
if(0 != sum){
checkedPer = (float)checkedNum/sum;
uncheckedPer = (float)uncheckedNum/sum;
addPer = (float)addNum/sum;
}
TextView checkView = (TextView) findViewById(R.id.block_finish);
LayoutParams paramas1 = checkView.getLayoutParams();
paramas1.height = Math.round(checkedPer*MAX_RECT_HEIGHT);
checkView.setLayoutParams(paramas1);
TextView uncheckView = (TextView) findViewById(R.id.block_undo);
LayoutParams paramas2 = uncheckView.getLayoutParams();
paramas2.height = Math.round(uncheckedPer*MAX_RECT_HEIGHT);
uncheckView.setLayoutParams(paramas2);
TextView addView = (TextView) findViewById(R.id.block_add);
LayoutParams paramas3 = addView.getLayoutParams();
paramas3.height = Math.round(addPer*MAX_RECT_HEIGHT);
addView.setLayoutParams(paramas3);
}
private void initPieChart(){
piechart = (PieChart)findViewById(R.id.piechart);
List data = new ArrayList();
Resources resources = getResources();
data.add(new TitleValueColorEntity("已核查",checkedNum,resources.getColor(android.R.color.holo_green_light)));
data.add(new TitleValueColorEntity("未核查",uncheckedNum,resources.getColor(android.R.color.holo_red_light)));
data.add(new TitleValueColorEntity("新增",addNum,resources.getColor(android.R.color.holo_blue_light)));
piechart.setData(data);
}
private int countCheckedCompany(){
return new WatComInfoYDao().count();
}
private int countUnCheckedCompany(){
return new WatComInfoNDao().count();
}
private int countAddCompany(){
return new GeometryDao().count();
}
public void onBack(View view) {
ViewUtil.hideInput(this,view);
onBackPressed();
}
}
PieChart.java
import java.util.List;
import android.annotation.SuppressLint;
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;
public class PieChart extends BaseChart {
/**
* 默认图表标题
*/
public static final String DEFAULT_TITLE = "Pie Chart";
/**
* 默认是否显示经线
*/
public static final boolean DEFAULT_DISPLAY_RADIUS = true;
/**
* 默认半径长度
*/
public static final int DEFAULT_RADIUS_LENGTH = 80;
/**
* 默认经线颜色
*/
public static final int DEFAULT_RADIUS_COLOR = Color.WHITE;
/**
* 默认圆弧的颜色
*/
public static final int DEFAULT_CIRCLE_BORDER_COLOR = Color.WHITE;
/**
* 默认绘图中心位置
*/
public static final Point DEFAULT_POSITION = new Point(0, 0);
/**
* 图表数据
*/
private List data;
/**
* 图表标题
*/
private String title = DEFAULT_TITLE;
/**
* 绘图中心位置
*/
private Point position = DEFAULT_POSITION;
/**
* 半径长度
*/
private int radiusLength = DEFAULT_RADIUS_LENGTH;
/**
* 经线颜色
*/
private int radiusColor = DEFAULT_RADIUS_COLOR;
/**
* 圆弧的颜色
*/
private int circleBorderColor = DEFAULT_CIRCLE_BORDER_COLOR;
/**
* 是否显示经线
*/
private boolean displayRadius = DEFAULT_DISPLAY_RADIUS;
public PieChart(Context context) {
super(context);
}
public PieChart(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public PieChart(Context context, AttributeSet attrs) {
super(context, attrs);
}
/**
* 绘制图表时调用
*/
@SuppressLint("DrawAllocation")
@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
radiusLength = (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);
}
/**
* 绘制一个圆
* @param canvas
*/
protected void drawCircle(Canvas canvas) {
Paint mPaintCircleBorder = new Paint();
mPaintCircleBorder.setColor(Color.WHITE);
mPaintCircleBorder.setStyle(Style.STROKE);
mPaintCircleBorder.setStrokeWidth(2);
mPaintCircleBorder.setAntiAlias(true);
// draw a circle
canvas.drawCircle(position.x, position.y, radiusLength,
mPaintCircleBorder);
}
/**
* 将数据绘制在图表上
* @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(radiusColor);
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 - radiusLength, position.y
- radiusLength, position.x + radiusLength, position.y
+ radiusLength);
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 - radiusLength * 0.5
* Math.sin(rate * -2 * Math.PI));
float offsetY = (float) (position.y - radiusLength * 0.5
* Math.cos(rate * -2 * Math.PI));
Paint mPaintFont = new Paint();
mPaintFont.setColor(Color.BLACK);
mPaintFont.setTextSize(20);
// 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 + 18, mPaintFont);
}
}
}
public List getData() {
return data;
}
public void setData(List data) {
this.data = data;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public Point getPosition() {
return position;
}
public void setPosition(Point position) {
this.position = position;
}
public int getRadiusLength() {
return radiusLength;
}
public void setRadiusLength(int radiusLength) {
this.radiusLength = radiusLength;
}
public int getRadiusColor() {
return radiusColor;
}
public void setRadiusColor(int radiusColor) {
this.radiusColor = radiusColor;
}
public int getCircleBorderColor() {
return circleBorderColor;
}
public void setCircleBorderColor(int circleBorderColor) {
this.circleBorderColor = circleBorderColor;
}
public boolean isDisplayRadius() {
return displayRadius;
}
public void setDisplayRadius(boolean displayRadius) {
this.displayRadius = displayRadius;
}
}
import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.View;
public class BaseChart extends View {
/*
* (non-Javadoc)
*
* @param context
*
* @see android.view.View#BaseChart(Context)
*/
public BaseChart(Context context) {
super(context);
}
/*
* (non-Javadoc)
*
* @param context
*
* @param attrs
*
* @see android.view.View#BaseChart(Context, AttributeSet)
*/
public BaseChart(Context context, AttributeSet attrs) {
super(context, attrs);
}
/*
* (non-Javadoc)
*
* @param context
*
* @param attrs
*
* @param defStyle
*
* @see android.view.View#BaseChart(Context, AttributeSet, int)
*/
public BaseChart(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
/*
* (non-Javadoc)
*
* @param widthMeasureSpec
*
* @param heightMeasureSpec
*
* @see android.view.View#onMeasure(int, int)
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
setMeasuredDimension(measureWidth(widthMeasureSpec),
measureHeight(heightMeasureSpec));
}
/*
* (non-Javadoc)
*
* @param gainFocus
*
* @param direction
*
* @param previouslyFocusedRect
*
* @see android.view.View#onFocusChanged(boolean, int,
* android.graphics.Rect)
*/
@Override
protected void onFocusChanged(boolean gainFocus, int direction,
Rect previouslyFocusedRect) {
super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);
}
private int measureWidth(int measureSpec) {
int result = 0;
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
if (specMode == MeasureSpec.EXACTLY) {
result = specSize;
} else if (specMode == MeasureSpec.AT_MOST) {
result = Math.min(result, specSize);
}
return result;
}
private int measureHeight(int measureSpec) {
int result = 0;
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
if (specMode == MeasureSpec.EXACTLY) {
result = specSize;
} else if (specMode == MeasureSpec.AT_MOST) {
result = Math.min(result, specSize);
}
return result;
}
}
TitleValueColorEntity.java
public class TitleValueColorEntity extends TitleValueEntity {
/**
* 颜色
*/
private int color;
/**
*
* @param title
* 标题
* @param value
* 值
* @param color
* 颜色
*/
public TitleValueColorEntity(String title, float value, int color) {
super(title, value);
this.color = color;
}
public TitleValueColorEntity() {
super();
}
public int getColor() {
return color;
}
public void setColor(int color) {
this.color = color;
}
}
public class TitleValueEntity {
/**
* 标题
*/
private String title;
/**
* 值
*/
private float value;
public TitleValueEntity(String title, float value) {
super();
this.title = title;
this.value = value;
}
public TitleValueEntity() {
super();
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public float getValue() {
return value;
}
public void setValue(float value) {
this.value = value;
}
}