package org.canvasaboutbitmap.view;
/**
*@版权所有者 iamwsbear@gmail.com
*/
import org.canvasaboutbitmap.R;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.Path;
import android.graphics.Point;
import android.util.AttributeSet;
import android.view.View;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class CommonChartView extends View {
private int bgColor = Color.rgb(Integer.parseInt("4d", 16),
Integer.parseInt("af", 16), Integer.parseInt("ea", 16));// 整体的背景色
private int singleColumnFillColor = Color.rgb(Integer.parseInt("e7", 16),
Integer.parseInt("e7", 16), Integer.parseInt("e9", 16));// 单数列的背景色
private int doubleColumnFillColor = Color.rgb(Integer.parseInt("4d", 16),
Integer.parseInt("af", 16), Integer.parseInt("ea", 16));// 单数行的背景色
private int fillDownColor = Color.rgb(Integer.parseInt("45", 16),
Integer.parseInt("64", 16), Integer.parseInt("bf", 16));// 填充下面部分的背景色
private int xyLineColor = Color.rgb(Integer.parseInt("a9", 16),
Integer.parseInt("d8", 16), Integer.parseInt("f5", 16));// 表格的线颜色
private int chartLineColor = Color.WHITE;// 绘制趋势线的颜色
private int shadowLineColor = Color.rgb(Integer.parseInt("1a", 16),
Integer.parseInt("49", 16), Integer.parseInt("84", 16));// 趋势线阴影的颜色
private String yUnit = "";// Y轴单位
private boolean isDrawY = false;// 是否绘制Y轴
private boolean isDrawX = true;// 是否绘制X轴
private boolean isDrawInsideX = true;// 是否绘制内部的X轴
private boolean isDrawInsedeY = false;// 是否绘制内部的Y轴
private boolean isFillDown = false;// 是否填充点的下面部分
private boolean isFillUp = false;// 是否填充点的上面部分(暂未实现)
private boolean isAppendX = true;// X轴是否向左突出一点
private boolean isDemo = true;// 是否demo测试数据
private int ScreenX;// view的宽度
private int ScreenY;// view的高度
private int numberOfX = 6;// 默认X轴放6个值
private int numberOfY = 5;// 默认Y轴放5个值(越多显示的值越精细)
private int paddingTop = 30;// 默认上下左右的padding
private int paddingLeft = 70;// 默认上下左右的padding
private int paddingRight = 30;// 默认上下左右的padding
private int paddingDown = 50;// 默认上下左右的padding
private int appendXLength = 10;// 向左X轴突出的长度
private float maxNumber = 0;// Y轴最大值
private List<List<Float>> pointList;// 传入的数据
private List<Integer> bitmapList;// 传入的颜色值
private List<Integer> lineColorList;
private List<String> titleXList;// 传入的X轴标题
private List<String> titleYList;// 计算得出的Y轴标题
public CommonChartView(Context context) {
super(context);
demo();
}
public CommonChartView(Context context, AttributeSet attr) {
super(context, attr);
demo();
}
private void demo() {
if (!isDemo) {
return;
}
pointList = new ArrayList<List<Float>>();
titleXList = new ArrayList<String>();
lineColorList = new ArrayList<Integer>();
lineColorList.add(Color.WHITE);
lineColorList.add(Color.GREEN);
lineColorList.add(Color.YELLOW);
// TODO 测试
for (int i = 0; i < 3; i++) {
List<Float> pointInList = new ArrayList<Float>();
for (int j = 0; j < 6; j++) {
Random r = new Random();
Float z = r.nextFloat()*100;
pointInList.add(z);
titleXList.add("12." + (i + 1) + "1");
}
pointList.add(pointInList);
}
}
/**
* 计算得出View的宽高
*
* @param widthMeasureSpec
* @param heightMeasureSpec
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int measuredHeight = measureHeight(heightMeasureSpec);
int measuredWidth = measureWidth(widthMeasureSpec);
setMeasuredDimension(measuredWidth, measuredHeight);
ScreenX = measuredWidth;
ScreenY = measuredHeight;
}
private int measureHeight(int measureSpec) {
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
int result = 300;
if (specMode == MeasureSpec.AT_MOST) {
result = specSize;
}
else if (specMode == MeasureSpec.EXACTLY) {
result = specSize;
}
return result;
}
private int measureWidth(int measureSpec) {
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
int result = 450;
if (specMode == MeasureSpec.AT_MOST) {
result = specSize;
}
else if (specMode == MeasureSpec.EXACTLY) {
result = specSize;
}
return result;
}
/**
* 绘画View方法
*
* @param canvas
*/
@SuppressLint("DrawAllocation")
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
maxNumber = 0;
List<Point> listX = initNumberOfX();// 计算出X轴平均后的坐标
List<Point> listY = initNumberOfY();// 计算出Y轴平均后的坐标
canvas.drawColor(bgColor);// 背景色
fillColor(listX, canvas);// 根据需求,对每一个框做不同的填充颜色
// 画背景表格
Paint paint = new Paint();
paint.setColor(xyLineColor);// //表格线颜色
if (isDrawX) {
int appendX = 0;
if (isAppendX) {
appendX = appendXLength;
}
canvas.drawLine(paddingLeft - appendX, paddingTop + listY.get(0).y, listY.get(0).x
+ paddingLeft,
paddingTop + listY.get(0).y, paint);
}
if (isDrawY) {
canvas.drawLine(listX.get(0).x, paddingTop, listX.get(0).x, listX.get(0).y + paddingTop
, paint);
}
if (isDrawInsedeY) {// 绘制纵向的
for (Point point : listX) {
if (!isDrawX) {
isDrawX = !isDrawX;
continue;
}
canvas.drawLine(point.x, paddingTop, point.x, point.y + paddingTop, paint);
}
}
if (isDrawInsideX) {// 绘制横向的
for (Point point : listY) {
if (!isDrawY) {
isDrawY = !isDrawY;
continue;
}
int appendX = 0;
if (isAppendX) {
appendX = appendXLength;
}
canvas.drawLine(paddingLeft - appendX, paddingTop + point.y, point.x + paddingLeft,
paddingTop + point.y, paint);
}
}
setYTitle(listY, canvas);// 画折线图Y的单位,同时计算出最大的Y轴值
List<List<Point>> positionList = countListPosition(listX);// 计算像素位置
drawFill(canvas, positionList);// 填充折线和边框
drawChart(canvas, positionList);// 画折线
drawCicle(canvas, positionList);// 画点
setXTitle(listX, canvas);// 画折线图X的单位
}
private void drawFill(Canvas canvas, List<List<Point>> positionList) {
if (!isFillDown) {
return;
}
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(fillDownColor);
pain
android自定义折线图表格控件
4星 · 超过85%的资源 需积分: 50 148 浏览量
2014-04-16
22:54:43
上传
评论
收藏 106KB RAR 举报
iamws
- 粉丝: 24
- 资源: 5
最新资源
- 卡方数据.sav
- Python实现基于Django框架的二手物品购物网站设计源码+数据库.zip
- 基于Python和Django的二手物品购物网站设计源码+数据库脚本.zip
- 【计算机毕业设计】基于h5的移动网赚项目小程序【源码+lw+部署文档+讲解】
- 【计算机毕业设计】基于ssm-vue的oa系统设计与实现【源码+lw+部署文档+讲解】
- 基于pytorch实现的YOLOV5+SORT的车辆行人目标识别及追踪系统源码.zip
- 【计算机毕业设计】基于servlet+jdbc的在线选房系统设计与实现【源码+lw+部署文档+讲解】
- 投身科技创新,勇担时代先锋.pptx
- 【计算机毕业设计】基于SSM的仿微博系统的设计与实现【源码+lw+部署文档+讲解】
- 使用 Web Components 实现,遵循 Material You 设计规范的 Web 前端组件库
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
- 3
- 4
- 5
- 6
前往页