PS:我们在做安卓程序的时候,免不了会做一些图形,自己可以选择自定义view ,就是用Canvas画,也可以用写好的jar包,就是achartengine.jar,使用jar包的好处就快速绘制图形,不用我们计算坐标等,计算坐标就会和数学结合,通过sin,cos等来计算,遇到3维那就更麻烦了,就像OpenGL一样,空间视角,三维制作,我的博客里也有一些,感兴趣的小火鸡可以看一下,
上效果图:
步骤:
1:首先找到jar包,导入achartengine.jar,放在项目的libs目录下即可,记得要添加一下呦。
下载地址:http://download.csdn.net/download/jjhahage/10114288
2:创建activity_main.xml文件,给view分配一个空间。
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="cn.liuzhitong.charttest1_1.MainActivity"> <LinearLayout android:id="@+id/id_layout" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> </LinearLayout> </RelativeLayout>
创建MainActivity.java文件。这里先拿出重要代码,后面有总代码。
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题 setContentView(R.layout.activity_main); LinearLayout ll= (LinearLayout) findViewById(R.id.id_layout); //创建图表,首先要创建数据源和渲染器,然后让一个方法调用即可, view = ChartFactory.getPieChartView(this,getData(),getRenderer()); ll.addView(view);
2-1:创建这个饼图方法就是getPieChartView(this,数据,渲染器);
数据getData()
//创建饼图 public CategorySeries getData() { cs = new CategorySeries("第一个饼图"); cs.add("黄金",30); cs.add("铂金",10); cs.add("黑金",60); return cs; }
渲染器getRenderer()
public DefaultRenderer getRenderer(){ //创建渲染器,描绘器对象 renderer = new DefaultRenderer(); ssr1 = new SimpleSeriesRenderer(); ssr2 = new SimpleSeriesRenderer(); ssr3 = new SimpleSeriesRenderer(); ssr1.setChartValuesFormat(NumberFormat.getPercentInstance());// 设置百分比 ssr2.setChartValuesFormat(NumberFormat.getPercentInstance());// 设置百分比 ssr3.setChartValuesFormat(NumberFormat.getPercentInstance());// 设置百分比 ssr1.setColor(Color.YELLOW); ssr2.setColor(Color.CYAN); ssr3.setColor(Color.BLACK); renderer.addSeriesRenderer(ssr1); renderer.addSeriesRenderer(ssr2); renderer.addSeriesRenderer(ssr3); renderer.setChartTitle("第一个饼图"); renderer.setShowLabels(true);//设置显示标签 renderer.setShowLegend(true);//显示底部说明标签 renderer.setLabelsTextSize(20);//设置标签字体大小, renderer.setAntialiasing(true);//消失锯齿 renderer.setApplyBackgroundColor(true);//想要添加背景要先申请 renderer.setBackgroundColor(Color.DKGRAY); renderer.setChartTitleTextSize(30); renderer.setDisplayValues(true); //显示数据,这个不写就不会显示出百分比。。 renderer.setZoomButtonsVisible(true); //显示缩小放大图标 return renderer; }
3:创建定时器,定时每秒重画一次
Timer time=new Timer(); handler = new Handler() {// 这里的Handler实例将配合下面的Timer实例,完成定时更新图表的功能 public void handleMessage(Message msg) { if (msg.what == 1) { init();// 刷新图表具体方法 Handler将此并入主线程 } // super.handleMessage(msg); } }; TimerTask task = new TimerTask() { public void run() {// 通过消息更新 Log.i("task", " task ok "); Message message = new Message(); message.what = 1;// 消息定义标志 handler.sendMessage(message); } }; time.schedule(task,1,1000);// 执行任务, 一秒一次
注释的代码,可以写也可以不写,写了也不会出错。
//模拟动态赋值,
public void init() { cs.clear();//清空之前的数据 Random random = new Random(); int R1 = random.nextInt(100); int R2 = random.nextInt(100); int R3 = random.nextInt(100); // 设置种类名称和对应的数值,前面是(key,value)键值对 cs.add("黄金",R1); cs.add("铂金",R2); cs.add("黑金",R3); // renderer = new DefaultRenderer(); // ssr1.setChartValuesFormat(NumberFormat.getPercentInstance());// 设置百分比 // ssr2.setChartValuesFormat(NumberFormat.getPercentInstance());// 设置百分比 // ssr3.setChartValuesFormat(NumberFormat.getPercentInstance());// 设置百分比 // ssr1.setColor(Color.BLACK); // ssr2.setColor(Color.YELLOW); // ssr3.setColor(Color.CYAN); // renderer.addSeriesRenderer(ssr1); // renderer.addSeriesRenderer(ssr2); // renderer.addSeriesRenderer(ssr3); //让底部说明标签显示,如果不行,那就只会在初始化的时候显示一次 renderer.setShowLabels(true);//设置显示标签 renderer.setShowLegend(true);//显示底部说明标签 renderer.setLabelsTextSize(20);//设置标签字体大小, renderer.setAntialiasing(true);//消失锯齿 renderer.setApplyBackgroundColor(true);//想要添加背景要先申请 renderer.setBackgroundColor(Color.DKGRAY); view.repaint();//重画,不写就不会显示动态变化 }
4:总代码
package cn.liuzhitong.charttest1_1; import android.graphics.Color; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.Window; import android.widget.LinearLayout; import org.achartengine.ChartFactory; import org.achartengine.GraphicalView; import org.achartengine.model.CategorySeries; import org.achartengine.renderer.DefaultRenderer; import org.achartengine.renderer.SimpleSeriesRenderer; import java.text.NumberFormat; import java.util.Random; import java.util.Timer; import java.util.TimerTask; public class MainActivity extends AppCompatActivity { private GraphicalView view; private CategorySeries cs; public Handler handler; private DefaultRenderer renderer; private SimpleSeriesRenderer ssr1; private SimpleSeriesRenderer ssr2; private SimpleSeriesRenderer ssr3; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题 setContentView(R.layout.activity_main); LinearLayout ll= (LinearLayout) findViewById(R.id.id_layout); //创建图表,首先要创建数据源和渲染器,然后让一个方法调用即可, view = ChartFactory.getPieChartView(this,getData(),getRenderer()); ll.addView(view); Timer time=new Timer(); handler = new Handler() {// 这里的Handler实例将配合下面的Timer实例,完成定时更新图表的功能 public void handleMessage(Message msg) { if (msg.what == 1) { init();// 刷新图表具体方法 Handler将此并入主线程 } // super.handleMessage(msg); } }; TimerTask task = new TimerTask() { public void run() {// 通过消息更新 Log.i("task", " task ok "); Message message = new Message(); message.what = 1;// 消息定义标志 handler.sendMessage(message); } }; time.schedule(task,1,1000);// 执行任务, 一秒一次 } //模拟动态赋值, public void init() { cs.clear();//清空之前的数据 Random random = new Random(); int R1 = random.nextInt(100); int R2 = random.nextInt(100); int R3 = random.nextInt(100); // 设置种类名称和对应的数值,前面是(key,value)键值对 cs.add("黄金",R1); cs.add("铂金",R2); cs.add("黑金",R3); // renderer = new DefaultRenderer(); // ssr1.setChartValuesFormat(NumberFormat.getPercentInstance());// 设置百分比 // ssr2.setChartValuesFormat(NumberFormat.getPercentInstance());// 设置百分比 // ssr3.setChartValuesFormat(NumberFormat.getPercentInstance());// 设置百分比 // ssr1.setColor(Color.BLACK); // ssr2.setColor(Color.YELLOW); // ssr3.setColor(Color.CYAN); // renderer.addSeriesRenderer(ssr1); // renderer.addSeriesRenderer(ssr2); // renderer.addSeriesRenderer(ssr3); //让底部说明标签显示,如果不行,那就只会在初始化的时候显示一次 renderer.setShowLabels(true);//设置显示标签 renderer.setShowLegend(true);//显示底部说明标签 renderer.setLabelsTextSize(20);//设置标签字体大小, renderer.setAntialiasing(true);//消失锯齿 renderer.setApplyBackgroundColor(true);//想要添加背景要先申请 renderer.setBackgroundColor(Color.DKGRAY); view.repaint();//重画,不写就不会显示动态变化 } //创建饼图 public CategorySeries getData() { cs = new CategorySeries("第一个饼图"); cs.add("黄金",30); cs.add("铂金",10); cs.add("黑金",60); return cs; } //创建渲染器 public DefaultRenderer getRenderer(){ //创建渲染器,描绘器对象 renderer = new DefaultRenderer(); ssr1 = new SimpleSeriesRenderer(); ssr2 = new SimpleSeriesRenderer(); ssr3 = new SimpleSeriesRenderer(); ssr1.setChartValuesFormat(NumberFormat.getPercentInstance());// 设置百分比 ssr2.setChartValuesFormat(NumberFormat.getPercentInstance());// 设置百分比 ssr3.setChartValuesFormat(NumberFormat.getPercentInstance());// 设置百分比 ssr1.setColor(Color.YELLOW); ssr2.setColor(Color.CYAN); ssr3.setColor(Color.BLACK); renderer.addSeriesRenderer(ssr1); renderer.addSeriesRenderer(ssr2); renderer.addSeriesRenderer(ssr3); renderer.setChartTitle("第一个饼图"); renderer.setShowLabels(true);//设置显示标签 renderer.setShowLegend(true);//显示底部说明标签 renderer.setLabelsTextSize(20);//设置标签字体大小, renderer.setAntialiasing(true);//消失锯齿 renderer.setApplyBackgroundColor(true);//想要添加背景要先申请 renderer.setBackgroundColor(Color.DKGRAY); renderer.setChartTitleTextSize(30); renderer.setDisplayValues(true); //显示数据,这个不写就不会显示出百分比。。 renderer.setZoomButtonsVisible(true); //显示缩小放大图标 return renderer; } }
完