Android实现绘制折线图APP代码
作者:.'~'. 发布时间:2022-12-10 07:50:02
标签:Android,折线图
一.总体设计
1.寻找规律,公式化的生成坐标系。
2.将生成坐标系的关键参数设置为可自定义,从而可变的可以生成自己想要的坐标系。
3.将需要绘制的点绘制在坐标系中并生成折现图。
二.具体模块实现
1.坐标系的生成:
public void chart(){
imageView=(ImageView)findViewById(R.id.image);
newb = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
canvasTemp = new Canvas(newb);
//Canvas canvasTemp2=new Canvas(newb);
canvasTemp.drawColor(Color.TRANSPARENT);
p = new Paint();
//防锯齿
p.setAntiAlias(true);
p.setStyle(Paint.Style.STROKE);//STROKE,FILL
p.setStrokeWidth(5);
p.setColor(Color.LTGRAY);
p.setTextAlign(Paint.Align.CENTER);
p.setTextSize(40);
p.setColor(Color.BLACK);
p.setStyle(Paint.Style.FILL);//STROKE,FILL
p.setStrokeWidth(2);
p2=p;
//绘制表格
canvasTemp.drawText("0", startx1-10, starty1+30, p);//原点
canvasTemp.drawLine(startx1,starty1, endx1+50,starty1,p);// 绘制x轴
canvasTemp.drawText("x", endx1+50+10, starty1+35, p); //标记x轴
canvasTemp.drawLine(startx1,starty1, startx1,endy1-50,p);// 绘制y轴
canvasTemp.drawText("y", startx1-15,endy1-50, p); //标记y轴
//绘制x y轴箭头
canvasTemp.drawLine(endx1+50,starty1, endx1+50-10,starty1-10,p);
canvasTemp.drawLine(endx1+50,starty1, endx1+50-10,starty1+10,p);
canvasTemp.drawLine(startx1,endy1-50, startx1-10,endy1-50+10,p);
canvasTemp.drawLine(startx1,endy1-50, startx1+10,endy1-50+10,p);
//绘制x轴间隔线
for(int i=1;i<=allX;i++){
canvasTemp.drawLine(startx1+xinterval*i,starty1, startx1+xinterval*i,starty1-10,p);
if(allX>30){
p2.setTextSize(20);
}
canvasTemp.drawText(String.valueOf(i), startx1+xinterval*i, starty1+35, p2);
}
//绘制y轴间隔线
for(int i=1;i<=allY;i++){
canvasTemp.drawLine(startx1,starty1-yinterval*i, startx1+10,starty1-yinterval*i,p);
if(allX>25){
p2.setTextSize(20);
}else{
p2.setTextSize(35);
canvasTemp.drawText(String.valueOf( (i*fully/allY)), startx1-55, starty1-yinterval*i+10, p2);
}
}
imageView.setImageBitmap(newb);
}
2.自定义坐标系参数获取并绘制:
public void comfir(View view) {
EditText numberx=(EditText)findViewById(R.id.numberx);
EditText numbery=(EditText)findViewById(R.id.numbery);
EditText maxy=(EditText)findViewById(R.id.maxy);
if(!numberx.getText().toString().trim().equals("")&&!numbery.getText().toString().trim().equals("")&&!maxy.getText().toString().trim().equals("")){
/*//判断输入框中内容是否为空的错误方法:
numberx.getText()!=null;
numberx.getText().toString()!=null;
numberx.getText().toString().equals("");*/
allX= Integer.valueOf(String.valueOf(numberx.getText()));
allY= Integer.valueOf(String.valueOf(numbery.getText()));
fully= Integer.valueOf(String.valueOf(maxy.getText()));
xinterval=(endx1-startx1)/allX;
yinterval=(starty1-endy1)/allY;
//rule1=(starty1-endy1)/allY;
//rule2=(starty1-endy1)/fully;
mypoint=new float[allX];
all=0;
chart();
}
}
3.将输入的点绘制在坐标系中:
public void paint(View view) {
EditText point=(EditText)findViewById(R.id.point);
if(all==fully){
Toast.makeText(this,"已达最大x值",Toast.LENGTH_SHORT).show();
point.setText("");
}else{
if(!point.getText().toString().trim().equals("")){
thispoint=Float.valueOf(String.valueOf(point.getText()));
if(thispoint>fully){
Toast.makeText(this,"大于最大y值,请重新输入!",Toast.LENGTH_SHORT).show();
point.setText("");
}else{
mypoint[all]=thispoint;
x2=startx1+xinterval*(all+1);
y2=starty1-thispoint/fully*rule1;
p.setStrokeWidth(10);
canvasTemp.drawPoint(x2,y2,p);
if(all>0){
p.setStrokeWidth(5);
canvasTemp.drawLine(x1,y1,x2,y2,p);
}
all++;
}
x1=x2;
y1=y2;
}
}
point.setText("");
}
三.效果展示
”确认”键上面三个参数可实现对坐标系的自定义。“清除所有”按钮会将折线图清除,不会将坐标系也清除。
四.功能展望
1.多个折现图同时展示。
2.加入颜色元素增加美观性。
3.更改或优化折线图数据输入方式。
来源:https://blog.csdn.net/qq_46574738/article/details/122861336


猜你喜欢
- 啥都不说先上效果图,这个是我项目里的效果:下面的是我抽取出来的 demo 适配啥的我基本上都做好了没做其他的ok 下面 说一下思路把首先 说
- 前言之前写了一个博客是关于使用SpringBoot使用validation-api实现参数校验,当时使用的注解都是validation-ap
- 如果对共享的可变数据的访问不能同步,其后果非常可怕,即使这个变量是原子可读写的。下面考虑一个线程同步方面的问题。对于线程同步,Java类库提
- Spring spring-context-indexer依赖<dependencies> <d
- 前言最近在学习Spring Boot结合Redis时看了一些网上的教程,发现这些教程要么比较老,要么不知道从哪抄得,运行起来有问题。这里分享
- 概述异步这个概念在不同语境下有不同的解释,比如在一个单核CPU里开启两个线程执行两个函数,通常认为这种调用是异步的,但对于CPU来说它是单核
- 背景之前和同事讨论一个问题,他们公司调研中发现forEach的速度比for的速度慢,当刚听到这个结论的时候有点诧异。因为之前看过国外的文章和
- 前言当我们在手机上使用360安全卫士时,手机屏幕上时刻都会出现一个小浮动窗口,点击该浮动窗口可跳转到安全卫士的操作界面,而且该浮动窗口不受其
- 引言Java反射机制是一个非常强大的功能,在很多大型项目比如Spring, Mybatis都可以看见反射的身影。通过反射机制我们可以在运行期
- 使用方法是这样的,Activity.showDialog()激发Activity.onCreateDialog()创建Dialog,然后显示
- 本文实例为大家分享了C#仿Windows XP自带的扫雷游戏的具体代码,供大家参考,具体内容如下1 题目描述:模仿Windows XP自带的
- 记录窗口上次关闭的位置和大小namespace PDSafe.Base{ public class Se
- 使用@Tolerate实现冲突兼容使用Lombok能够减少程序员的重复工作提高工作效率,而Lombok的注解基本是基于标准的(如,标准的Bu
- /// <summary> /// 实体转换辅助类 /// </summary> public class Mode
- 这篇文章主要介绍了JDBC自定义连接池过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参
- 一、XML DOM概述XML 文档大小写敏感、属性用引号括起来,每一个标记都要闭合。DOM是XML文档的内存中树状的表示形式。继承关系图:X
- 工作需要,经常需要实现api接口,但每次都是大同小异,我就考虑是否可以将这种重复性的工作配置化。我就写一个模板api,然后所有的HTTP请求
- 本文实例为大家分享了WPF自定义选择年月控件的具体代码,供大家参考,具体内容如下封装了一个选择年月的控件,XAML代码:<UserCo
- 学习过java基础,最近趁着大量课余时间想学习Android开发。百度很多资料Android studio,由Google开发的开发工具,那
- 效果图白话分析:多线程:肯定是多个线程咯断点:线程停止下载的位置续传:线程从停止下载的位置上继续下载,直到完成任务为止。核心分析:断点:当前