Android 统计图表引擎AChartEngine(四) - 源码示例 嵌入Acitivity中的折线图
16lz
2021-01-23
前面几篇博客中都是调用ChartFactory.get***Intent()方法,本节讲的内容调用ChartFactory.get***View()方法,这个方法调用的结果可以嵌入到任何一个Activity中,作为Activity的一部分。
XYChartBuilder.java(源码分析见注释)
[java] view plain copy
- packageorg.achartengine.chartdemo.demo.chart;
- importjava.io.File;
- importjava.io.FileOutputStream;
- importorg.achartengine.ChartFactory;
- importorg.achartengine.GraphicalView;
- importorg.achartengine.chart.PointStyle;
- importorg.achartengine.chartdemo.demo.R;
- importorg.achartengine.model.SeriesSelection;
- importorg.achartengine.model.XYMultipleSeriesDataset;
- importorg.achartengine.model.XYSeries;
- importorg.achartengine.renderer.XYMultipleSeriesRenderer;
- importorg.achartengine.renderer.XYSeriesRenderer;
- importorg.achartengine.tools.PanListener;
- importorg.achartengine.tools.ZoomEvent;
- importorg.achartengine.tools.ZoomListener;
- importandroid.app.Activity;
- importandroid.graphics.Bitmap;
- importandroid.graphics.Bitmap.CompressFormat;
- importandroid.graphics.Color;
- importandroid.os.Bundle;
- importandroid.os.Environment;
- importandroid.view.View;
- importandroid.view.ViewGroup.LayoutParams;
- importandroid.widget.Button;
- importandroid.widget.EditText;
- importandroid.widget.LinearLayout;
- importandroid.widget.Toast;
- publicclassXYChartBuilderextendsActivity{
- publicstaticfinalStringTYPE="type";
- privateXYMultipleSeriesDatasetmDataset=newXYMultipleSeriesDataset();
- privateXYMultipleSeriesRenderermRenderer=newXYMultipleSeriesRenderer();
- privateXYSeriesmCurrentSeries;
- privateXYSeriesRenderermCurrentRenderer;
- privateStringmDateFormat;
- privateButtonmNewSeries;
- privateButtonmAdd;
- privateEditTextmX;
- privateEditTextmY;
- privateGraphicalViewmChartView;
- privateintindex=0;
- @Override
- protectedvoidonRestoreInstanceState(BundlesavedState){
- super.onRestoreInstanceState(savedState);
- mDataset=(XYMultipleSeriesDataset)savedState.getSerializable("dataset");
- mRenderer=(XYMultipleSeriesRenderer)savedState.getSerializable("renderer");
- mCurrentSeries=(XYSeries)savedState.getSerializable("current_series");
- mCurrentRenderer=(XYSeriesRenderer)savedState.getSerializable("current_renderer");
- mDateFormat=savedState.getString("date_format");
- }
- @Override
- protectedvoidonSaveInstanceState(BundleoutState){
- super.onSaveInstanceState(outState);
- outState.putSerializable("dataset",mDataset);
- outState.putSerializable("renderer",mRenderer);
- outState.putSerializable("current_series",mCurrentSeries);
- outState.putSerializable("current_renderer",mCurrentRenderer);
- outState.putString("date_format",mDateFormat);
- }
- @Override
- protectedvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.xy_chart);
- mX=(EditText)findViewById(R.id.xValue);
- mY=(EditText)findViewById(R.id.yValue);
- mRenderer.setApplyBackgroundColor(true);//设置是否显示背景色
- mRenderer.setBackgroundColor(Color.argb(100,50,50,50));//设置背景色
- mRenderer.setAxisTitleTextSize(16);//设置轴标题文字的大小
- mRenderer.setChartTitleTextSize(20);//?设置整个图表标题文字大小
- mRenderer.setLabelsTextSize(15);//设置刻度显示文字的大小(XY轴都会被设置)
- mRenderer.setLegendTextSize(15);//图例文字大小
- mRenderer.setMargins(newint[]{30,70,0,10});//设置图表的外边框(上/左/下/右)
- mRenderer.setZoomButtonsVisible(true);//是否显示放大缩小按钮
- mRenderer.setPointSize(10);//设置点的大小(图上显示的点的大小和图例中点的大小都会被设置)
- mAdd=(Button)findViewById(R.id.add);
- mNewSeries=(Button)findViewById(R.id.new_series);
- mNewSeries.setOnClickListener(newView.OnClickListener(){
- publicvoidonClick(Viewv){
- StringseriesTitle="Series"+(mDataset.getSeriesCount()+1);//图例
- XYSeriesseries=newXYSeries(seriesTitle);//定义XYSeries
- mDataset.addSeries(series);//在XYMultipleSeriesDataset中添加XYSeries
- mCurrentSeries=series;//设置当前需要操作的XYSeries
- XYSeriesRendererrenderer=newXYSeriesRenderer();//定义XYSeriesRenderer
- mRenderer.addSeriesRenderer(renderer);//将单个XYSeriesRenderer增加到XYMultipleSeriesRenderer
- renderer.setPointStyle(PointStyle.CIRCLE);//点的类型是圆形
- renderer.setFillPoints(true);//设置点是否实心
- mCurrentRenderer=renderer;
- setSeriesEnabled(true);
- }
- });
- //增加一个点后重画图
- mAdd.setOnClickListener(newView.OnClickListener(){
- publicvoidonClick(Viewv){
- doublex=0;
- doubley=0;
- try{
- x=Double.parseDouble(mX.getText().toString());
- }catch(NumberFormatExceptione){
- //TODO
- mX.requestFocus();
- return;
- }
- try{
- y=Double.parseDouble(mY.getText().toString());
- }catch(NumberFormatExceptione){
- //TODO
- mY.requestFocus();
- return;
- }
- mCurrentSeries.add(x,y);
- mX.setText("");
- mY.setText("");
- mX.requestFocus();
- if(mChartView!=null){
- mChartView.repaint();//重画图表
- }
- //生成图片保存,注释掉下面的代码不影响图表的生成.
- //-->start
- Bitmapbitmap=mChartView.toBitmap();
- try{
- Filefile=newFile(Environment.getExternalStorageDirectory(),"test"+index+++".png");
- FileOutputStreamoutput=newFileOutputStream(file);
- bitmap.compress(CompressFormat.PNG,100,output);
- }catch(Exceptione){
- e.printStackTrace();
- }
- //-->end
- }
- });
- }
- @Override
- protectedvoidonResume(){
- super.onResume();
- if(mChartView==null){
- LinearLayoutlayout=(LinearLayout)findViewById(R.id.chart);
- mChartView=ChartFactory.getLineChartView(this,mDataset,mRenderer);
- mRenderer.setClickEnabled(true);//设置图表是否允许点击
- mRenderer.setSelectableBuffer(100);//设置点的缓冲半径值(在某点附件点击时,多大范围内都算点击这个点)
- mChartView.setOnClickListener(newView.OnClickListener(){
- @Override
- publicvoidonClick(Viewv){
- //这段代码处理点击一个点后,获得所点击的点在哪个序列中以及点的坐标.
- //-->start
- SeriesSelectionseriesSelection=mChartView.getCurrentSeriesAndPoint();
- double[]xy=mChartView.toRealPoint(0);
- if(seriesSelection==null){
- Toast.makeText(XYChartBuilder.this,"Nochartelementwasclicked",Toast.LENGTH_SHORT)
- .show();
- }else{
- Toast.makeText(
- XYChartBuilder.this,
- "Chartelementinseriesindex"+seriesSelection.getSeriesIndex()
- +"datapointindex"+seriesSelection.getPointIndex()+"wasclicked"
- +"closestpointvalueX="+seriesSelection.getXValue()+",Y="+seriesSelection.getValue()
- +"clickedpointvalueX="+(float)xy[0]+",Y="+(float)xy[1],Toast.LENGTH_SHORT).show();
- }
- //-->end
- }
- });
- mChartView.setOnLongClickListener(newView.OnLongClickListener(){
- @Override
- publicbooleanonLongClick(Viewv){
- SeriesSelectionseriesSelection=mChartView.getCurrentSeriesAndPoint();
- if(seriesSelection==null){
- Toast.makeText(XYChartBuilder.this,"Nochartelementwaslongpressed",
- Toast.LENGTH_SHORT);
- returnfalse;//nochartelementwaslongpressed,soletsomething
- //elsehandletheevent
- }else{
- Toast.makeText(XYChartBuilder.this,"Chartelementinseriesindex"
- +seriesSelection.getSeriesIndex()+"datapointindex"
- +seriesSelection.getPointIndex()+"waslongpressed",Toast.LENGTH_SHORT);
- returntrue;//theelementwaslongpressed-theeventhasbeen
- //handled
- }
- }
- });
- //这段代码处理放大缩小
- //-->start
- mChartView.addZoomListener(newZoomListener(){
- publicvoidzoomApplied(ZoomEvente){
- Stringtype="out";
- if(e.isZoomIn()){
- type="in";
- }
- System.out.println("Zoom"+type+"rate"+e.getZoomRate());
- }
- publicvoidzoomReset(){
- System.out.println("Reset");
- }
- },true,true);
- //-->end
- //设置拖动图表时后台打印出图表坐标的最大最小值.
- mChartView.addPanListener(newPanListener(){
- publicvoidpanApplied(){
- System.out.println("NewXrange=["+mRenderer.getXAxisMin()+","+mRenderer.getXAxisMax()
- +"],Yrange=["+mRenderer.getYAxisMax()+","+mRenderer.getYAxisMax()+"]");
- }
- });
- layout.addView(mChartView,newLayoutParams(LayoutParams.FILL_PARENT,
- LayoutParams.FILL_PARENT));
- booleanenabled=mDataset.getSeriesCount()>0;
- setSeriesEnabled(enabled);
- }else{
- mChartView.repaint();
- }
- }
- privatevoidsetSeriesEnabled(booleanenabled){
- mX.setEnabled(enabled);
- mY.setEnabled(enabled);
- mAdd.setEnabled(enabled);
- }
- }
更多相关文章
- Android 统计图表引擎 AChartEngine (一) -简介
- android sqilte3数据库大小的测试
- android默认字体大小、高度、宽度
- 修改dialog的大小
- android获取屏幕分辨率大小(DisplayMetrics)
- Android图片的固定大小显示
- android ICS4.0.3 改变默认字体大小
- Android获取 应用程序大小,数据大小,缓存大小