前言
MPAndroidChart是一个强大的Android图表加载库。支持展示折线图、柱状图、饼图、雷达图、气泡图、K线图和图表的缩放、拖拽、动画功能。 本篇介绍MpCahrtLib中的一种图表控件-PieChart,饼图。
tip:最有效的理解与实现需求(定制)的方式是:查看源码。
代码
- MPChartLib
- 示例代码
简要说明
饼图的源代码主要是如下两个类:
- PieChart
- PieChartRenderer
PieChart - 图表整体结构
从如下代码就可窥见一二。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
protected void init() {
super.init();
mRenderer = new PieChartRenderer(this, mAnimator, mViewPortHandler);
mXAxis = null;
mHighlighter = new PieHighlighter(this);
}
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (mData == null)
return;
mRenderer.drawData(canvas);
if (valuesToHighlight())
mRenderer.drawHighlighted(canvas, mIndicesToHighlight);
mRenderer.drawExtras(canvas);
mRenderer.drawValues(canvas);
mLegendRenderer.renderLegend(canvas);
drawDescription(canvas);
drawMarkers(canvas);
}
PieChartRenderer - 负责PieChart具体绘制。
主要有:drawData(),drawValues(),drawExtras(),drawHighlighted()
- drawData() 饼图各大块的计算与绘制
- drawHighlighted() 点按后的高亮模式绘制
- drawExtras()内包含了 drawHole()内圈、drawCenterText()内圈内文字、c.drawBitmap()图
- drawValues 饼图各大块上的文本
主要方法介绍
- PieDataSet.setSliceSpace(); //设置饼图饼块间距,传入值的单位是dp,取值范围[0,20],默认是0dp
- PieDataSet.setSelectionShift(); //设置饼图饼块选中效果时(highlighted),距离饼图中心距离,默认是12dp
- PieChart.setDrawSliceText(false); //是否显示饼图上的X轴名称 新版本改成
- PieChart.setDrawEntryLabels(false);//是否显示饼图上的X轴名称,setDrawSliceText已删除
- PieData.setDrawValues(false); //隐藏饼图片上的Y轴数据(百分比数据)
- PicChart.setOnChartValueSelectedListener();//饼块选中回调
- PicChart.animateX(); //按X轴动画显示,个人感觉和animateY()、animateXY()差别不大
- PicChart.animateY(); //
- PicChart.animateXY(); //
PicChart.spin(); //设置旋转动画
PieChart.setUsePercentValues(true);//Y轴值是否显示百分比值,源码内如下处理
1
2float value = mChart.isUsePercentValuesEnabled() ? entry.getVal()
/ yValueSum * 100f : entry.getVal();Piechart.setDescription(“”);//隐藏Desc 新版本改成 PieChart.getDescription().setEnabled(false);//隐藏/显示Desc,setDescription()已删除
PieChart.setExtraOffsets(5, 10, 5, 5);//图表距图表边距的距离,分别为:左,上,右,下,该值为dp单位。
PieChart.setDragDecelerationFrictionCoef(0.95f);//拖动时的减速摩擦系数,即手指离开后,饼图还能再旋转多久。该值范围[0,1),值越大,旋转越久。默认为0.9f。
PieChart.setCenterTextTypeface();//设置中心文本字体
PieChart.setCenterText();//设置中心文本
PieChart.setDrawHoleEnabled(true);//是否显示内圆
PieChart.setHoleColor(Color.WHITE);//设置内圆颜色
PieChart.setTransparentCircleColor(Color.WHITE);//设置贴着内圆外面的透明圆的颜色
PieChart.setTransparentCircleAlpha(110);//设置贴着内圆外面的透明圆的透明度,范围:[0,255],0:完全透明,255:完全不透明。默认为100
PieChart.setHoleRadius(58f);//设置内圆半径,该值为内圆半径与整个饼图的比例。默认为50f,即50% PieChart.setTransparentCircleRadius(61f);//the radius of the transparent circle next to the chart-hole in the center,翻译过来就是:贴着内圆外面的透明圆的半径,该值也是比例,默认为55f,即55%
PieChart.setDrawCenterText(true);//是否显示内圆文本
PieChart.setRotationAngle(0);//设置饼图起始饼块绘制的角度。默认270f(正北)
PieChart.setRotationEnabled(true);//是否可以手动旋转
PieChart.setHighlightPerTapEnabled(true);//饼块选中是否高亮
PicChart.saveToGallery(); //保存到gallery(图库)
PicChart.saveToPath(); // 保存到指定路径
设置label样式
- PicChart.setEntryLabelColor(Color.WHITE);
- PicChart.setEntryLabelTypeface();
- PicChart.setEntryLabelTextSize(12f);
设置legend(图例)样式
- Legend.setVerticalAlignment(Legend.LegendVerticalAlignment.TOP);
- Legend.setHorizontalAlignment(Legend.LegendHorizontalAlignment.RIGHT);
- Legend.setOrientation(Legend.LegendOrientation.VERTICAL);
- Legend.setForm();//设置图例形状,有3种:SQUARE, CIRCLE, LINE。即:方,圆,线。默认为SQUARE。
- Legend.setXEntrySpace(7f);//图例条目间距,setOrientation(Legend.LegendOrientation.HORIZONTAL)有效
- Legend.setYEntrySpace(0f);//图例条目间距,setOrientation(Legend.LegendOrientation.VERTICAL)有效
- Legend.setYOffset(0f);//设置Y轴边距,在已有ExtraOffsets等边距的基础上再加该边距。