1.MPAndroidChart接入
//MPAndroidChart
implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
2.设置数据加载动画
mBarChart.animateXY(1000, 1000);
首先需要说的是上面这行代码是所有博客和文档里面都提到的,通过该方法可以设置数据加载动画。但是在实际使用过程中你会发现一个问题,就是在测试包(未混淆)过程中一切正常,但是一旦混淆打包使用的时候动画效果并没有出现,但是官方文档也并没有提出有需要混淆的规则。
这种情况下就需要自己添加混淆规则来避免加载动画失效的问题
#MPAndroidChart
-dontwarn com.github.mikephil.**
-keep class com.github.mikephil.**{ *; }
3.设置坐标轴最小值和最大值
使用过程中可能有设置了BarWidth值比较大的时候,导致设置了坐标轴最小值之后,第一条数据的Bar显示不完全。这时候可以通过修改坐标轴的最小值来适应第一条数据的显示。
xAxis.setAxisMinimum(0.7f);
4.自定义轴下标
xAxis.setValueFormatter(new ValueFormatter() {
@Override
public String getFormattedValue(float value) {
return mMonths[((int) value % mMonths.length)];
}
});
leftAxis.setValueFormatter(new ValueFormatter() {
@Override
public String getFormattedValue(float value) {
DecimalFormat mFormat = new DecimalFormat("###,###,##0.00");
return mFormat.format(value);
}
});
网上很多文档中提到的自定义ValueFormatter都是过时不可用的了,需要使用上述的ValueFormatter并重写相应方法来实现自定义
5.自定义柱状图数值
setBarChartData(mList);
for (IDataSet set : mBarChart.getData().getDataSets()) {
set.setDrawValues(true);
set.setValueTextColor(getResources().getColor(R.color.color_barchart_value));
set.setValueFormatter(new ValueFormatter() {
@Override
public String getFormattedValue(float value) {
DecimalFormat mFormat = new DecimalFormat("###,###,##0.00");
return mFormat.format(value);
}
});
}
mBarChart.animateXY(1000, 1000);
mBarChart.invalidate();
如果想要自定义柱状图上方的数值显示,可以用上述方法来自定义数值的大小,颜色,是否显示,自定义格式等等。记住最后设置完的时候调用invalidate();方法进行刷新操作。
接下来放一个水平柱状图的实例代码仅供参考相关属性设置:
HBarChartActivity.java
public class HBarChartActivity extends BaseAppCompatActivity {
@BindView(R.id.hBarChart)
HorizontalBarChart hBarChart;
@Override
protected int getLayout() {
return R.layout.activity_hbarchart;
}
@Override
public void initView() {
initHBarChart();
}
@Override
public void initEvent() {
}
@Override
public void initData() {
}
/**
* 初始化水平柱形图图控件属性
*/
private void initHBarChart() {
//设置阴影
hBarChart.setDrawBarShadow(false);
//设置柱状图上数值
hBarChart.setDrawValueAboveBar(true);
//不显示描述
hBarChart.getDescription().setEnabled(false);
//设置最大显示数量
hBarChart.setMaxVisibleValueCount(60);
hBarChart.setPinchZoom(false);
//是否显示表格颜色
hBarChart.setDrawGridBackground(false);
//设置是否可以缩放
hBarChart.setScaleEnabled(false);
//设置是否可以触摸
hBarChart.setTouchEnabled(false);
//设置是否可以拖拽
hBarChart.setDragEnabled(false);
//自定义坐标轴适配器,设置在X轴
DecimalFormatter formatter = new DecimalFormatter();
XAxis xl = hBarChart.getXAxis();
//下标位置
xl.setPosition(XAxis.XAxisPosition.BOTTOM);
//设置旋转角度
/// xl.setLabelRotationAngle(-45f);
// 设置 x 坐标轴 宽度
/// xl.setAxisLineWidth(2f);
// 设置 x轴 的刻度数量
xl.setLabelCount(10);
//是否显示轴线
xl.setDrawAxisLine(false);
//是否显示网格线
xl.setDrawGridLines(false);
//下标间隔
xl.setGranularity(1f);
//文字大小
xl.setTextSize(20);
//文字居中
xl.setCenterAxisLabels(false);
//最小值(小于文字宽度一半最佳)
xl.setAxisMinimum(-0.3f);
//最大值(大于文字宽度一半最佳)
/// xl.setAxisMaximum(3.3f);
//设置X轴文字自定义适配器
xl.setValueFormatter(formatter);
//Y轴左侧隐藏
hBarChart.getAxisRight().setEnabled(false);
//Y轴右侧隐藏
hBarChart.getAxisLeft().setEnabled(false);
//示例隐藏
hBarChart.getLegend().setEnabled(false);
//
setHBarChartData();
hBarChart.setFitBars(true);
hBarChart.invalidate();
//动画失效可能原因 1.添加混淆文件 2.先调用invalidate方法刷新数据
hBarChart.animateY(2500);
}
/**
* 设置水平柱形图数据的方法
*/
private void setHBarChartData() {
//填充数据,在这里换成自己的数据源
ArrayList<BarEntry> yVals1 = new ArrayList<BarEntry>();
yVals1.add(new BarEntry(0, 4));
yVals1.add(new BarEntry(1, 2));
yVals1.add(new BarEntry(2, 6));
yVals1.add(new BarEntry(3, 1));
yVals1.add(new BarEntry(4, 9));
yVals1.add(new BarEntry(5, 4));
BarDataSet set1;
if (hBarChart.getData() != null &&
hBarChart.getData().getDataSetCount() > 0) {
set1 = (BarDataSet) hBarChart.getData().getDataSetByIndex(0);
set1.setValues(yVals1);
hBarChart.getData().notifyDataChanged();
hBarChart.notifyDataSetChanged();
} else {
//图例颜色示意
set1 = new BarDataSet(yVals1, "DataSet 1");
set1.setColors(ColorTemplate.LIBERTY_COLORS);
set1.setDrawIcons(false);
ArrayList<IBarDataSet> dataSets = new ArrayList<IBarDataSet>();
dataSets.add(set1);
BarData data = new BarData(dataSets);
data.setValueTextSize(10f);
data.setBarWidth(0.6f);
hBarChart.setData(data);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// TODO: add setContentView(...) invocation
ButterKnife.bind(this);
}
public class DecimalFormatter extends ValueFormatter {
private DecimalFormat format;
public DecimalFormatter() {
format = new DecimalFormat("###,###,##0.00");
}
@Override
public String getFormattedValue(float value, AxisBase axis) {
return format.format(value) + "$";
}
}
}
布局文件activity_hbarchart.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
<com.github.mikephil.charting.charts.HorizontalBarChart
android:id="@+id/hBarChart"
android:layout_width="500dp"
android:layout_height="300dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>