为了账号安全,请及时绑定邮箱和手机立即绑定

曲线分布图

标签:
Android

5bd7179600011cd103630329.jpg

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;

}

}

}

原文链接:http://www.apkbus.com/blog-186545-60056.html

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消