美文网首页Android Tech
Android开发之基于MPAndroidChart实现股票K线

Android开发之基于MPAndroidChart实现股票K线

作者: 天才木木 | 来源:发表于2016-04-18 00:57 被阅读6140次

    接上文Android开发之基于MPAndroidChart实现股票K线图(一),在项目中引入了这个框架以后,下面就开始进行具体的代码编写。

    1 流程

    1.1 原理

    MPAndroidChart所提供的各种图表其实就是一种自定义控件,例如LineChart(折线图)、BarChart(直方图)以及准备要使用的CandleStickChart(蜡烛图)。

    1.2 控件初始化

    我们在布局xml文件中或在Activity代码里,去创建这些图表控件实例,然后在代码中进行一些基本交互设置。

    <com.github.mikephil.charting.charts.CandleStickChart
            android:id="@+id/candler_chart"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    

    CandleStickChart为例:

    1.2.1 基本设置

    mChart.setStartAtZero(true); 
    mChart.setDrawYValues(false); // disable the drawing of values into the mChart  
    mChart.setDrawBorder(false);   //是否在折线图上添加边框 
    mChart.setDescription("");// 数据描述  
    mChart.setNoDataTextDescription("You need to provide data for the mChart.");  //如果没有数据的时候,会显示这个,类似listview的emtpyview  
    mChart.setDrawVerticalGrid(false); // enable / disable grid lines  
    mChart.setDrawHorizontalGrid(false);  
    mChart.setDrawGridBackground(false); // 是否显示表格颜色  
    mChart.setBackgroundColor(color);// 设置背景 
    mChart.setGridBackgroundColor(color);//设置表格背景色
    mChart.setGridColor(Color.WHITE & 0x70FFFFFF); // 表格线的颜色,在这里是是给颜色设置一个透明度  
    mChart.setGridWidth(1.25f);// 表格线的线宽  
    mChart.setTouchEnabled(true); // enable touch gestures 
    mChart.setDragEnabled(true);// 是否可以拖拽  
    mChart.setScaleEnabled(true);// 是否可以缩放  
    mChart.setPinchZoom(false);// if disabled, scaling can be done on x- and y-axis separately  
    mChart.setScaleYEnabled(false);// if disabled, scaling can be done on x-axis
    mChart.setScaleXEnabled(false);// if disabled, scaling can be done on  y-axis 
    mChart.setValueTypeface(mTf);// 设置字体
    
    // animate calls invalidate()...  
    mChart.animateX(2500); // 立即执行的动画,x轴
    

    1.2.2 XY轴设置

    1. X轴
    XAxis xAxis =mChart.getXAxis();
    xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
    xAxis.setDrawGridLines(true);
    xAxis.setSpaceBetweenLabels(12);//轴刻度间的宽度,默认值是4
    xAxis.setGridColor(colorLine);//X轴刻度线颜色
    xAxis.setTextColor(colorText);//X轴文字颜色
    
    1. Y轴(可以设置左右两个Y轴)
    YAxis leftAxis = mChart.getAxisLeft();
    leftAxis.setEnabled(true);
    leftAxis.setLabelCount(7,false);
    leftAxis.setDrawGridLines(true);
    leftAxis.setDrawAxisLine(false);
    leftAxis.setGridColor(colorLine);
    leftAxis.setTextColor(colorText);
    
    YAxis rightAxis =mChart.getAxisRight();
    rightAxis.setEnabled(false);
    
    Y轴示意图.png

    1.2.3 图例标识设置

     // get the legend (only possible after setting data)  
    Legend l = mChart.getLegend();  // 设置比例图标示
    l.setPosition(LegendPosition.BELOW_CHART_RIGHT);  //显示位置
    l.setForm(LegendForm.SQUARE);// 样式  
    l.setFormSize(6f);// 字号
    l.setTextColor(Color.WHITE);// 颜色  
    l.setTypeface(mTf);// 字体  
    
    List<String> labels=new ArrayList<>();
    labels.add("红涨");
    labels.add("绿跌");
    List<Integer> colors=new ArrayList<>();
    colors.add(Color.RED);
    colors.add(Color.GREEN);
    l.setExtra(colors,labels);//设置标注的颜色及内容,设置的效果如下图
    
    l.setEnabled(false);//决定显不显示标签
    
    Legend示意图

    1.3 传入数据,生成图表

    1. CandleEntry是每一天股票价格的数据模型
    public class CandleEntry extends Entry {
        private float mShadowHigh = 0.0F;//当天最高价(蜡烛图上影线)
        private float mShadowLow = 0.0F;//当天最低价(蜡烛图下影线)
        private float mClose = 0.0F;//收盘价
        private float mOpen = 0.0F;//开盘价
    ···
    }
    
    //模拟获得数据
    List<CandleEntry> yVals1= Model.getCandleEntries();
    
    1. CandleDataSet 类可以对图表的元素样式进行设置(例如 涨跌颜色、影线颜色等)
           CandleDataSet set = new CandleDataSet(yVals1, "Data Set");
            set.setAxisDependency(YAxis.AxisDependency.LEFT);
            set.setShadowColor(Color.DKGRAY);//影线颜色
            set.setShadowColorSameAsCandle(true);//影线颜色与实体一致
            set.setShadowWidth(0.7f);//影线
            set.setDecreasingColor(Color.RED);
            set.setDecreasingPaintStyle(Paint.Style.FILL);//红涨,实体
            set.setIncreasingColor(Color.GREEN);
            set.setIncreasingPaintStyle(Paint.Style.STROKE);//绿跌,空心
            set.setNeutralColor(Color.RED);//当天价格不涨不跌(一字线)颜色
            set.setHighlightLineWidth(1f);//选中蜡烛时的线宽
            set.setDrawValues(false);//在图表中的元素上面是否显示数值
            set.setLabel(“label");//图表名称,可以通过mChart.getLegend().setEnable(true)显示在标注上
    
    1. 简单粗暴地通过set方法设置数据
    CandleData data = new CandleData(xVals, set);
    mChart.setData( data);
    

    1.4 效果展示

    像手势缩放、XY轴方向平移这些基本交互,框架已经帮我们实现。
    当然这只是一个简单的demo,距离实际需求还有很大的差距,坑也是有的,例如:

    只能通过一个方法set.setShadowColor(Color.DKGRAY);设置上影线/下影线颜色,如图 上影线/下影线都是黑色的,而不是随着当天的涨跌情况红杖绿跌,十分不和谐!
    (此坑已填:set.setShadowColorSameAsCandle(true);

    简单K线图.png

    1.5 其他

    1.5.1 动画

    animateX(int durationMillis) : x轴方向
    animateY(int durationMillis) : y轴方向
    animateXY(int xDuration, int yDuration) : xy轴方向
    

    1.5.2 获取图表相关的数据

    mChart.getCandleData();
    mChart.getYChartMax();
    mChart.getYChartMin();
    mChart.getXChartMax();
    mChart.getXChartMin();
    

    相关文章

      网友评论

      • 曰_辰:怎样给蜡烛图加文字
      • 风吹白云飘:最左边和最右边k线显示一半,你怎么看?
      • DreamArea:你用的是MP哪个版本?
      • ea0377d6cc52:请问一下,设置最后一个点高亮怎么设置?
        没找到这个方法,直接设置某一个点的高亮
      • eirunye:好厉害啊,哈哈谢谢 :smile:
      • Eleven_Y:受教:+1:
        Eleven_Y:@天才木木 分时图,怎么实现曲线以下部分
        都为阴影
        Eleven_Y:@天才木木 木木,加个联系方式呗,我遇到坑了,请教下:pensive:
        天才木木:@Eleven_Y 谢谢谢谢,只是简单的使用介绍,很多细节的坑需要工作中慢慢填:smile:
      • d720166a1f0f:大神你好,请教个问题 用mpandroidchart画k线图或者其他类型的图的时候,如果只有两个数据的时候他显示在屏幕最左边一个和最右边一个,如何设置比如事先规定分200等分 有三个点的时候画的图只占整个chart的3/200,这个如何实现
        天才木木:@d720166a1f0f 目前的解决办法就是预先写好X轴的数组,你也说了每分钟划一格,那就是股市开盘四小时,设置一个size为60*4=240的X轴数组即可。
        关于具体的时间显示,可以实现XAxisValueFormatter接口的getXValue方法,来定义X轴上的标签文本。最后通过lineChart.getXAxis().setValueFormatter()方法把自定义的ValueFormatter设置进去即可。
        d720166a1f0f:@天才木木 如果我的xVals是从服务端获取的值纳(比如时间),就比如说类似股票的k线图 x轴显示时间,从9:30到15:00 以每分钟划分一格,我想对这个均分怎么去实现?难道要事先对所有时间写个数组放进去再取出来吗?有没有好的解决办法纳,求教
        天才木木:@d720166a1f0f 给ChartData对象设置一个size为200的横坐标集合即可。
        ArrayList xVals = new ArrayList<>();
        for (int i = 0; i < 200; i++) {
        xVals.add(i + "");
        }
        LineData lineData =new LineData(xVals);
        lineChart.setData(lineData );
      • 7d03d33a7306:能留下你的QQ号码?我最近也在做这个,想交流一下
        天才木木:@你的呀 认真看看demo就行了
      • tom510230:写得好
        天才木木:@tom510230 :wink:谢谢大哥

      本文标题:Android开发之基于MPAndroidChart实现股票K线

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