MpChart 使用之改造LineChart实现y轴值为0断开连线

项目中有个需求,使用的是折线图,但是要求当y轴的值为0的时候 不与前后的点进行连接,但是MpChart 默认是完全连接的。


image.png

我需要的效果是这样的


device-2019-06-09-175642.png

下面说实现方式:

 LineDataSet支持设置渲染模式  默认是以下几种(其中第一个是笔者自己添加的,为了实现图2的效果)
public enum Mode {
    /**
     * 这个zero是我根据需求自己添加的
     */
    LINEAR_DISCONNECT_ZERO,
    LINEAR,
    STEPPED,
    CUBIC_BEZIER,
    HORIZONTAL_BEZIER
}

图表的绘制在LineChartRenderer类中,

 switch (dataSet.getMode()) {
        default:

        case LINEAR:
        case STEPPED:
            drawLinear(c, dataSet);
            break;
        case LINEAR_DISCONNECT_ZERO:
            drawLinearDisConnectZero(c,dataSet);
            break;
        case CUBIC_BEZIER:
            drawCubicBezier(dataSet);
            break;

        case HORIZONTAL_BEZIER:
            drawHorizontalBezier(dataSet);
            break;


    }

自己创建的绘制方法 其实重点就是 y值为0的话跳出 绘制 ( //实现这个效果重点就是这行代码
if (e1.getY()==0||e2.getY()==0) continue;)

     private void drawLinearDisConnectZero(Canvas c, @NonNull ILineDataSet dataSet) {

    int entryCount = dataSet.getEntryCount();

    final int pointsPerEntryPair = 2;

    Transformer trans = mChart.getTransformer(dataSet.getAxisDependency());

    float phaseY = mAnimator.getPhaseY();

    mRenderPaint.setStyle(Paint.Style.STROKE);

    Canvas canvas = c;

    mXBounds.set(mChart, dataSet);

          // if drawing filled is enabled
      //        if (dataSet.isDrawFilledEnabled() && entryCount > 0) {
    //            drawLinearFill(c, dataSet, trans, mXBounds);
        //        }

    // more than 1 color
    if (dataSet.getColors().size() > 1) {

        if (mLineBuffer.length <= pointsPerEntryPair * 2)
            mLineBuffer = new float[pointsPerEntryPair * 4];

        for (int j = mXBounds.min; j <= mXBounds.range + mXBounds.min; j++) {

            Entry e = dataSet.getEntryForIndex(j);
            if (e == null) continue;

            mLineBuffer[0] = e.getX();
            mLineBuffer[1] = e.getY() * phaseY;

            if (j < mXBounds.max) {

                e = dataSet.getEntryForIndex(j + 1);

                if (e == null) break;


                    mLineBuffer[2] = e.getX();
                    mLineBuffer[3] = e.getY() * phaseY;


            } else {
                mLineBuffer[2] = mLineBuffer[0];
                mLineBuffer[3] = mLineBuffer[1];
            }

            trans.pointValuesToPixel(mLineBuffer);

            if (!mViewPortHandler.isInBoundsRight(mLineBuffer[0]))
                break;

            // make sure the lines don't do shitty things outside
            // bounds
            if (!mViewPortHandler.isInBoundsLeft(mLineBuffer[2])
                    || (!mViewPortHandler.isInBoundsTop(mLineBuffer[1]) && !mViewPortHandler
                    .isInBoundsBottom(mLineBuffer[3])))
                continue;

            // get the color that is set for this line-segment
            mRenderPaint.setColor(dataSet.getColor(j));

            canvas.drawLines(mLineBuffer, 0, pointsPerEntryPair * 2, mRenderPaint);
        }

    } else { // only one color per dataset

        if (mLineBuffer.length < Math.max((entryCount) * pointsPerEntryPair, pointsPerEntryPair) * 2)
            mLineBuffer = new float[Math.max((entryCount) * pointsPerEntryPair, pointsPerEntryPair) * 4];

        Entry e1, e2;

        e1 = dataSet.getEntryForIndex(mXBounds.min);

        if (e1 != null) {


            int j = 0;
            for (int x = mXBounds.min; x <= mXBounds.range + mXBounds.min; x++) {

                e1 = dataSet.getEntryForIndex(x == 0 ? 0 : (x - 1));
                e2 = dataSet.getEntryForIndex(x);

            //实现这个效果重点就是这行代码
                if (e1.getY()==0||e2.getY()==0) continue;
                if (e1 == null || e2 == null) continue;

                mLineBuffer[j++] = e1.getX();
                mLineBuffer[j++] = e1.getY() * phaseY;



                mLineBuffer[j++] = e2.getX();
                mLineBuffer[j++] = e2.getY() * phaseY;
            }

            if (j > 0) {
                trans.pointValuesToPixel(mLineBuffer);

                final int size = Math.max((mXBounds.range + 1) * pointsPerEntryPair, pointsPerEntryPair) * 2;

                mRenderPaint.setColor(dataSet.getColor());

                    canvas.drawLines(mLineBuffer, 0, size, mRenderPaint);

            }
        }
    }

    mRenderPaint.setPathEffect(null);


}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,165评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,503评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,295评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,589评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,439评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,342评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,749评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,397评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,700评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,740评论 2 313
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,523评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,364评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,755评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,024评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,297评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,721评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,918评论 2 336

推荐阅读更多精彩内容

  • 手势图片控件 PinchImageView 点击图片框架 photoView packagecom.example...
    Ztufu阅读 713评论 0 1
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,347评论 1 45
  • 这是一篇解释器的入门教程。虽然我试图从最基本的原理讲起,尽量让这篇文章不依赖于其它知识,但是这篇教程并不是针对编程...
    婵_27e0阅读 2,176评论 0 3
  • 效果图: Github链接:https://github.com/boycy815/PinchImageView ...
    CQ_TYL阅读 2,190评论 0 0
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 13,685评论 0 38