柱状图以及饼图进行数据统计
16lz
2021-01-23
分享一下图形统计的成果:
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;}}
更多相关文章
- Android状态栏颜色修改
- Android 图表
- EditText 各部分颜色设置小结
- Android 5.0 Material 自定义Dialog 背景 字体大小颜色 ui组件颜
- Android中关于颜色的使用
- Android中的Button自定义点击效果之改变点击时按钮的颜色