说到Android中的图表库,除了老牌的谷歌推荐的Achartengine图表库,那不得不提一下MPAndroidChart这个类库了,相比前者,后者功能十分丰富,github的star超过17K。其支持直方图(柱状图)、折线图、饼状图、气泡图、雷达图、散点图、蜡烛图、组合图。支持缩放、点击事件、动画效果等。截至于本文,最新的版本是3.0.2,相比以前的2.x的版本,功能上有很大的丰富,支持的属性更多了,API改动有点大。详细的功能和特性介绍参见其github地址:https://github.com/PhilJay/MPAndroidChart
使用前,要先添加依赖:
首先在项目的build.gradle文件下添加如下:
allprojects {
repositories {
maven { url "https://jitpack.io" }
}
}
然后在相应的module的build.gradle下添加依赖:
dependencies {
compile 'com.github.PhilJay:MPAndroidChart:v3.0.2'
}
下面就一些常用的属性来说明
轴的属性(XAxis/YAxis)
leftAxis = mBarChart.getAxisLeft();//获得左边Y轴对象实例
rightAxis = mBarChart.getAxisRight();//获得右边Y轴对象实例
xAxis = mBarChart.getXAxis();//获得x轴对象实例
获得对象的实例后,我们就可以通过这些实例来设置一些常用的属性
setEnabled(boolean enabled): //是否启用轴,如果禁用,关于轴的设置所有属性都将被忽略
setDrawLabels(boolean enabled):// 是否绘制标签
setDrawAxisLine(boolean enabled):// 是否绘制轴线
setDrawGridLines(boolean enabled)://是否和网格轴线
setAxisLineWidth(float f)://设置轴线的宽度
setPosition(YAxis.YAxisLabelPosition.INSIDE_CHART);//设置轴的值显示的位置
setAxisMinValue(float min): //设置轴的最小值。这样设置将不会根据提供的数据自动计算。
setGranularity(float gran)://设置Y轴最小间隔
setShowOnlyMinMax(boolean enabled)://如果启用,此轴直线式最大值和最小值架构忽略定义的标签数。
setLabelCount(int count, boolean force): //设置轴的标签数目,不是精确值,如果强制设置,可能导致轴线不均匀
setInverted(boolean enabled): //反转该轴,如果为true,最大值在底部,顶部是最小值。
setSpaceTop(float percent): //设置轴上最高位置在表中最高位置的顶部间距,占总轴的百分比。
setSpaceBottom(float percent): //设置轴上最低位置在表中最低位置的底部间距,占总轴的百分比。
setAvoidFirstLastClipping(boolean enabled)://如果设置为true,将避免图表或屏幕的边缘的第一个和最后一个轴中的标签条目被裁剪。
setSpaceBetweenLabels(int characters)://设置应该x轴标签之间的被排除在外字符,默认空间:4。
enableGridDashedLine(float lineLength, float spaceLength, float phase): //使网格线在虚线画模式,lineLength控制线长度 , spaceLength控制线之间空格长度, phase 控制起点
setDragScaleEnabled(boolean enabled): //设置是否可以拖拽,缩放
setHighlightEnabled(boolean enabled) ://设置点击value的时候,是否高亮显示
x轴格式化值
setValueFormatter(XAxisValueFormatter formatter):在绘制之前,动态的设置自定义格式.
public class StringAxisValueFormatter implements IAxisValueFormatter {
private List<String> xValues;
public StringAxisValueFormatter(List<String> xValues) {
this.xValues = xValues;
}
@Override
public String getFormattedValue(float v, AxisBase axisBase) {
if (v < 0 || v > (xValues.size() - 1)){//使得两侧柱子完全显示
return "";
}
return xValues.get((int)v);
}
}
或者
public class MyValueFormatter implements ValueFormatter {
private DecimalFormat mFormat;
public MyValueFormatter() {
mFormat = new DecimalFormat("###,###,##0.0"); // use one decimal
}
@Override
public String getFormattedValue(float value, Entry entry, int dataSetIndex, ViewPortHandler viewPortHandler) {
// write your logic here
return mFormat.format(value) + " $"; // e.g. append a dollar-sign
}
}
使用
// usage on whole data object
lineData.setValueFormatter(new MyValueFormatter());
// usage on individual dataset object
lineDataSet.setValueFormatter(new MyValueFormatter());
chart图表的基本公有属性
setBackgroundColor(int color): //设置整个图表视图的背景
setDescription(String desc): //右下角对图表的描述信息
setDescriptionColor(int color): //描述信息的颜色
setDescriptionPosition(float x, float y): //自定义描述信息位置.
setDescriptionTypeface(Typeface t): //自定义描述信息字体
setDescriptionTextSize(float size): //自定义描述信息字体大小, 最小值6f, 最大值16f.
setNoDataText(String desc): //设置空表的描述信息
setDrawGridBackground(boolean enabled): //是否绘制网格背景
setGridBackgroundColor(int color): //设置网格背景颜色
setDrawBorders(boolean enabled): //是否绘制边线
setBorderColor(int color)://边线颜色
setBorderWidth(float width)://边线宽度,单位dp
setMaxVisibleValueCount(int count): //设置图表绘制可见标签数量最大值. 仅在setDrawValues() 启用时生效
setMinOffset(float dp);//设置填充属性,类似与padding的效果
setScaleEnabled(false);//禁止缩放
setTouchEnabled(boolean b);//设置是否可以触摸,注意:设置false后,点击事件不再生效,也没有高亮的显示了
setValueTypeface(Typeface t)://设置字体
dataSet.setDrawValues(boolean)//是dataSet的属性,设置是否在图上显示出当前点(柱状图)的值
图例的说明
//折线图例 标签 设置
Legend legend = mBarChart.getLegend();
legend.setForm(Legend.LegendForm.SQUARE);//图示 标签的形状。 正方形
legend.setTextSize(11f);
//显示位置
legend.setVerticalAlignment(Legend.LegendVerticalAlignment.BOTTOM);
legend.setHorizontalAlignment(Legend.LegendHorizontalAlignment.LEFT);
legend.setOrientation(Legend.LegendOrientation.HORIZONTAL);
legend.setDrawInside(false);
动画效果
animateX(int durationMillis) : x轴方向
animateY(int durationMillis) : y轴方向
animateXY(int xDuration, int yDuration) : xy轴方向
设置点击事件
chart.setOnChartValueSelectedListener(new OnChartValueSelectedListener() {
@Override
public void onValueSelected(Entry e, Highlight h) {
Log.e("---->",e.getX()+" "+e.getY());
}
@Override
public void onNothingSelected() {
}
});
好的,基本属性就介绍到这里了,下一篇介绍其基本的使用。