ValueFormatter xAxisFormatter = new ValueFormatter() {
@Override
public String getFormattedValue(float value) {
if (value < 0 || value >= dateStr.size()) {
LegoLog.w("value 越界:" + value);
return "";
} else {
return dateStr.get((int) value);
}
}
};
chart.saveToGallery();
chart.saveToPath();
这个两个方法都可以将图表保存为图片,单只保存页面上显示的部分,无法保存长图。
//解决MPAndroidChart-LineChart清除数据刷新后X轴取值不准确的问题(非官方提供)
//https://blog.csdn.net/qq_35071078/article/details/76082125
//todo 图表特例(刷新图表):数据请求完成后,如果数据多,可以左右滑动,要等待refresh完成后,才可以加载新数据,否则图表会放大。
chart.setScaleMinima(1.0f, 1.0f);
chart.getViewPortHandler().refresh(new Matrix(), chart, true);
问题:一边滑动图表,一边异步加载新的数据,会导致图表变宽。具体现象如下:
方法一:
监听滑动手势,延迟加载新数据,但是只解决了情况一;无法根本解决问题(失败)。
/**
* 统一配置图表样式
*
* @param chart
* @return
*/
public static CombinedChart initChart(CombinedChart chart) {
chart.getDescription().setEnabled(false);//不显示数据描述
// 没有数据的时候,显示“暂无数据”
chart.setNoDataText("暂无数据");
chart.setBackgroundColor(Color.WHITE);
chart.setDrawGridBackground(false); // 不显示表格颜色
chart.setDrawBarShadow(false);
chart.setHighlightFullBarEnabled(false);
chart.setDrawOrder(new CombinedChart.DrawOrder[]{
CombinedChart.DrawOrder.BAR, CombinedChart.DrawOrder.LINE
});
//设置是否可以拖拽
chart.setDragEnabled(true);
//设置是否可以缩放 x和y,默认true
// chart.setScaleEnabled(false);//如果不能缩放,也不能左右移动。
chart.setScaleXEnabled(false);
chart.setScaleYEnabled(false);
// chart.setScaleX(0.5f);//整个图表X轴缩小0.5倍
chart.setOnChartGestureListener(new OnChartGestureListener() {
@Override
public void onChartGestureStart(MotionEvent me, ChartTouchListener.ChartGesture lastPerformedGesture) {
// LegoLog.d("onChartGestureStart");
}
@Override
public void onChartGestureEnd(MotionEvent me, ChartTouchListener.ChartGesture lastPerformedGesture) {
long time = System.currentTimeMillis();
MainApplication.setGestureEndTime(time);
// LegoLog.d("onChartGestureEnd:" + time);
}
@Override
public void onChartLongPressed(MotionEvent me) {
// LegoLog.d("onChartLongPressed");
}
@Override
public void onChartDoubleTapped(MotionEvent me) {
// LegoLog.d("onChartDoubleTapped");
}
@Override
public void onChartSingleTapped(MotionEvent me) {
// LegoLog.d("onChartSingleTapped");
}
@Override
public void onChartFling(MotionEvent me1, MotionEvent me2, float velocityX, float velocityY) {
// LegoLog.d("onChartFling");
}
@Override
public void onChartScale(MotionEvent me, float scaleX, float scaleY) {
}
@Override
public void onChartTranslate(MotionEvent me, float dX, float dY) {
}
});
//图例说明
Legend l = chart.getLegend();
l.setWordWrapEnabled(true);
l.setVerticalAlignment(Legend.LegendVerticalAlignment.BOTTOM);
l.setHorizontalAlignment(Legend.LegendHorizontalAlignment.CENTER);
l.setOrientation(Legend.LegendOrientation.HORIZONTAL);
l.setDrawInside(false);
chart.invalidate();
return chart;
}
/**
* 设置图表数据
*
* @param chartBean
* @param chart
* @param mContext
* @param queryAll
* @return
*/
public static CombinedChart setChartDate(ChartBean chartBean, CombinedChart chart, Context mContext, boolean queryAll) {
ArrayList barEntryList = chartBean.getBarEntryList();
ArrayList lineList = chartBean.getLineEntryList();
List dateStr = chartBean.getDateStr();
// LegoLog.d(barEntryList.size() + ",," + lineList.size() + ",," + dateStr.size());
/
ValueFormatter xAxisFormatter = new ValueFormatter() {
@Override
public String getFormattedValue(float value) {
// LegoLog.d(dateStr.size() + ",value:" + value);
if (value < 0 || value >= dateStr.size()) {
LegoLog.w("value 越界:" + value);
return "";
} else {
return dateStr.get((int) value);
}
}
};
XAxis xAxis = chart.getXAxis();
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
xAxis.setDrawGridLines(false);
xAxis.setGranularity(1f); // 网格线条间距(设置x轴间距)
xAxis.setLabelCount(LABEL_COUNT, false);
// xAxis.setAxisLineWidth(5);//设置该轴轴行的宽度。
xAxis.setValueFormatter(xAxisFormatter);
//文字倾斜展示
xAxis.setLabelRotationAngle(-60);
YAxis rightAxis = chart.getAxisRight();
rightAxis.setDrawGridLines(false);
rightAxis.setAxisMinimum(0f); // this replaces setStartAtZero(true)
YAxis leftAxis = chart.getAxisLeft();
leftAxis.setDrawGridLines(false);
leftAxis.setAxisMinimum(0f); // this replaces setStartAtZero(true)
// LegoLog.d("数量:" + barEntryList.size());
CombinedData combinedData = new CombinedData();
combinedData.setValueTextSize(10f);
combinedData.setData(BizUtil.generateBarData(mContext, barEntryList, queryAll));
combinedData.setData(BizUtil.generateLineData(mContext, lineList));
chart.setData(combinedData);
// //解决MPAndroidChart-LineChart清除数据刷新后X轴取值不准确的问题(非官方提供)
// //https://blog.csdn.net/qq_35071078/article/details/76082125
// //todo 图表特例(刷新图表):数据请求完成后,如果数据多,可以左右滑动,要等待refresh完成后,才可以加载新数据,否则图表会放大。
// chart.setScaleMinima(1.0f, 1.0f);
// chart.getViewPortHandler().refresh(new Matrix(), chart, true);
// chart.notifyDataSetChanged();//动态添加或移除数据后, 调用invalidate()刷新图表之前,必须调用 notifyDataSetChanged() .
chart.setVisibleXRangeMaximum(LABEL_COUNT);//超过这个值可以左右滑动,(必须先设置数据源)
chart.invalidate();
return chart;
}
/**
* 生成Bar数据
*
* @param barEntryList
* @return
*/
private static BarData generateBarData(Context mContext, ArrayList barEntryList, boolean queryAll) {
BarDataSet set1 = new BarDataSet(barEntryList, "单日数量");
set1.setDrawIcons(false);
int barColor = 0;
if (queryAll) {
barColor = ContextCompat.getColor(mContext, R.color.color_fdad3c);
} else {
barColor = ContextCompat.getColor(mContext, R.color.color_63C25C);
}
set1.setColor(barColor);
set1.setValueTextColor(barColor);
set1.setValueTextSize(10f);
set1.setAxisDependency(YAxis.AxisDependency.LEFT);
BarData barData = new BarData(set1);
// data.setValueTypeface(tfLight);
//根据X轴显示的最大条数,得个每个bar所占的宽度,再设置每个柱状所占宽度的%。
if (barEntryList.size() > LABEL_COUNT) {
barData.setBarWidth(0.6f);
} else {
barData.setBarWidth(0.05f * barEntryList.size());
}
return barData;
}
/**
* 生成Line数据
*
* https://blog.csdn.net/baidu_25797177/article/details/78424519
*
* @param mContext 上下文
* @param lineList 线型数据
*/
private static LineData generateLineData(Context mContext, ArrayList lineList) {
LineData lineData = new LineData();
// int lineColor = Color.rgb(240, 238, 70);
int lineColor = ContextCompat.getColor(mContext, R.color.color_F0EE46);
LineDataSet set = new LineDataSet(lineList, "累计总量");
set.setColor(lineColor);
set.setLineWidth(2.5f);
set.setCircleColor(lineColor);
set.setCircleRadius(5f);//折线点半径
set.setFillColor(lineColor);
set.setMode(LineDataSet.Mode.LINEAR); //设置曲线展示为圆滑曲线(如果不设置则默认折线)
set.setDrawValues(true); //设置是否显示每个点的值,默认值true
set.setValueTextSize(10f);
set.setValueTextColor(lineColor);
set.setAxisDependency(YAxis.AxisDependency.LEFT);
set.setCubicIntensity(0.05f);//设置曲率(曲线的平滑度,值越大越平滑。)
lineData.addDataSet(set);
return lineData;
}
方法二:
最终解决方案:不共用一个chart,使用TabLayout+ViewPager(多次实例化同一个Fragment)(成功)。