zoukankan      html  css  js  c++  java
  • 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分配一个空间。

    <?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;
        }
    
    }
    



  • 相关阅读:
    GUI设计禁忌 之三 ——没有指示用户当前所在位置
    GUI设计禁忌 之九 ——不好的布局和窗口位置
    GUI设计禁忌 之十 ——字体过小
    GUI设计禁忌 之五 ——糟糕的搜索引擎
    Oracle对表的基本操作
    GUI设计禁忌 之八 ——引起误解的文字
    GUI设计禁忌 之四 ——将用户引入歧途
    Java基础:Object类中的equals与hashCode方法
    为应用程序池提供服务的进程关闭时间超过了限制
    asp.net 新手资源教程《Total Training Visual Studio 2005 教程》[Microsoft Visual Studio 2005 Productivity with .NET Framework 2.0]【ISO】
  • 原文地址:https://www.cnblogs.com/cmusketeer/p/8016561.html
Copyright © 2011-2022 走看看