Android开发,AchartEngine使用

本文详细介绍了AchartEngine柱状图的配置方法,包括背景设置、标题文本大小、轴标签显示等,并提供了实现多数据在一个柱状条上显示的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

AchartEngine是我这两天正在学习使用的一个由谷歌提供的图表库,用于显示各种图表,包括柱状图,饼图,折线图等

我主要用的是柱状图

下面是一些柱状图的主要参数(部分为转载)

1.      修改背景色或设置背景图片
背景色设置需要设置两项:setMarginsColor(设置四边颜色)以及setBackgroundColor(设置中间背景色)
设置背景图片:
        http://blog.youkuaiyun.com/kmyhy/article/details/6590294
2.      setAxisTitleTextSize(16);// 设置坐标轴标题文本大小
3.      setChartTitleTextSize(20); // 设置图表标题文本大小
4.      setLabelsTextSize(15); // 设置轴标签文本大小
5.      setLegendTextSize(15); // 设置图例文本大小
6.      renderer.setChartTitle( "个人收支表");//设置柱图名称
7.      renderer.setXTitle( "名单" );//设置X轴名称
8.      renderer.setYTitle( "金额" );//设置Y轴名称
9.      renderer.setXAxisMin(0.5);//设置X轴的最小值为0.5
10.  renderer.setXAxisMax(5.5);//设置X轴的最大值为5
11.  renderer.setYAxisMin(0);//设置Y轴的最小值为0
12.  renderer.setYAxisMax(500);//设置Y轴最大值为500
13.  renderer.setDisplayChartValues(true);//设置是否在柱体上方显示值
14.  renderer.setShowGrid(true);//设置是否在图表中显示网格
15.  renderer.setXLabels(0);//设置X轴显示的刻度标签的个数
16.  如果想要在X轴显示自定义的标签,那么首先要设置renderer.setXLabels(0);  如果不设置为0,那么所设置的Labels会与原X坐标轴labels重叠
其次我们要renderer.addTextLabel()循环添加
eg:for(int i=0;i<13;i++)
       {
         renderer.addTextLabel(i+1,years[i]); //循环添加Xlabel其中显示的label放在years数组中
       }
17.  renderer.setXLabelsAlign(Align.RIGHT);//设置刻度线与X轴之间的相对位置关系
18.  renderer.setYLabelsAlign(Align.RIGHT);//设置刻度线与Y轴之间的相对位置关系
19.  renderer.setZoomButtonsVisible(true);//设置可以缩放
20.  renderer.setPanLimits(newdouble[] { 0, 20, 0, 140 });//设置拉动的范围
21.  renderer.setZoomLimits(newdouble[] { 0.5, 20, 1, 150 });//设置缩放的范围
22.  renderer.setRange(newdouble[]{0d, 5d, 0d, 100d}); //设置chart的视图范围
23.  renderer.setFitLegend(true);// 调整合适的位置
24.  renderer.setClickEnabled(true)//设置是否可以滑动及放大缩小;
25.  Dataset和Render参数介绍:
       http://blog.youkuaiyun.com/lk_blog/article/details/7645661
26.ChartView.repaint();是重新绘图的命令

27.setClickEnabled(true);//是否可点击

28.setSelectableBuffer(20);//点击区域大小

下面是在XYChart中点击某个点,触发事件的使用方法:
 
class ChartViewClick implements View.OnClickListener {


    @Override
    public void onClick(View v) {
      GraphicalView graphicalView = (GraphicalView) v;
     
      //获取当前点击点
      SeriesSelection seriesSelection = graphicalView.getCurrentSeriesAndPoint();
      
      if (seriesSelection == null) {
        return;
      }
      int x = (int) seriesSelection.getXValue();
      Toast.makeText(context, "第几个点" + x, Toast.LENGTH_SHORT).show();
    }
  }
 
  public SeriesSelection getCurrentSeriesAndPoint() {
    return mChart.getSeriesAndPointForScreenCoordinate(new Point(oldX, oldY));
  }

 oldx,oldy就是触控事件中获取的
 
  @Override
  public boolean onTouchEvent(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
      // save the x and y so they can be used in the click and long press
      // listeners
      oldX = event.getX();
      oldY = event.getY();
    }
    if (mRenderer != null && (mRenderer.isPanEnabled() || mRenderer.isZoomEnabled())) {
      if (mTouchHandler.handleTouch(event)) {
        return true;
      }
    }
    return super.onTouchEvent(event);
  }

29.使用一条柱状条显示两个及以上数据

有时候会遇到一个统计,分为几个小类,但是需要放在一起


比如这样

在比如


来看代码

public View execute(Context context, List<HttpSingleTaskSelectEntity> selectList) {
		this.context = context;
		selectEntities = selectList;
		//Type有两种DEFAULT和STACKED,前者是讲柱状条并列,后者是放在一条上
		return ChartFactory.getBarChartView(context, getBarDemoDataset(), getBarDemoRenderer(), Type.STACKED);
	}
这是我写的用于显示柱状图的类,其中getBarDemoDataSet就是用于给柱状图填充数据,理所当然,我们的操作就在这里面


/**
	 * XYMultipleSeriesDataset 类型的对象,用于提供图表需要表示的数据集, 这里我们用 getBarDemoDataset
	 * 来得到它。
	 */
	private XYMultipleSeriesDataset getBarDemoDataset() {
		XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
		String[] titles = new String[]{"未核查","已核查"};
		List<List<Double>> values = new ArrayList<List<Double>>();
		List<Double> nocheck = new ArrayList<Double>();
		List<Double> checked = new ArrayList<Double>();
		final int total = selectEntities.size();
		int temp;
		for (int i = 0; i < total; i++) {
			nocheck.add(Double.parseDouble(selectEntities.get(i).getNoCheckCount()));
			checked.add(Double.parseDouble(selectEntities.get(i).getCheckCount()));
			temp = Integer.parseInt(selectEntities.get(i).getTotal());
			max = max>temp?max:temp;
		}
		values.add(nocheck);
		values.add(checked);
		
		for (int i = 0; i < titles.length; i++) {
			CategorySeries series = new CategorySeries(titles[i]);
			List<Double> v = values.get(i);
			int seriesLength = v.size();
			for (int j = 0; j < seriesLength; j++) {
				series.add(v.get(j));
			}
			dataset.addSeries(series.toXYSeries());
		}

里面的titles,和List<List<Double>>,他们的数量都是2,你们可以根据需要,设置多个,第一个for是我用于获取数据的,第二个for是必须要用到的。

这样写完之后,柱状条基本就实现我们要做的了

另外,就是颜色,如果只按照上面的做,看不出来效果

看下面的代码

public XYMultipleSeriesRenderer getBarDemoRenderer() {
		XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
		int[] colors = new int[] { Color.RED, Color.GREEN};
		for (int i = 0; i < colors.length; i++) {
			SimpleSeriesRenderer r = new SimpleSeriesRenderer();
			r.setColor(colors[i]);
			renderer.addSeriesRenderer(r);
		}
		renderer.setApplyBackgroundColor(true);
		renderer.setBackgroundColor(Color.TRANSPARENT);
		renderer.setMarginsColor(context.getResources().getColor(R.color.white));
		renderer.setZoomEnabled(false, false);//设置放大缩小属性
		renderer.setPanEnabled(false, false);//设置滑动属性
		renderer.setLabelsTextSize(15);//设置轴标签文本大小
		renderer.setLabelsColor(Color.BLACK);//设置轴标签颜色
		
		renderer.getSeriesRendererAt(0).setDisplayChartValues(true);//设置是否在柱体上方显示值
		renderer.getSeriesRendererAt(1).setDisplayChartValues(true);
		
		renderer.setShowGridX(true);//设置是否显示网格
		renderer.setBarSpacing(0.2);
		
		//设置了下坐标轴样式。
		renderer.setChartTitle("完成情况");
		renderer.setXTitle("区域名");
		renderer.setYTitle("数量");
		renderer.setXAxisMin(1.5);
		renderer.setXAxisMax(selectEntities.size()+0.5);
		renderer.setYAxisMin(0);
		renderer.setYAxisMax(max);
		return renderer;
	}
这是设置render的代码,其中

int[] colors = new int[] { Color.RED, Color.GREEN};
		for (int i = 0; i < colors.length; i++) {
			SimpleSeriesRenderer r = new SimpleSeriesRenderer();
			r.setColor(colors[i]);
			renderer.addSeriesRenderer(r);
		}

就是用于控制颜色,不难看出,这里的length长度也是2

所以这里需要注意,这三个集合(数组)的长度尽量统一,恩,我也没试过不统一的情况,见谅。


最后就是上面看的的TYPE参数

他有两个字,TYPE.DEFAULT和TYPE.STACKED,前者是控制同一主体的不同参数并排显示,后者是控制同一主体的不同参数层叠显示。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值