package com.example.exapmle;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
@SuppressLint("SimpleDateFormat")
public class LineCharView extends View {
//横坐标的数量
private final static int xCount = 7;
//纵坐标的数量
private final static int yCount = 7;
//圆的半径
private final static int RADIUS = 10;
//圆与数据间隔
private final static int DISTANCE = 25;
private int xylinecolor;//xy坐标轴颜色
private int xylinewidth;//xy坐标轴大小
private int xytextcolor;//xy坐标轴文字颜色
private int xytextsize;//xy坐标轴文字大小
private int linecolor;//折线的颜色
private int x_interval;//X坐标间的间隔
private int y_interval;//Y坐标间的间隔
private int bgColor;//背景颜色
private int width;//控件宽度
private int heigth;//控件高度
//左右间隔
private final static int MARGIN = 50;
//数据集合
private List<Integer> mList;
//数据集合中的最大值
private int maxValue = 20000;
//把数据转换为点的集合
private List<Point> mPoints;
//日期转换工具
private SimpleDateFormat sdf;
//文字显示
private List<String> texts;
//圆的宽度
public LineCharView(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray typedArray= context.obtainStyledAttributes(attrs, R.styleable.LineChar);
//x坐标轴颜色
xylinecolor=typedArray.getColor(R.styleable.LineChar_xylinecolor, Color.GRAY);
// x坐标轴宽度
xylinewidth=typedArray.getInt(R.styleable.LineChar_xylinewidth, 5);
//x坐标轴文字颜色
xytextcolor=typedArray.getColor(R.styleable.LineChar_xytextcolor, Color.BLACK);
//x坐标轴文字大小
xytextsize=typedArray.getLayoutDimension(R.styleable.LineChar_xytextsize, 20);
//折线的颜色
linecolor=typedArray.getColor(R.styleable.LineChar_linecolor, Color.RED);
//背景颜色
bgColor=typedArray.getColor(R.styleable.LineChar_bgcolor, Color.WHITE);
typedArray.recycle();
//x坐标点的值
mList=new ArrayList<Integer>();
mPoints = new ArrayList<Point>();
texts = new ArrayList<String>();
sdf = new SimpleDateFormat("dd");
}
public LineCharView(Context context) {
super(context);
}
@SuppressLint("DrawAllocation")
@Override
protected void onLayout(boolean changed, int left, int top, int right,
int bottom) {
if(changed){
width=getWidth();
heigth=getHeight();
x_interval = (int)((width - 2 * MARGIN) / (xCount - 0.5));
y_interval = (int)(heigth / (yCount + 0.5));
setBackgroundColor(bgColor);
}
super.onLayout(changed, left, top, right, bottom);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
test();
drawXY(canvas);
drawTime(canvas);
drawCurveLine(canvas);
drawValue(canvas);
}
/**
* 写数据
* @param canvas
*/
private void drawValue(Canvas canvas) {
if (mPoints.size() > 0) {
int size = mPoints.size();
Paint mPaint = new Paint();
mPaint.setTextSize(xytextsize);
mPaint.setStyle(Paint.Style.FILL);
mPaint.setColor(linecolor);
//画坐标点
for(int i = 0; i < size; i ++){
String text = mList.get(i)+"";
float mDistance = mPaint.measureText(text);
Point mPoint = mPoints.get(i);
float y = mPoint.y - DISTANCE;
if (y < 18) {
y = 75;
}
canvas.drawText(text,(float)mPoint.x - mDistance / 2, y, mPaint);
}
}
}
/**
* 画曲线和圆圈
* @param canvas
*/
private void drawCurveLine(Canvas canvas) {
if (mPoints.size() > 0) {
int size = mPoints.size();
Paint mPaint = new Paint();
mPaint.setTextSize(xytextsize);
mPaint.setStyle(Paint.Style.FILL);
mPaint.setAntiAlias(true);
mPaint.setColor(linecolor);
//画坐标点
for(int i = 0; i < size; i ++){
Point mPoint = mPoints.get(i);
if (i > 0) {
Point lastPoint = mPoints.get(i -1);
canvas.drawLine(lastPoint.x, lastPoint.y, mPoint.x, mPoint.y, mPaint);
}
canvas.drawCircle(mPoint.x, mPoint.y, RADIUS, mPaint);
}
}
}
/**
* 设置时间
* @param canvas
*/
private void drawTime(Canvas canvas) {
Paint paint=new Paint();
paint.setTextSize(xytextsize);
paint.setColor(xytextcolor);
if (texts.size() > 0) {
int size = texts.size();
for(int i= 0;i < size;i++){
String value = texts.get(i);
float distance = paint.measureText(value);
float x = MARGIN + i *x_interval - distance / 2;
float y = (float)(yCount*y_interval);
canvas.drawText(value, x, y, paint);
}
}
}
//画坐标轴
private void drawXY(Canvas canvas){
drawX(canvas);
drawY(canvas);
}
//画X轴坐标点
private void drawX(Canvas canvas){
Paint paint=new Paint();
paint.setColor(xylinecolor);
paint.setStyle(Paint.Style.FILL);
// Log.i("Ryan", "height = "+ heigth + ",width = "+ width + "y_interval = "+ y_interval + ",x_interval = "+ x_interval);
for(int i= 0;i < yCount;i++){
canvas.drawLine(MARGIN, (float)((i + 0.5) * y_interval), (float)(MARGIN + (xCount - 0.5) * x_interval), (float)((i + 0.5) * y_interval), paint);
}
}
//画Y轴坐标点
private void drawY(Canvas canvas) {
Paint paint=new Paint();
paint.setColor(xylinecolor);
paint.setStyle(Paint.Style.FILL);
for(int i= 0;i < xCount;i++){
canvas.drawLine(MARGIN + i * x_interval, 0, MARGIN + i * x_interval, (float)((yCount - 0.5) * y_interval), paint);
}
}
public int getXylinecolor() {
return xylinecolor;
}
public void setXylinecolor(int xylinecolor) {
this.xylinecolor = xylinecolor;
}
public int getXylinewidth() {
return xylinewidth;
}
public void setXylinewidth(int xylinewidth) {
this.xylinewidth = xylinewidth;
}
public int getXytextcolor() {
return xytextcolor;
}
public void setXytextcolor(int xytextcolor) {
this.xytextcolor = xytextcolor;
}
public int getXytextsize() {
return xytextsize;
}
public void setXytextsize(int xytextsize) {
this.xytextsize = xytextsize;
}
public int getLinecolor() {
return linecolor;
}
public void setLinecolor(int linecolor) {
this.linecolor = linecolor;
}
public int getBgColor() {
return bgColor;
}
public void setBgColor(int bgColor) {
this.bgColor = bgColor;
}
/**
* 设置坐标折线图值
*
* @param x_coords 纵坐标点
*/
public void setList(List<Integer> x_coords) {
if (this.mList != null) {
this.mList.clear();
}
if (this.mPoints != null) {
this.mPoints.clear();
}else {
this.mPoints = new ArrayList<Point>();
}
if (this.texts != null) {
this.texts.clear();
}else {
this.texts = new ArrayList<String>();
}
if (null == x_coords) {
x_coords = new ArrayList<Integer>();
}
this.mList=x_coords;
changePoints();
invalidate();
}
/**
* 测试
*/
private void test(){
List<Integer> list = new ArrayList<Integer>();
int value = 1000;
for (int i = 0; i < 4; i++) {
value += i * 500;
list.add(value);
}
setList(list);
}
/**
* 把值转换为点坐标
*/
private void changePoints() {
if (mList.size() > 0) {
int size = mList.size();
maxValue = Collections.max(mList);
if (maxValue == 0) {
maxValue = 20000;
}
double scale = (double)y_interval * (yCount - 1) / maxValue;
Log.i("Ryan", "scale = "+ scale + ",maxValue = "+ maxValue + ",y_interval = "+ y_interval);
long time = System.currentTimeMillis();
for (int i = 0; i < size; i++) {
int value = mList.get(i);
int y = (int)(0.5 * y_interval + (scale * (maxValue - value)));
Point mPoint = new Point(MARGIN + i * x_interval, y);
mPoints.add(mPoint);
//设置时间字符串
if (i == size - 1) {
texts.add("今日");
}else{
texts.add(sdf.format(time - (size - 1 - i) * 24 * 3600 * 1000));
}
}
}
}
/**
* 获取数据集合
* @return
*/
public List<Integer> getList(){
return mList;
}
/**
* 清理数据
*/
public void clearData(){
if (mList != null) {
mList.clear();
mList = null;
}
if (mPoints != null) {
mPoints.clear();
mPoints = null;
}
if (texts != null) {
texts.clear();
texts = null;
}
}
}
共同学习,写下你的评论
评论加载中...
作者其他优质文章