Android怎么做如何用数据做折线图折线 图

&nbsp&#8250&nbsp&nbsp&#8250&nbsp
android绘制折线图绘制
折线图的实现方法在github上有很多开源的程序,但是对于初学者来讲,简单一点的教程可能更容易入门,下面的文章来自csdn的阳光的小强,或许有用(没仔细阅读,大概看了下文章的结构清晰,折线图的效果也还好)。转载自阳光的小强的博客:有时候我们在项目中会遇到使用折线图等图形,Android的开源项目中为我们提供了很多插件,但是很多时候我们需要根据具体项目自定义这些图表,这一篇文章我们一起来看看如何在Android中使用Canvas绘制折线图。先看看绘制的效果:实现原理很简单,我就直接给出代码:package&com.example.&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
import&java.util.ArrayL&
import&java.util.L&
import&java.util.R&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
import&android.content.C&
import&android.graphics.C&
import&android.graphics.C&
import&android.graphics.P&
import&android.os.H&
import&android.os.M&
import&android.util.AttributeS&
import&android.view.V&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
public&class&MyView&extends&View{&
&&&&private&int&XPoint&=&60;&
&&&&private&int&YPoint&=&260;&
&&&&private&int&XScale&=&8;&&//刻度长度&
&&&&private&int&YScale&=&40;&
&&&&private&int&XLength&=&380;&
&&&&private&int&YLength&=&240;&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&private&int&MaxDataSize&=&XLength&/&XS&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&private&List&Integer&&data&=&new&ArrayList&Integer&();&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&private&String[]&YLabel&=&new&String[YLength&/&YScale];&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&private&Handler&handler&=&new&Handler(){&
&&&&&&&&public&void&handleMessage(Message&msg)&{&
&&&&&&&&&&&&if(msg.what&==&0x1234){&
&&&&&&&&&&&&&&&&MyView.this.invalidate();&
&&&&&&&&&&&&}&
&&&&&&&&};&
&&&&public&MyView(Context&context,&AttributeSet&attrs)&{&
&&&&&&&&super(context,&attrs);&
&&&&&&&&for(int&i=0;&i&YLabel.&i++){&
&&&&&&&&&&&&YLabel[i]&=&(i&+&1)&+&&M/s&;&
&&&&&&&&}&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&new&Thread(new&Runnable()&{&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&@Override&
&&&&&&&&&&&&public&void&run()&{&
&&&&&&&&&&&&&&&&while(true){&
&&&&&&&&&&&&&&&&&&&&try&{&
&&&&&&&&&&&&&&&&&&&&&&&&Thread.sleep(1000);&
&&&&&&&&&&&&&&&&&&&&}&catch&(InterruptedException&e)&{&
&&&&&&&&&&&&&&&&&&&&&&&&e.printStackTrace();&
&&&&&&&&&&&&&&&&&&&&}&
&&&&&&&&&&&&&&&&&&&&if(data.size()&&=&MaxDataSize){&
&&&&&&&&&&&&&&&&&&&&&&&&data.remove(0);&
&&&&&&&&&&&&&&&&&&&&}&
&&&&&&&&&&&&&&&&&&&&data.add(new&Random().nextInt(4)&+&1);&
&&&&&&&&&&&&&&&&&&&&handler.sendEmptyMessage(0x1234);&
&&&&&&&&&&&&&&&&}&
&&&&&&&&&&&&}&
&&&&&&&&}).start();&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&@Override&
&&&&protected&void&onDraw(Canvas&canvas)&{&
&&&&&&&&super.onDraw(canvas);&
&&&&&&&&Paint&paint&=&new&Paint();&
&&&&&&&&paint.setStyle(Paint.Style.STROKE);&
&&&&&&&&paint.setAntiAlias(true);&//去锯齿&
&&&&&&&&paint.setColor(Color.BLUE);&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&//画Y轴&
&&&&&&&&canvas.drawLine(XPoint,&YPoint&-&YLength,&XPoint,&YPoint,&paint);&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&//Y轴箭头&
&&&&&&&&canvas.drawLine(XPoint,&YPoint&-&YLength,&XPoint&-&3,&YPoint-YLength&+&6,&paint);&&//箭头&
&&&&&&&&canvas.drawLine(XPoint,&YPoint&-&YLength,&XPoint&+&3,&YPoint-YLength&+&6&,paint);&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&//添加刻度和文字&
&&&&&&&&for(int&i=0;&i&*&YScale&&&YL&i++)&{&
&&&&&&&&&&&&canvas.drawLine(XPoint,&YPoint&-&i&*&YScale,&XPoint&+&5,&YPoint&-&i&*&YScale,&paint);&&//刻度&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&canvas.drawText(YLabel[i],&XPoint&-&50,&YPoint&-&i&*&YScale,&paint);//文字&
&&&&&&&&}&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&//画X轴&
&&&&&&&&canvas.drawLine(XPoint,&YPoint,&XPoint&+&XLength,&YPoint,&paint);&
&&&&&&&&System.out.println(&Data.size&=&&&+&data.size());&
&&&&&&&&if(data.size()&&&1){&
&&&&&&&&&&&&for(int&i=1;&i&data.size();&i++){&
&&&&&&&&&&&&&&&&canvas.drawLine(XPoint&+&(i-1)&*&XScale,&YPoint&-&data.get(i-1)&*&YScale,&&
&&&&&&&&&&&&&&&&&&&&&&&&XPoint&+&i&*&XScale,&YPoint&-&data.get(i)&*&YScale,&paint);&
&&&&&&&&&&&&}&
&&&&&&&&}&
}上面绘制折线部分我们还有一种方式同样可以实现:if(data.size()&&&1){&
&&&&Path&path&=&new&Path();&
&&&&path.moveTo(XPoint,&YPoint&-&data.get(0)&*&YScale);&
&&&&for(int&i=1;&i&data.size();&i++){&
&&&&&&&&path.lineTo(XPoint&+&i&*&XScale,&YPoint&-&data.get(i)&*&YScale);&
&&&&canvas.drawPath(path,&paint);&
}下面我们将上面代码修改,让折线下面的区域颜色填充package&com.example.&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
import&java.util.ArrayL&
import&java.util.L&
import&java.util.R&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
import&android.content.C&
import&android.graphics.C&
import&android.graphics.C&
import&android.graphics.P&
import&android.graphics.P&
import&android.os.H&
import&android.os.M&
import&android.util.AttributeS&
import&android.view.V&
&*&@author&阳光小强
&*&http://blog.csdn.net/dawanganban
public&class&MyView&extends&View&{&
&&&&private&int&XPoint&=&60;&
&&&&private&int&YPoint&=&260;&
&&&&private&int&XScale&=&8;&//&刻度长度&
&&&&private&int&YScale&=&40;&
&&&&private&int&XLength&=&380;&
&&&&private&int&YLength&=&240;&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&private&int&MaxDataSize&=&XLength&/&XS&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&private&List&Integer&&data&=&new&ArrayList&Integer&();&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&private&String[]&YLabel&=&new&String[YLength&/&YScale];&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&private&Handler&handler&=&new&Handler()&{&
&&&&&&&&public&void&handleMessage(Message&msg)&{&
&&&&&&&&&&&&if&(msg.what&==&0x1234)&{&
&&&&&&&&&&&&&&&&MyView.this.invalidate();&
&&&&&&&&&&&&}&
&&&&&&&&};&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&public&MyView(Context&context,&AttributeSet&attrs)&{&
&&&&&&&&super(context,&attrs);&
&&&&&&&&for&(int&i&=&0;&i&&&YLabel.&i++)&{&
&&&&&&&&&&&&YLabel[i]&=&(i&+&1)&+&&M/s&;&
&&&&&&&&}&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&new&Thread(new&Runnable()&{&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&@Override&
&&&&&&&&&&&&public&void&run()&{&
&&&&&&&&&&&&&&&&while&(true)&{&
&&&&&&&&&&&&&&&&&&&&try&{&
&&&&&&&&&&&&&&&&&&&&&&&&Thread.sleep(1000);&
&&&&&&&&&&&&&&&&&&&&}&catch&(InterruptedException&e)&{&
&&&&&&&&&&&&&&&&&&&&&&&&e.printStackTrace();&
&&&&&&&&&&&&&&&&&&&&}&
&&&&&&&&&&&&&&&&&&&&if&(data.size()&&=&MaxDataSize)&{&
&&&&&&&&&&&&&&&&&&&&&&&&data.remove(0);&
&&&&&&&&&&&&&&&&&&&&}&
&&&&&&&&&&&&&&&&&&&&data.add(new&Random().nextInt(4)&+&1);&
&&&&&&&&&&&&&&&&&&&&handler.sendEmptyMessage(0x1234);&
&&&&&&&&&&&&&&&&}&
&&&&&&&&&&&&}&
&&&&&&&&}).start();&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&@Override&
&&&&protected&void&onDraw(Canvas&canvas)&{&
&&&&&&&&super.onDraw(canvas);&
&&&&&&&&Paint&paint&=&new&Paint();&
&&&&&&&&paint.setStyle(Paint.Style.STROKE);&
&&&&&&&&paint.setAntiAlias(true);&//&去锯齿&
&&&&&&&&paint.setColor(Color.BLUE);&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&//&画Y轴&
&&&&&&&&canvas.drawLine(XPoint,&YPoint&-&YLength,&XPoint,&YPoint,&paint);&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&//&Y轴箭头&
&&&&&&&&canvas.drawLine(XPoint,&YPoint&-&YLength,&XPoint&-&3,&YPoint&-&YLength&
&&&&&&&&&&&&&&&&+&6,&paint);&//&箭头&
&&&&&&&&canvas.drawLine(XPoint,&YPoint&-&YLength,&XPoint&+&3,&YPoint&-&YLength&
&&&&&&&&&&&&&&&&+&6,&paint);&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&//&添加刻度和文字&
&&&&&&&&for&(int&i&=&0;&i&*&YScale&&&YL&i++)&{&
&&&&&&&&&&&&canvas.drawLine(XPoint,&YPoint&-&i&*&YScale,&XPoint&+&5,&YPoint&-&i&
&&&&&&&&&&&&&&&&&&&&*&YScale,&paint);&//&刻度&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&canvas.drawText(YLabel[i],&XPoint&-&50,&YPoint&-&i&*&YScale,&paint);//&文字&
&&&&&&&&}&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&//&画X轴&
&&&&&&&&canvas.drawLine(XPoint,&YPoint,&XPoint&+&XLength,&YPoint,&paint);&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&//&绘折线&
&&&&&&&&/*
&&&&&&&&&*&if(data.size()&&&1){&for(int&i=1;&i&data.size();&i++){
&&&&&&&&&*&canvas.drawLine(XPoint&+&(i-1)&*&XScale,&YPoint&-&data.get(i-1)&*
&&&&&&&&&*&YScale,&XPoint&+&i&*&XScale,&YPoint&-&data.get(i)&*&YScale,&paint);&}
&&&&&&&&&*&}
&&&&&&&&&*/&
&&&&&&&&paint.setStyle(Paint.Style.FILL);&
&&&&&&&&if&(data.size()&&&1)&{&
&&&&&&&&&&&&Path&path&=&new&Path();&
&&&&&&&&&&&&path.moveTo(XPoint,&YPoint);&
&&&&&&&&&&&&for&(int&i&=&0;&i&&&data.size();&i++)&{&
&&&&&&&&&&&&&&&&path.lineTo(XPoint&+&i&*&XScale,&YPoint&-&data.get(i)&*&YScale);&
&&&&&&&&&&&&}&
&&&&&&&&&&&&path.lineTo(XPoint&+&(data.size()&-&1)&*&XScale,&YPoint);&
&&&&&&&&&&&&canvas.drawPath(path,&paint);&
&&&&&&&&}&
}上面的效果有时候还是达不到我们的要求,我们将代码修改后效果如下:package&com.example.&
&&&&&&&&&&&&&&&&&&&&&&&&
import&java.util.ArrayL&
import&java.util.L&
import&java.util.R&
&&&&&&&&&&&&&&&&&&&&&&&&
import&android.content.C&
import&android.graphics.C&
import&android.graphics.C&
import&android.graphics.P&
import&android.graphics.P&
import&android.os.H&
import&android.os.M&
import&android.util.AttributeS&
import&android.view.V&
&&&&&&&&&&&&&&&&&&&&&&&&
&*&@author&阳光小强&http://blog.csdn.net/dawanganban
public&class&MyView&extends&View&{&
&&&&private&int&XPoint&=&60;&
&&&&private&int&YPoint&=&260;&
&&&&private&int&XScale&=&8;&//&刻度长度&
&&&&private&int&YScale&=&40;&
&&&&private&int&XLength&=&380;&
&&&&private&int&YLength&=&240;&
&&&&&&&&&&&&&&&&&&&&&&&&
&&&&private&int&MaxDataSize&=&XLength&/&XS&
&&&&&&&&&&&&&&&&&&&&&&&&
&&&&private&List&Integer&&data&=&new&ArrayList&Integer&();&
&&&&&&&&&&&&&&&&&&&&&&&&
&&&&private&String[]&YLabel&=&new&String[YLength&/&YScale];&
&&&&&&&&&&&&&&&&&&&&&&&&
&&&&private&Handler&handler&=&new&Handler()&{&
&&&&&&&&public&void&handleMessage(Message&msg)&{&
&&&&&&&&&&&&if&(msg.what&==&0x1234)&{&
&&&&&&&&&&&&&&&&MyView.this.invalidate();&
&&&&&&&&&&&&}&
&&&&&&&&};&
&&&&&&&&&&&&&&&&&&&&&&&&
&&&&public&MyView(Context&context,&AttributeSet&attrs)&{&
&&&&&&&&super(context,&attrs);&
&&&&&&&&for&(int&i&=&0;&i&&&YLabel.&i++)&{&
&&&&&&&&&&&&YLabel[i]&=&(i&+&1)&+&&M/s&;&
&&&&&&&&}&
&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&new&Thread(new&Runnable()&{&
&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&@Override&
&&&&&&&&&&&&public&void&run()&{&
&&&&&&&&&&&&&&&&while&(true)&{&
&&&&&&&&&&&&&&&&&&&&try&{&
&&&&&&&&&&&&&&&&&&&&&&&&Thread.sleep(1000);&
&&&&&&&&&&&&&&&&&&&&}&catch&(InterruptedException&e)&{&
&&&&&&&&&&&&&&&&&&&&&&&&e.printStackTrace();&
&&&&&&&&&&&&&&&&&&&&}&
&&&&&&&&&&&&&&&&&&&&if&(data.size()&&=&MaxDataSize)&{&
&&&&&&&&&&&&&&&&&&&&&&&&data.remove(0);&
&&&&&&&&&&&&&&&&&&&&}&
&&&&&&&&&&&&&&&&&&&&data.add(new&Random().nextInt(4)&+&1);&
&&&&&&&&&&&&&&&&&&&&handler.sendEmptyMessage(0x1234);&
&&&&&&&&&&&&&&&&}&
&&&&&&&&&&&&}&
&&&&&&&&}).start();&
&&&&&&&&&&&&&&&&&&&&&&&&
&&&&@Override&
&&&&protected&void&onDraw(Canvas&canvas)&{&
&&&&&&&&super.onDraw(canvas);&
&&&&&&&&Paint&paint&=&new&Paint();&
&&&&&&&&paint.setStyle(Paint.Style.STROKE);&
&&&&&&&&paint.setAntiAlias(true);&//&去锯齿&
&&&&&&&&paint.setColor(Color.BLUE);&
&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&//&画Y轴&
&&&&&&&&canvas.drawLine(XPoint,&YPoint&-&YLength,&XPoint,&YPoint,&paint);&
&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&//&Y轴箭头&
&&&&&&&&canvas.drawLine(XPoint,&YPoint&-&YLength,&XPoint&-&3,&YPoint&-&YLength&
&&&&&&&&&&&&&&&&+&6,&paint);&//&箭头&
&&&&&&&&canvas.drawLine(XPoint,&YPoint&-&YLength,&XPoint&+&3,&YPoint&-&YLength&
&&&&&&&&&&&&&&&&+&6,&paint);&
&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&//&添加刻度和文字&
&&&&&&&&for&(int&i&=&0;&i&*&YScale&&&YL&i++)&{&
&&&&&&&&&&&&canvas.drawLine(XPoint,&YPoint&-&i&*&YScale,&XPoint&+&5,&YPoint&-&i&
&&&&&&&&&&&&&&&&&&&&*&YScale,&paint);&//&刻度&
&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&canvas.drawText(YLabel[i],&XPoint&-&50,&YPoint&-&i&*&YScale,&paint);//&文字&
&&&&&&&&}&
&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&//&画X轴&
&&&&&&&&canvas.drawLine(XPoint,&YPoint,&XPoint&+&XLength,&YPoint,&paint);&
&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&//&绘折线&
&&&&&&&&/*
&&&&&&&&&*&if(data.size()&&&1){&for(int&i=1;&i&data.size();&i++){
&&&&&&&&&*&canvas.drawLine(XPoint&+&(i-1)&*&XScale,&YPoint&-&data.get(i-1)&*
&&&&&&&&&*&YScale,&XPoint&+&i&*&XScale,&YPoint&-&data.get(i)&*&YScale,&paint);&}
&&&&&&&&&*&}
&&&&&&&&&*/&
&&&&&&&&paint.setColor(Color.RED);&
&&&&&&&&paint.setStrokeWidth(5);&
&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&Paint&paint2&=&new&Paint();&
&&&&&&&&paint2.setColor(Color.BLUE);&
&&&&&&&&paint2.setStyle(Paint.Style.FILL);&
&&&&&&&&if&(data.size()&&&1)&{&
&&&&&&&&&&&&Path&path&=&new&Path();&
&&&&&&&&&&&&Path&path2&=&new&Path();&
&&&&&&&&&&&&path.moveTo(XPoint,&YPoint&-&data.get(0)&*&YScale);&
&&&&&&&&&&&&path2.moveTo(XPoint,&YPoint);&
&&&&&&&&&&&&for&(int&i&=&0;&i&&&data.size();&i++)&{&
&&&&&&&&&&&&&&&&path.lineTo(XPoint&+&i&*&XScale,&YPoint&-&data.get(i)&*&YScale);&
&&&&&&&&&&&&&&&&path2.lineTo(XPoint&+&i&*&XScale,&YPoint&-&data.get(i)&*&YScale);&
&&&&&&&&&&&&}&
&&&&&&&&&&&&path2.lineTo(XPoint&+&(data.size()&-&1)&*&XScale,&YPoint);&
&&&&&&&&&&&&canvas.drawPath(path,&paint);&
&&&&&&&&&&&&canvas.drawPath(path2,&paint2);&
&&&&&&&&}&
上一篇: 先来描述一下这种效果,在gridview展示的缩略图界面中,点击任意一张缩略图,会根据缩略图所在的位置慢慢放大与平移图片,最后展示出一张完整的图片,当用户返回的时候动画就反着再播放一次。这种效果的例子可以在“快图应用中可以看到。实际上实现这种效果
下一篇: 转自 http://blog.csdn.net/zjbpku/article/details/ 本站编辑整理。 不知道你有么有发现,KitKat之后的版本不再支持用户对外置SDcard(Secondary Storage)的写入等操作。如果用户想要将文件等copy到手机中,则只能存储到内部存储器中,而无法存储到查看:8473|回复:6
我用achartengine画了个折线图,在此请教一下如何实时动态更新折线图里的数据,还有怎么将折线图嵌入到布局界面的某一个位置中去,急急急
资深技术经理
这个achartengine真没用过,上次画图没有去用。。 百度有没有什么结果呢?:lol1
百度没什么实质性的结果,现在项目做的急,马上要用这个,真急人啊
资深技术经理
引用:原帖由 繁木重生 于
18:47 发表
百度没什么实质性的结果,现在项目做的急,马上要用这个,真急人啊 从坛子里面找了下帖子,不知道有没有用,比如这个:
额。。。。这个貌似也只是画出图,没有将动态数据的问题
刚好最近研究了下这个东西,希望能帮到你:
1.如何把折线图嵌入到界面某个位置?
可以利用ChartFactory类中很多的getXxxxView方法返回一个装着折线图的GraphicalView,然后通过位置View.addView(GraphicalView)之类的方法把折线图添加到你指定的控件处就行了。
2.如何动态更新?
上面提到的getXxxxView方法一般都有几个参数的,下面用其中的一个方法来做描述吧,例如:复制内容到剪贴板代码:getLineChartView(Context context,
& && &&&XYMultipleSeriesDataset dataset,
& && &&&XYMultipleSeriesRenderer renderer);此方法当中的参数dataset就是你的折线图数据集合了,实际使用时是通过调用dataset.addSeries(XYSeries series)、dataset.addSeries(A线条数据集)、dataset.addSeries(B线条数据集)……这种方式添加数据的,因为addSeries中的参数series是一个引用类型的变量,所以你的series被添加进去后只要没重新实例化,那么你在图表外部操作这个series比如往里面增加一个点,还是会有效地影响到图表。复制内容到剪贴板代码:/*===============================
*初始化图表
*===============================*/
XYSeries lineA = ...............;
dataset.addSeries(lineA);
graphicalView = ChartFactory.getLineChartView(this, dataset, renderer);
位置View.addView(graphicalView);
/*===============================
* 动态更新数据
*===============================*/
lineA.add(x1, y1);// 添加数据,或者其他操作
lineA.add(x2, y2);
graphicalView.repaint();// 刷新折线图通过上面这种方式就能够动态更新数据了。
哈哈,谢谢了,太有用了Android自定义View之自己动手绘制一个折线图控件ChartView
作者:xiaoyanger
链接:/p/7983edb84ccb
折线图在很多App中都有用到,GitHub上有一些功能全面的折线图框架,比如hellecharts-android,achartengine。但很多时候设计师给定的样式,通过这些框架不一定能完全达到效果。所以只有琢磨着通过自定义View来自己绘制一个折线图:
先看总体效果图:
最终效果图
根据展示效果,坐标轴、刻度、刻度值、数据点线、标题全部都通过自绘来实现。
初始化绘制相关参数
在构造函数中初始化画笔及数据刻度值等参数:
x轴的刻度值、数据点、y中刻度值设置初始值根据初始值先进行绘制。后续重新设置数据后再重绘。
在根据给定数据点生成y的坐标刻度值时,需要考虑两点:
1.数据点及其连线需要绘制在坐标区域的中间位置,并且数据点的临界值(最大或最小值)不能超过y坐标刻度的临界值;
2.y刻度值必须均分,并且根据不同数据值展示合适的y刻度值。
所以createYLabel()方法实现了根据给定的数据点的值来计算出对应y刻度值的算法。
将数据值排序后计算出中间值middle、y轴刻度值scale。format3Bit(float number)将计算结果进行格式化,保证刻度值的小数位数一致。
在onMeasure中初始化绘制尺寸及画笔属性等参数:
在onMeasure中就不去判断测量模式了,布局中直接使用match_parent或具体的dp值。
在onDraw方法中进行绘制:
绘制方法的具体实现:
具体绘制的代码参见:源码:/xiaoyanger0825/ChartView
getDataRoords()是为了根据数据点的值及坐标刻度的的比例关系计算出数据点的坐标,数据点(小圆圈)是点击后重绘才显示。
点击数据点后,详细的数据信息采用PopupWindow来展示。点击事件就直接在onTouchEnvent中来处理:
遍历数据点,根据触摸的位置判断是否在数据点的有效范围内,在有效范围内则通过showDetails(i)弹出弹窗,展示详细的百分比信息。
需要注意的是:根据需要展示的数据点的index以及数据点的坐标,计算出展示弹窗的位置xoff和xoff,弹窗的展示位置是从控件的最左下角为原点算的偏移量。
配置添加数据的方法,供外部调用
当然,也可以添加自定义属性,将数据、坐标刻度值在布局文件中来配置,这里就不添加了。
最终效果图1
最终效果图2
源码:/xiaoyanger0825/ChartView
责任编辑:
声明:本文由入驻搜狐号的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。
今日搜狐热点

我要回帖

更多关于 两列数据怎么做折线图 的文章

 

随机推荐