AndroidMPChart股票图-K线图02

我们接着上篇,来说下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.就剩下将数据添加到图表啦。

有问题请提出谢谢

你可能感兴趣的:(AndroidMPChart股票图-K线图02)