Achartengine.jar绘制动态图形一 --饼图


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分配一个空间。



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?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文件。这里先拿出重要代码,后面有总代码。



1
2
3
4
5
6
7
8
9
@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();



1
2
3
4
5
6
7
8
9
10
11
12
13
//创建饼图
   public CategorySeries getData()
   {
 
       cs = new CategorySeries("第一个饼图");
 
       cs.add("黄金",30);
       cs.add("铂金",10);
       cs.add("黑金",60);
 
 
       return cs;
   }


渲染器getRenderer();


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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:创建定时器,定时每秒重画一次



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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);// 执行任务, 一秒一次


注释的代码,可以写也可以不写,写了也不会出错。


 //模拟动态赋值,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
    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:总代码




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
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;
    }
 
}
 
还有折线图 柱状图等,可以百度相关jar包
 

Achartengine.jar绘制动态图形-饼图的更多相关文章

  1. Achartengine.jar绘制动态图形一 --饼图

    PS:我们在做安卓程序的时候,免不了会做一些图形,自己可以选择自定义view ,就是用Canvas画,也可以用写好的jar包,就是achartengine.jar,使用jar包的好处就快速绘制图形,不 ...

  2. 用Python绘制一套“会跳舞”的动态图形给你看看

    在读技术博客的过程中,我们会发现那些能够把知识.成果讲透的博主很多都会做动态图表.他们的图是怎么做的?难度大吗?这篇文章就介绍了 Python 中一种简单的动态图表制作方法. 看这优美的舞姿 很多人学 ...

  3. css绘制特殊图形,meida查询,display inline-box间隙问题以及calc()函数

    本文同时发表于本人个人网站 www.yaoxiaowen.com 距离上一篇文章已经一个月了,相比于写代码,发现写文章的确是更需要坚持的事情.言归正传,梳理一下这一个月来,在写ife任务时,有必要记录 ...

  4. AChartEngine 图表绘制

    AChartEngine Android 平台的图表开发库, 能绘制 折线图, 饼图, 气泡图, 柱状图, 散点图, 面积图等统计图表. 这些我记录一下,柱状图.折线图和饼状图的小例子.有兴趣的朋友, ...

  5. matlab绘制三维图形

    原文地址:种三维曲面图. 程序如下: [x,y]=meshgrid(-8:0.5:8); z=sin(sqrt(x.^2+y.^2))./sqrt(x.^2+y.^2+eps); subplot(2, ...

  6. 绘制基本图形和线型(StrokeStyle)的设置详解

    绘制基本图形和线型(StrokeStyle)的设置详解 目前,在博客园上,相对写得比较好的两个关于Direct2D的教程系列,分别是万一的Direct2D系列和zdd的Direct2D系列.有兴趣的网 ...

  7. css绘制特殊图形,meida查询,display inline-box间隙问题以及calc()函数

    本文同时发表于本人个人网站 www.yaoxiaowen.com 距离上一篇文章已经一个月了,相比于写代码,发现写文章的确是更需要坚持的事情.言归正传,梳理一下这一个月来,在写ife任务时,有必要记录 ...

  8. Direct2D教程II——绘制基本图形和线型(StrokeStyle)的设置详解

    目前,在博客园上,相对写得比较好的两个关于Direct2D的教程系列,分别是万一的Direct2D系列和zdd的Direct2D系列.有兴趣的网友可以去看看.本系列也是介绍Direct2D的教程,是基 ...

  9. 10 个超炫绘制图表图形的 Javascript 插件【转载+整理】

    原文地址 现在,有很多在线绘制图表和图形(Charts and Graphs)的 JavaScript 插件,这些插件还都是免费,以及图表库.这些插件大量出现的原因是基于一个事实:人们不再依赖于 Fl ...

随机推荐

  1. IDEA+MAVEN+testNG(reportNG)

    转载:http://www.cnblogs.com/aikachin/p/7765846.html 参考: http://blog.csdn.net/langsand/article/details/ ...

  2. Win7如何改变用户文件夹位置

    现在装WIN7后第一件就是改变用户账户文件夹位置..因为里面存着一些软件的设定和信息等..不必要每次装后都手动改一次.. 已前用优化大师改.太麻烦.也不稳定有时有些目录不能完全改过来.. 通过命令mk ...

  3. 压测过程中,CPU和内存占用率很高,案例简单分析

    Q:  最近公司测试一个接口,数据库采用Mongo    并发策略:并发400个用户,每3秒加载5个用户,持续运行30分钟    数据量:8000条左右 压测结果发现:    TPS始终在5左右   ...

  4. Phaser实现源代码剖析

    Phaser是一个能够反复利用的同步栅栏.功能上与CyclicBarrier和CountDownLatch相似,只是提供更加灵活的使用方法.也就是说,Phaser的同步模型与它们几乎相同. 一般运用的 ...

  5. atitit.groovy 语法特性

    atitit.groovy 语法特性 1. Groovy 1.6概览1 1.1. 多路赋值2 2. 新发布的Groovy2.0为这门语言带来了关键的静态特性:静态类型检查和静态编译:2 3. 参考3 ...

  6. POJ 2528 Mayor&#39;s posters 离散化+线段树

    题目大意:给出一些海报和贴在墙上的区间.问这些海报依照顺序贴完之后,最后能后看到多少种海报. 思路:区间的范围太大,然而最多仅仅会有10000张海报,所以要离散化. 之后用线段树随便搞搞就能过. 关键 ...

  7. Google Chrome v48.0.2564.

    http://www.pcpop.com/doc/1/1819/1819996.shtml 摘要:谷歌浏览器Chrome Stable 稳定版迎来例行升级,新版本号为v48.0.2564.82,上一版 ...

  8. Office Web Apps Server 2013与PDF(一)

    好吧--这个消息有点旧,迟了将近4个月. Office Web Apps是微软各大服务产品系列中的一个基础服务,可以为SharePoint 2013.Exchange 2013.Lync 2013提供 ...

  9. IOS设计模式的六大设计原则之迪米特法则(LOD,Law Of Demeter)

    定义 狭义的迪米特法则定义:也叫最少知识原则(LKP,Least Knowledge Principle).如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用.如果其中的一个类需要调用 ...

  10. openfile

    linux修改open files数   概要 linux系统默认open files数目为1024, 有时应用程序会报Too many open files的错误,是因为open files 数目不 ...