美文网首页Android开发
AndroidMPChart股票图-K线图02

AndroidMPChart股票图-K线图02

作者: 小坤凡 | 来源:发表于2018-03-15 16:15 被阅读218次

    我们接着上篇,来说下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

        本文链接:https://www.haomeiwen.com/subject/xkuhqftx.html