自定义曲线图

公司做个医疗项目,需要画血压和血糖折线图.在****和GitHUB上都没找到合适的,所以集百家之长,整理了一份.

先看效果图

自定义曲线图自定义曲线图

血压核心代码:

/**
 * 画出中间渐变线
 **/
private void drawCenterLine(Canvas paramCanvas) {
    LinearGradient localLinearGradient = new LinearGradient(0.0F, 0.0F, 0.0F, this.height / 2, -1, -11300384, Shader.TileMode.MIRROR);
    this.mCenterVerticalLinePaint.setShader(localLinearGradient);
    paramCanvas.drawLine(this.width / 2, this.height * 2 / 28, this.width / 2, this.height * 25 / 28, this.mCenterVerticalLinePaint);
}
/**
 * 画出服务器数值折线
 **/
private void drawLinesBtwPoints(Canvas canvas) {
    int j = (int) ((double) ((float) width / mItemDistance) + 6.5D) / 2;
    if (mBloodPresure != null && mBloodPresure.length > 0) {
        int i = mBloodPresure.length - 1;
        while (i >= 0) {
            //这个控制初始的圆心起始线,位于渐变重合.
            float f = ((float) (width / 2) - (float) (mBloodPresure.length - 1 - i) * mItemDistance) + mOffsetX;
            float f1 = getBloodPresurePointY(mBloodPresure[i].systolic);
            //血压的高低压的连线
            canvas.drawLine(f, DP_5 + f1, f, getBloodPresurePointY(mBloodPresure[i].diastolic) - DP_5, mPointLinePaint);
            //实心及空心
            if (i == mBloodPresure.length - 1 - Math.round(mOffsetX / mItemDistance)) {
                mPointPaint.setStyle(android.graphics.Paint.Style.FILL_AND_STROKE);
                mSelectedPointPaint.setStyle(android.graphics.Paint.Style.FILL_AND_STROKE);
                if (mIndex != i) {
                    mIndex = i;
                    if (mListener != null) {
                        mListener.onSelected(mIndex, mBloodPressureRecords.get(mIndex));
                    }
                }
            } else {
                mPointPaint.setStyle(android.graphics.Paint.Style.STROKE);
                mSelectedPointPaint.setStyle(android.graphics.Paint.Style.STROKE);
            }
            if (i >= mIndex - j && i <= mIndex + j) {
                //高压球子
                canvas.drawCircle(f, getBloodPresurePointY(mBloodPresure[i].systolic), DP_5, mPointFillPaint);
                if (mBloodPresure[i].systolic >= mSystolicHigh || mBloodPresure[i].systolic <= mSystolicLow) {
                    canvas.drawCircle(f, getBloodPresurePointY(mBloodPresure[i].systolic), DP_5, mSelectedPointPaint);
                    canvas.drawBitmap(getBitmapFromTV(mBloodPresure[i].systolic), f - DP_20_5, getBloodPresurePointY(mBloodPresure[i].systolic) - DP_32, mSelectedPointPaint);
                } else {
                    canvas.drawCircle(f, getBloodPresurePointY(mBloodPresure[i].systolic), DP_5, mPointPaint);
                }
                //低压球子
                canvas.drawCircle(f, getBloodPresurePointY(mBloodPresure[i].diastolic), DP_2, mPointFillPaint);
                if (mBloodPresure[i].diastolic >= mDiastolicHigh || mBloodPresure[i].diastolic <= mDiastolicLow) {
                    canvas.drawCircle(f, getBloodPresurePointY(mBloodPresure[i].diastolic), DP_5, mSelectedPointPaint);
                    canvas.drawBitmap(getBitmapFromBottomTV(mBloodPresure[i].diastolic), f - DP_20_5, getBloodPresurePointY(mBloodPresure[i].diastolic) + DP_6, mSelectedPointPaint);
                } else {
                    canvas.drawCircle(f, getBloodPresurePointY(mBloodPresure[i].diastolic), DP_5, mPointPaint);
                }
            }
            i--;
        }
    }
}

血糖核心代码:

/**
 * 画出中间渐变线
 **/
private void drawCenterLine(Canvas canvas) {
    int i = getWidth();
    int j = getHeight();
    LinearGradient lineargradient = new LinearGradient(0.0F, 0.0F, 0.0F, j / 2, -1, 0xfff0715f, android.graphics.Shader.TileMode.MIRROR);
    mCenterVerticalLinePaint.setShader(lineargradient);
    canvas.drawLine(i / 2, (j * 3) / 28, i / 2, (j * 25) / 28, mCenterVerticalLinePaint);
}

private void drawLinesBtwPoints(Canvas canvas) {
    //不为空往下走
    if (mBloodGlucose != null && mBloodGlucose.length > 0) {
        int j = getWidth();
        int k = (int) (j / this.mItemDistance + 6.5D) / 2;
        int v = this.mBloodGlucose.length - 1;
        Point[] arrayOfPoint = new Point[this.mBloodGlucose.length];
        //这个控制初始的圆心起始线,位于渐变重合
        for (int i = mBloodGlucose.length - 1; i >= 0; i--) {
            arrayOfPoint[i] = new Point((int) (((float) (j / 2) - (float) (mBloodGlucose.length - 1 - i) * mItemDistance) + mOffsetX), (int) getBloodGlucosePointY(mBloodGlucose[i]));
        }
        //当数目大于2条绘制曲线
        if ((arrayOfPoint != null) && (arrayOfPoint.length >= 2)) {
            Point[] kfc;
            for (int w = 0; w < arrayOfPoint.length; w++) {
                kfc = arrayOfPoint;
                canvas.drawPath(smoothPathWithPointsOne(kfc), this.mCurvePaint);
            }
        }
        Object localObject;
        while (v >= 0) {
            localObject = arrayOfPoint[v];
            if (v == mBloodGlucose.length - 1 - Math.round(mOffsetX / mItemDistance)) {
                //实心
                mPointPaint.setStyle(android.graphics.Paint.Style.FILL_AND_STROKE);
                mSelectedPointPaint.setStyle(android.graphics.Paint.Style.FILL_AND_STROKE);
                if (mIndex != v) {
                    mIndex = v;
                    if (mListener != null) {
                        mListener.onSelected(mIndex, mBloodGlucoseRecords.get(mIndex));
                    }
                }
            } else {
                //空心
                mPointPaint.setStyle(android.graphics.Paint.Style.STROKE);
                mSelectedPointPaint.setStyle(android.graphics.Paint.Style.STROKE);
            }
            if (v >= mIndex - k && v <= mIndex + k) {
                canvas.drawCircle(((Point) (localObject)).x, getBloodGlucosePointY(mBloodGlucose[v]), dp2Px(5F), mPointFillPaint);
                if (mBloodGlucose[v] >= mHigh) {
                    canvas.drawCircle(((Point) (localObject)).x, getBloodGlucosePointY(mBloodGlucose[v]), dp2Px(5F), mSelectedPointPaint);
                    canvas.drawBitmap(getBitmapFromTV(mBloodGlucose[v]), ((Point) (localObject)).x - dp2Px(20.5F), getBloodGlucosePointY(mBloodGlucose[v]) - (float) dp2Px(32F), mSelectedPointPaint);
                } else if (mBloodGlucose[v] <= mLow) {
                    canvas.drawCircle(((Point) (localObject)).x, getBloodGlucosePointY(mBloodGlucose[v]), dp2Px(5F), mSelectedPointPaint);
                    canvas.drawBitmap(getBitmapFromBottomTV(mBloodGlucose[v]), ((Point) (localObject)).x - dp2Px(20.5F), getBloodGlucosePointY(mBloodGlucose[v]) + (float) dp2Px(6F), mSelectedPointPaint);
                } else {
                    canvas.drawCircle(((Point) (localObject)).x, getBloodGlucosePointY(mBloodGlucose[v]), dp2Px(5F), mPointPaint);
                }
            }
      
            v--;
        }
    }

}

下载地址:https://download.****.net/download/qq_35874340/10937322