我们接着上篇,来说下k线的分页加载更多和高亮线的相关
图表的相关滑动都在OnChartGestureListener这个接口里,
我们定义一个类去实现它的方法
这个接口总共有8个方法
onChartGestureStart ——>字面意思就是开始
onChartGestureEnd ——>结束
onChartLongPressed ——>长按事件
onChartDoubleTapped——>双击事件
onChartSingleTapped——>单击事件
onChartFling——>手指滑动事件
onChartScale——>缩放事件
onChartTranslate——移动事件
我们实现上下两个图表联动也是在这个类里来实现的
private Chart srcChart;
private Chart[] dstCharts;
//这个方法就是实现上下图表联动的--->方法来自网络
void syncCharts() {
Matrix srcMatrix;
float[] srcVals = new float[9];
Matrix dstMatrix;
float[] dstVals = new float[9];
// get src chart translation matrix:
srcMatrix = srcChart.getViewPortHandler().getMatrixTouch();
srcMatrix.getValues(srcVals);
// apply X axis scaling and position to dst charts:
for (Chart dstChart : dstCharts) {
if (dstChart.getVisibility() == View.VISIBLE) {
dstMatrix = dstChart.getViewPortHandler().getMatrixTouch();
dstMatrix.getValues(dstVals);
dstVals[Matrix.MSCALE_X] = srcVals[Matrix.MSCALE_X];
dstVals[Matrix.MSKEW_X] = srcVals[Matrix.MSKEW_X];
dstVals[Matrix.MTRANS_X] = srcVals[Matrix.MTRANS_X];
dstVals[Matrix.MSKEW_Y] = srcVals[Matrix.MSKEW_Y];
dstVals[Matrix.MSCALE_Y] = srcVals[Matrix.MSCALE_Y];
dstVals[Matrix.MTRANS_Y] = srcVals[Matrix.MTRANS_Y];
dstVals[Matrix.MPERSP_0] = srcVals[Matrix.MPERSP_0];
dstVals[Matrix.MPERSP_1] = srcVals[Matrix.MPERSP_1];
dstVals[Matrix.MPERSP_2] = srcVals[Matrix.MPERSP_2];
dstMatrix.setValues(dstVals);
dstChart.getViewPortHandler().refresh(dstMatrix, dstChart, true);
}
}
}
我们滑动要分页加载历史k线数据该怎么解决呢
1.定义一个接口LoadMoreListener 加载更多接口
public interface LoadMoreListener {
void onLoadMore();
}
2.定义一个标记是否加载更多
private boolean canloadMore = false;
3.我们在onChartGestureStart设置canloadMore为false
4.在onChartGestureEnd中我们判断是否该加载更多
if (canloadMore && srcChart instanceof CombinedChart && loadmore != null) {
//这个是我自身需求获取最小可见
float lowestVisibleX = ((CombinedChart) srcChart).getLowestVisibleX();
float highestVisibleX = ((CombinedChart) srcChart).getHighestVisibleX();
if (xVisibleminAndMax != null) {
xVisibleminAndMax.xVisiblemin((int) lowestVisibleX);
xVisibleminAndMax.xVisiblemax((int) highestVisibleX);
}
//主要这个方法
loadmore.onLoadMore();
}
5.我们在滑动中事件onChartTranslate设置
if (!canloadMore && srcChart instanceof CombinedChart && loadmore != null) {
float lowestVisibleX = ((CombinedChart) srcChart).getLowestVisibleX();
float highestVisibleX = ((CombinedChart) srcChart).getHighestVisibleX();
if (xVisibleminAndMax != null) {
xVisibleminAndMax.xVisiblemin((int) lowestVisibleX);
xVisibleminAndMax.xVisiblemax((int) highestVisibleX);
}
//向右滑动
if (dX > 0) {
//滑动的可见最小值小于50就去加载数据
if (lowestVisibleX < 50) {
canloadMore = true;
}
}
}
6.在Activity中实现这个接口加载更多就行。
我们在滑动高亮线改变标记
1.高亮线的事件在OnChartValueSelectedListener
@Override
public void onValueSelected(Entry e, Highlight h) {
//这里就是改变上面MA5,MA10,MA20的值
selectVaules(e, h);
stock_CombinedBarChar.highlightValues(new Highlight[]{h});
//当高亮线显示的时候取消图表拖动功能
mCombinedChart.setDragEnabled(false);
stock_CombinedBarChar.setDragEnabled(false);
mCombinedChart.setHighlightPerDragEnabled(true);
stock_CombinedBarChar.setHighlightPerDragEnabled(true);
}
@Override
public void onNothingSelected() {
fragmentToActivity.onNothingSelected();
stock_CombinedBarChar.highlightValues(null);
//当高亮线消失的时候开启图表拖动功能
mCombinedChart.setDragEnabled(true);
stock_CombinedBarChar.setDragEnabled(true);
mCombinedChart.setHighlightPerDragEnabled(false);
stock_CombinedBarChar.setHighlightPerDragEnabled(false);
}
我们第一次打开k线的时候是将数据移动到最右侧的
1.定一个标记,表示第一次
//将数据移动到最右侧
mCombinedChart.moveViewToX(kLinePointses.size() - 1);
stock_CombinedBarChar.moveViewToX(kLinePointses.size() - 1);
2.定义最多显示的条目
//最多显示60组数据
mCombinedChart.setVisibleXRangeMaximum(60);
// 最少显示30组数据
mCombinedChart.setVisibleXRangeMinimum(30);
stock_CombinedBarChar.setVisibleXRangeMaximum(60);
stock_CombinedBarChar.setVisibleXRangeMinimum(30);
//自动伸缩
mCombinedChart.setAutoScaleMinMaxEnabled(true);
stock_CombinedBarChar.setAutoScaleMinMaxEnabled(true);
3.就剩下将数据添加到图表啦。
有问题请提出谢谢