private void renderDotAndLabel( Canvas canvas, RadarData lineData, // float previousX,float previousY, float currentX, float currentY, int listID) { PlotLine plotLine = lineData.getPlotLine(); if (!plotLine.getDotStyle().equals(XEnum.DotStyle.HIDE)) { PlotDot pDot = plotLine.getPlotDot(); PlotDotRender.getInstance() .renderDot( canvas, pDot, currentX - pDot.getDotRadius(), currentY - pDot.getDotRadius(), currentX, currentY, lineData.getPlotLine().getDotPaint()); // 标识图形 } // 是否显示标签 if (lineData.getLabelVisible()) { canvas.drawText( getFormatterDotLabel(lineData.getLinePoint().get(listID)), currentX, currentY, lineData.getPlotLine().getDotLabelPaint()); } }
/** * 绘制图网络线 * * @param canvas 画布 * @param lineData 数据集类 * @param arrayDataX x坐标 * @param arrayDataY y坐标 */ private void drawDataPath( Canvas canvas, RadarData lineData, Float[] arrayDataX, Float[] arrayDataY) { float startX = 0.0f, startY = 0.0f; float initX = 0.0f, initY = 0.0f; Path pathArea = new Path(); for (int p = 0; p < arrayDataX.length; p++) { if (0 == p) { initX = startX = arrayDataX[p]; initY = startY = arrayDataY[p]; pathArea.moveTo(initX, initY); } else { pathArea.lineTo(arrayDataX[p], arrayDataY[p]); startX = arrayDataX[p]; startY = arrayDataY[p]; } // 绘制点及对应的标签 renderDotAndLabel(canvas, lineData, arrayDataX[p], arrayDataY[p], p); } // 收尾 pathArea.lineTo(initX, initY); pathArea.close(); lineData.getPlotLine().getLinePaint().setAlpha(mAreaAlpha); // lineData.getPlotLine().getLinePaint().setStyle(Style.STROKE); canvas.drawPath(pathArea, lineData.getPlotLine().getLinePaint()); }
/** 绘制key */ protected void renderKey(Canvas canvas) { if (!getKeyVisible()) return; DrawHelper dw = new DrawHelper(); float textHeight = dw.getPaintFontHeight(getKeyPaint()); float rectWidth = 2 * textHeight; float currentX = 0.0f; float currentY = 0.0f; if (!isVerticalScreen()) // 横屏 { getKeyPaint().setTextAlign(Align.RIGHT); currentX = plotArea.getRight(); currentY = this.plotArea.getTop() + textHeight; } else { getKeyPaint().setTextAlign(Align.LEFT); currentX = plotArea.getLeft(); currentY = this.plotArea.getBottom(); } int totalTextWidth = 0; for (RadarData cData : mDataSet) { getKeyPaint().setColor(cData.getLineColor()); if (!isVerticalScreen()) // 横屏 { canvas.drawRect( currentX, currentY, currentX - rectWidth, currentY - textHeight, getKeyPaint()); canvas.drawText(cData.getLineKey(), currentX - rectWidth, currentY, getKeyPaint()); currentY = MathHelper.getInstance().add(currentY, textHeight); } else { // 竖屏 int keyTextWidth = dw.getTextWidth(getKeyPaint(), cData.getLineKey()); totalTextWidth += keyTextWidth; if (totalTextWidth > plotArea.getWidth()) { currentY += textHeight; currentX = plotArea.getLeft(); totalTextWidth = 0; } canvas.drawRect( currentX, currentY, currentX + rectWidth, currentY - textHeight, getKeyPaint()); canvas.drawText(cData.getLineKey(), currentX + rectWidth, currentY, getKeyPaint()); currentX = MathHelper.getInstance().add(currentX, rectWidth + keyTextWidth + 5); } } }
/** * 绘制数据区网络 * * @param canvas 画布 */ private void renderDataArea(Canvas canvas) { float cirX = plotArea.getCenterX(); float cirY = plotArea.getCenterY(); for (RadarData lineData : mDataSet) { // 画各自的网 List<Double> dataset = lineData.getLinePoint(); int dataSize = dataset.size(); if (dataSize < 3) { Log.e(TAG, "这几个数据可不够,最少三个起步."); continue; } Float[] arrayDataX = new Float[dataSize]; Float[] arrayDataY = new Float[dataSize]; int i = 0; for (Double data : dataset) { Double per = (data - dataAxis.getAxisMin()) / dataAxis.getAxisRange(); float curRadius = (float) (getRadius() * per); // 计算位置 MathHelper.getInstance().calcArcEndPointXY(cirX, cirY, curRadius, mArrayLabelAgent[i]); // 依Path还是Line来决定画线风格 arrayDataX[i] = MathHelper.getInstance().getPosX(); arrayDataY[i] = MathHelper.getInstance().getPosY(); i++; // 标签 } // 画线或填充 switch (lineData.getAreaStyle()) { case FILL: drawDataPath(canvas, lineData, arrayDataX, arrayDataY); break; case STROKE: renderDataLine(canvas, lineData, arrayDataX, arrayDataY); break; default: Log.e(TAG, "这类型不认识."); } } }
/** * 绘制数据连接线 * * @param canvas 画布 * @param lineData 数据集类 * @param arrayDataX x坐标 * @param arrayDataY y坐标 */ private void renderDataLine( Canvas canvas, RadarData lineData, Float[] arrayDataX, Float[] arrayDataY) { float startX = 0.0f, startY = 0.0f; float initX = 0.0f, initY = 0.0f; for (int p = 0; p < arrayDataX.length; p++) { if (0 == p) { initX = startX = arrayDataX[p]; initY = startY = arrayDataY[p]; } else { DrawHelper.getInstance() .drawLine( lineData.getLineStyle(), startX, startY, arrayDataX[p], arrayDataY[p], canvas, lineData.getPlotLine().getLinePaint()); startX = arrayDataX[p]; startY = arrayDataY[p]; } // 绘制点及对应的标签 renderDotAndLabel(canvas, lineData, arrayDataX[p], arrayDataY[p], p); } // 收尾 DrawHelper.getInstance() .drawLine( lineData.getLineStyle(), startX, startY, initX, initY, canvas, lineData.getPlotLine().getLinePaint()); }