分享一下图形统计的成果:

activity_statistics.xml

<?xml version="1.0" encoding="utf-8"?>            
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;@Overrideprotected 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")@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);// get safe rectint rect = super.getWidth() > super.getHeight() ? super.getHeight(): super.getWidth();// calculate radius lengthradiusLength = (int) ((rect / 2f) * 0.90);// calculate positionposition = new Point((int) (getWidth() / 2f), (int) (getHeight() / 2f));// draw this chartdrawCircle(canvas);// draw data on chartdrawData(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 circlecanvas.drawCircle(position.x, position.y, radiusLength,mPaintCircleBorder);}/** * 将数据绘制在图表上 * @param canvas */protected void drawData(Canvas canvas) {if (null != data) {// sum all data's valuefloat 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 piecefor (int j = 0; j < data.size(); j++) {TitleValueColorEntity e = data.get(j);// get colormPaintFill.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);// percentagefloat 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 titlesString title = e.getTitle();float realx = 0;float realy = 0;// TODO title positionif (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;}}

BaseChart.java:

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) */@Overrideprotected 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) */@Overrideprotected 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;}}

TitleValueEntity.java

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;}}


柱状图以及饼图进行数据统计_第1张图片


更多相关文章

  1. Android状态栏颜色修改
  2. Android 图表
  3. EditText 各部分颜色设置小结
  4. Android 5.0 Material 自定义Dialog 背景 字体大小颜色 ui组件颜
  5. Android中关于颜色的使用
  6. Android中的Button自定义点击效果之改变点击时按钮的颜色

随机推荐

  1. android adb启动失败问题 adb server is
  2. Android总Activity的启动模式分为四种
  3. Android学习笔记Android线程模型解析
  4. 安卓-菜单简述
  5. 关于Android的Animation使用(XML)
  6. android 资源文件命名规则 drawable mipm
  7. 什么是aidl?Android AIDL详解
  8. 在程序中用Java代码设置android:gravity,
  9. Android(安卓)多个Fragment嵌套导致的三
  10. Android studio导入开源项目