Android新手之旅(9) 自定义的折线图
时间:2022-04-23
本文章向大家介绍Android新手之旅(9) 自定义的折线图,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
希望实现一个折线图,但没有找到合适的控件或者代码,只有一个基本样子的,在它的基础上,进行了一些改进,改得比较灵活,可以传递参数,可以设置位置,坐标轴长度,刻度长度等。
自定义的ChartView.java
package jetz.common;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.View;
public class ChartView extends View{
public int XPoint=40; //原点的X坐标
public int YPoint=260; //原点的Y坐标
public int XScale=55; //X的刻度长度
public int YScale=40; //Y的刻度长度
public int XLength=380; //X轴的长度
public int YLength=240; //Y轴的长度
public String[] XLabel; //X的刻度
public String[] YLabel; //Y的刻度
public String[] Data; //数据
public String Title; //显示的标题
public ChartView(Context context)
{
super(context);
}
public void SetInfo(String[] XLabels,String[] YLabels,String[] AllData,String strTitle)
{
XLabel=XLabels;
YLabel=YLabels;
Data=AllData;
Title=strTitle;
}
@Override
protected void onDraw(Canvas canvas){
super.onDraw(canvas);//重写onDraw方法
//canvas.drawColor(Color.WHITE);//设置背景颜色
Paint paint= new Paint();
paint.setStyle(Paint.Style.STROKE);
paint.setAntiAlias(true);//去锯齿
paint.setColor(Color.BLUE);//颜色
Paint paint1=new Paint();
paint1.setStyle(Paint.Style.STROKE);
paint1.setAntiAlias(true);//去锯齿
paint1.setColor(Color.DKGRAY);
paint.setTextSize(12); //设置轴文字大小
//设置Y轴
canvas.drawLine(XPoint, YPoint-YLength, XPoint, YPoint, paint); //轴线
for(int i=0;i*YScale<YLength ;i++)
{
canvas.drawLine(XPoint,YPoint-i*YScale, XPoint+5, YPoint-i*YScale, paint); //刻度
try
{
canvas.drawText(YLabel[i] , XPoint-22, YPoint-i*YScale+5, paint); //文字
}
catch(Exception e)
{
}
}
canvas.drawLine(XPoint,YPoint-YLength,XPoint-3,YPoint-YLength+6,paint); //箭头
canvas.drawLine(XPoint,YPoint-YLength,XPoint+3,YPoint-YLength+6,paint);
//设置X轴
canvas.drawLine(XPoint,YPoint,XPoint+XLength,YPoint,paint); //轴线
for(int i=0;i*XScale<XLength;i++)
{
canvas.drawLine(XPoint+i*XScale, YPoint, XPoint+i*XScale, YPoint-5, paint); //刻度
try
{
canvas.drawText(XLabel[i] , XPoint+i*XScale-10, YPoint+20, paint); //文字
//数据值
if(i>0&&YCoord(Data[i-1])!=-999&&YCoord(Data[i])!=-999) //保证有效数据
canvas.drawLine(XPoint+(i-1)*XScale, YCoord(Data[i-1]), XPoint+i*XScale, YCoord(Data[i]), paint);
canvas.drawCircle(XPoint+i*XScale,YCoord(Data[i]), 2, paint);
}
catch(Exception e)
{
}
}
canvas.drawLine(XPoint+XLength,YPoint,XPoint+XLength-6,YPoint-3,paint); //箭头
canvas.drawLine(XPoint+XLength,YPoint,XPoint+XLength-6,YPoint+3,paint);
paint.setTextSize(16);
canvas.drawText(Title, 150, 50, paint);
}
private int YCoord(String y0) //计算绘制时的Y坐标,无数据时返回-999
{
int y;
try
{
y=Integer.parseInt(y0);
}
catch(Exception e)
{
return -999; //出错则返回-999
}
try
{
return YPoint-y*YScale/Integer.parseInt(YLabel[1]);
}
catch(Exception e)
{
}
return y;
}
}
--------------------------------------------------------------------------------------------
调用方法:
ChartView myView=new ChartView(this);
myView.SetInfo(
new String[]{"7-11","7-12","7-13","7-14","7-15","7-16","7-17"}, //X轴刻度
new String[]{"","50","100","150","200","250"}, //Y轴刻度
new int[]{15,23,10,36,45,40,12}, //数据
"图标的标题"
);
效果:
- 【前端开发系列】—— 别说你不会Ajax
- 【前端开发系列】—— 通过鼠标浮动改变样式
- 【设计模式】—— 观察者模式Observer
- 【设计模式】—— 备忘录模式Memento
- 【设计模式】—— 中介者模式Mediator
- 【设计模式】—— 迭代模式Iterator
- 【设计模式】—— 解释器模式Interpret
- 【设计模式】—— 命令模式Commond
- 【设计模式】—— 职责链模式ChainOfResponsibility
- 【设计模式】—— 代理模式Proxy
- 【设计模式】—— 享元模式Flyweight
- 【设计模式】—— 外观模式Facade
- 【设计模式】—— 装饰模式Decorator
- 【设计模式】—— 组合模式Composite
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 什么是前缀树--打开了我的新思路
- 一个案例搞懂原码、反码、补码,不懂得请看过来
- 人人都在用,但你却不知道它背后发生了什么——浏览器的工作原理:浏览器幕后揭秘
- 这有一把钥匙,打开MySQL死锁问题!
- 普通人如何全面了解大数据的特点,意义和发展前景
- 面试官问我Linux下常见网络命令
- 最全常用User-Agent
- 聊到JVM(还怕面试官问JVM吗?)
- Android.location.Address类方法获取GPS定位信息
- Python二叉树详解笔记
- 《剑指offer》第七天:二叉树的下一个结点
- 后台登录微信并定时发送消息,消息包括农历、阴历、天气;自动监测是否断线,支持邮箱发送二维码登录;适合于挂在服务器上运行
- 《剑指offer》第八天:二叉树的下一个结点
- 基于python和OpenCV构建智能停车系统
- nvm管理工具