PS:我們在做安卓程式的時候,免不了會做一些圖形,自己可以選擇自定義view ,就是用Canvas畫,也可以用寫好的jar包,就是achartengine.jar,使用jar包的好處就快速繪製圖形,不用我們計算坐標等,計算坐標就會和數學結合,通過sin,cos等來計算,遇到3維那就更麻煩了,就像Op ...
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);
(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; } }
完