• AchartEngine 的学习


    第一步:
    我使用的事AchartEngine 1.1.0 的包。大家要先下在这个包,放到项目中,创建一个lib文件夹。然后倒金项目中去。
    然后再AndroidManifest.xml 中需要注册一下
    代码是:

    第二步:创建一个xml文件 我这里使用的事 rain_2_2.xml
    <?xml version="1.0" encoding="utf-8"?>

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    <Button
        android:id="@+id/linepoint"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/linepoint" />
    
    <LinearLayout
        android:id="@+id/layouto2"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >
    </LinearLayout>
    

    第三步:主程序代码

    import java.util.Date;
    import java.util.List;

    import org.achartengine.ChartFactory;
    import org.achartengine.GraphicalView;
    import org.achartengine.chart.PointStyle;
    import org.achartengine.model.TimeSeries;
    import org.achartengine.model.XYMultipleSeriesDataset;

    import org.achartengine.renderer.XYMultipleSeriesRenderer;
    import org.achartengine.renderer.XYSeriesRenderer;

    import android.content.Context;
    import android.graphics.Color;
    import android.graphics.Paint.Align;

    /**
    * 折线图
    *
    /
    public class RainViewImp2 {

    //将视图封装起来,返回视图
    public GraphicalView getChartGraphicalView(Context context,List xvalue, List yvalue){
    return ChartFactory.getTimeChartView(context, getDataSet(xvalue,yvalue), getRenderer(), "M/d HH:mm");
    }
    /*
    * 构造数据
    * @return
    */
    //注: 也可以在这个方法里面直接传入数据,这里我是从外界传入的数据,如果要在各个方法里直接插入数据的话,我的这个被注解掉的就是,
    一定要注意把这个点放进barDataset中,也就是 barDataset.addSeries(timeseries);这句代码
    public XYMultipleSeriesDataset getDataSet( List xvalue,List yvalue) {
    // 构造数据
    XYMultipleSeriesDataset barDataset = new XYMultipleSeriesDataset();

    TimeSeries timeseries=new TimeSeries("雨量");

    // List xvalue=new ArrayList();

    // List yvalue=new ArrayList();

    // xvalue.add(new Date(355555));
    // xvalue.add(new Date(359899));
    // xvalue.add(new Date(855555));
    //

    // yvalue.add(1.0);
    // yvalue.add(9.0);
    // yvalue.add(22.0);

     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
                 for(int i=0;i<xvalue.size();i++){
                         timeseries.add(xvalue.get(i),yvalue.get(i));
                  }
               //将需要绘制的点放进barDataset中 
                  barDataset.addSeries(timeseries);
                return barDataset;
        }
    
    
        /**
         * 构造渲染器
         * @return
         */
    
        public XYMultipleSeriesRenderer getRenderer() {
                XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
                // SimpleSeriesRenderer simp=new SimpleSeriesRenderer();
                // 3, 对点的绘制进行设置
                XYSeriesRenderer xyRenderer = new XYSeriesRenderer();
                // 3.1设置颜色
                xyRenderer.setColor(Color.GREEN);
                // 3.2设置点的样式
                xyRenderer.setPointStyle(PointStyle.TRIANGLE);
                // 3.3, 将要绘制的点添加到坐标绘制中
                renderer.addSeriesRenderer(xyRenderer);
                xyRenderer.setDisplayChartValues(true);
                renderer.setChartTitle("雨量实时分布");//设置图的标题
                renderer.setXTitle("时间");//设置X轴标题
                renderer.setYTitle("单位(毫米)");//设置y轴标题
                renderer.setAxesColor(Color.WHITE);//x轴线的颜色
                renderer.setLabelsColor(Color.WHITE);//y轴线的颜色
                   renderer.setXLabels(10);//x轴显示的个数
                renderer.setYLabels(10);//y轴显示的个数
                 // 是否显示网格  
             //        renderer.setShowGrid(false); 
                // x或y轴上数字的方向,相反的。  
                renderer.setXLabelsAlign(Align.RIGHT);  
                renderer.setYLabelsAlign(Align.RIGHT);
                renderer.setPointSize((float) 3);//设置每个轴上点的大小
                 // 图表部分的背景颜色  
             renderer.setBackgroundColor(Color.TRANSPARENT);  
           renderer.setApplyBackgroundColor(true);  
           renderer.setPanEnabled(true,false);//设置xy轴能否拖动
         // 设置每个柱子上是否显示数值
        // renderer.getSeriesRendererAt(0).setDisplayChartValues(true);
         //renderer.getSeriesRendererAt(0).setChartValuesTextSize(30);
         //simp.setChartValuesTextSize(40);
        // simp.setDisplayChartValues(true);
         // 设置渲染器显示缩放按钮
             renderer.setZoomButtonsVisible(true);
        // 设置渲染器允许放大缩小
            renderer.setZoomEnabled(true);
      /*        renderer.setXLabels(0);//设置X轴不显示数字
       String X[]={"10:00","10:01","10:02","10:03","10:04","10:05","10:06","10:07","10:08","10:09","10:10"};   
       for(int i=0; i<X.length;i++){
               renderer.addXTextLabel(i, X);
       }
            */
       renderer.setClickEnabled(true);//设置是否可以点击
       renderer.setSelectableBuffer(20);//设置点击但范围
                return renderer;
        }
    

    }

    然后接下里就要在MainActivity中去调用了

    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    import org.achartengine.GraphicalView;
    import org.achartengine.model.SeriesSelection;
    import com.ezonejs.viewImp.RainViewImp2;
    import android.annotation.SuppressLint;
    import android.annotation.TargetApi;
    import android.app.Activity;
    import android.graphics.Color;
    import android.os.Build;
    import android.os.Bundle;
    import android.view.Gravity;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.ImageView;
    import android.widget.LinearLayout;
    import android.widget.RelativeLayout;
    import android.widget.Toast;
    @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
    public class ChartLineMainActivity extends Activity implements OnClickListener{
    LinearLayout layout2;
    RelativeLayout relalayout00;
    Button zhandian2;
    GraphicalView graphview2;
    RainViewImp2 rain2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.rain_2_2);
    layout2=(LinearLayout)findViewById(R.id.layouto2);
    zhandian2=(Button)findViewById(R.id.linepoint);

    //这里注意如果是从外界传入数据,那么就在这里可以传入,也可以将其封装起来,在这里调用,如果是在上面的构造数据是传入数据,这里就不需要了,
    我这里是为了动态改变数据而坐的一个简单的例子,下面的这来那个xvalue,yvalue,可以从数据库中得到值,如果你有需要自己传入,这里是初始化 的的数据
    一打开图形界面就就能看到这个数据
    List xvalue=new ArrayList();

    List yvalue=new ArrayList();
    xvalue.add(new Date(455555));
    xvalue.add(new Date(559899));
    xvalue.add(new Date(855555));
    yvalue.add(10.0);
    yvalue.add(20.0);
    yvalue.add(52.0);

    rain2=new RainViewImp2();
    graphview2=rain2.getChartGraphicalView(getApplicationContext(),xvalue,yvalue);
    layout2.addView(graphview2);

    graphview2.setOnClickListener(this);

     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
               zhandian2.setOnClickListener(new OnClickListener() {
    
                        @Override
                        public void onClick(View v) {
                                switch (v.getId()) {
                                case R.id.linepoint:
    
                                        //Toast.makeText(getApplicationContext(), "hdsfgdf", Toast.LENGTH_LONG).show();
                                   List<Date> xvalue=new ArrayList<Date>();                
                                   List<Double> yvalue=new ArrayList<Double>();
                                   xvalue.add(new Date(355555));
                                   xvalue.add(new Date(359899));                                  
                                   yvalue.add(9.0);
                                   yvalue.add(22.0);                                         
                                   GraphicalView graphview1=rain2.getChartGraphicalView(getApplicationContext(),xvalue,yvalue);
                                   layout2.removeView(graphview2);//这里需要注意,很多人只做是没有用这个方法,导致图不能重新绘制,
                                   layout2.addView(graphview1);
                                   break;
                                }
                        }
                });
        }
        /**
         * 监听Toast,提示数据的显示格式的等
         */
        @SuppressLint("SimpleDateFormat")
        @Override
         public void onClick(View v) {
           GraphicalView graphicalView=(GraphicalView)v;
           SeriesSelection seriesselection=graphicalView.getCurrentSeriesAndPoint();
           if(seriesselection==null){
                   return ;
           }
           SimpleDateFormat sp=new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
           String time=sp.format(new Date(559899));
           //获取x轴的值
           int x=(int)seriesselection.getXValue();
           //获取y轴的值
           int y=(int)seriesselection.getValue();
           Toast toast=new Toast(this);
           toast=Toast.makeText(getApplicationContext(),"时间:"+time+"n"+"   值:"+y, Toast.LENGTH_LONG);        
           //设置toast显示的位置
           toast.setGravity(Gravity.getAbsoluteGravity(x, y), 500, 100);          
            Toast.makeText(getApplicationContext(), Gravity.getAbsoluteGravity(x, y)+"", Toast.LENGTH_LONG).show();
           LinearLayout toastView=(LinearLayout)toast.getView();          
           //设置Toast的背景色
           toastView.setBackgroundColor(Color.BLUE);
           toast.show();//显示Toast
        }
    

    }
    //这里只做了一个监听,就是监听图上数据,当点击图上局数据是会显示详细信息,如果你需要再第二绘图时还有此功能,只要把监听从新设置一下,然后调用就 可以了。
    我这里没有实现 第二次点击还有效果,需要时自己设置
    第四步:在数函数中调用

    import android.os.Bundle;
    import android.app.Activity;
    import android.content.Intent;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;

    public class MainActivity extends Activity implements OnClickListener{

     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
             private Button rainbar2;//折线图
    
                @Override
                protected void onCreate(Bundle savedInstanceState) {
                        super.onCreate(savedInstanceState);
                        setContentView(R.layout.activity_main);                
                        rainbar2 = (Button) findViewById(R.id.rain2);//折线图
                        rainbar2.setOnClickListener(this);
                }
                /**
                 * 监听
                 */
                @Override
                public void onClick(View v) {
                        switch(v.getId()){
                        case R.id.rain2:
    
                                /*RainViewImp2 rainview2=new RainViewImp2();
                                Intent linetent2=rainview2.getIntent(this);
                                startActivity(linetent2);*/
                                Intent linetent2 = new Intent(MainActivity.this,ChartLineMainActivity.class);
                                startActivity(linetent2);
                                break;
                        }
                }                
    

    }
    这里用到了Intent对象需要在AndroidManifest.xml中注册一下
    这是我使用的包,尼克一根据你自己的项目包注册一下,
    否则程序一运行就停止,原因就是没有在AndroidManifest.xml中注册。
    好了,这样一个简单的折线图就完成了
    如果需要做状图的话,很简单只要该getTimeChartView,这个方法就可以了,有时候可能会出错,原因是渲染器造成的,柱状图的渲染器属性设置
    和折线图的属性不一样,需要注意看一下。
    如果需要的话可以查看官方的API文档,这里为大家提供一个网址
    http://www.achartengine.org/content/javadoc/org/achartengine/ChartFactory.html#getCubeLineChartViewandroid.content.Context(, org.achartengine.model.XYMultipleSeriesDataset, org.achartengine.renderer.XYMultipleSeriesRenderer, float)
    5.png6.png

  • 相关阅读:
    运算符优先级口诀
    [转] 从最大似然到EM算法浅解
    推荐系统实践整体化总结
    Python-函数
    Python-dict/set
    Python-条件、循环、
    Python-list and tuple
    优先级顺序表
    8.1python类型注解
    9.redis-CacheCloud
  • 原文地址:https://www.cnblogs.com/wangfeng520/p/5607872.html
Copyright © 2020-2023  润新知