package com.ll.chart.drawing.timeLine; import android.graphics.Canvas; import android.graphics.LinearGradient; import android.graphics.Paint; import android.graphics.Path; import android.graphics.Shader; import com.ll.chart.compat.attribute.CandleAttribute; import com.ll.chart.drawing.AbsDrawing; import com.ll.chart.entry.CandleEntry; import com.ll.chart.render.CandleRender; import com.ll.chart.module.base.AbsChartModule; /** * <p>TimeLineDrawing</p> */ public class TimeLineDrawing extends AbsDrawing<CandleRender> { private static final String TAG = "TimeLineDrawing"; private CandleAttribute attribute;//配置文件 // 边框线画笔 private Paint borderPaint = new Paint(Paint.ANTI_ALIAS_FLAG); // 分时折线画笔(绘制path 尽量不开抗锯齿) private Paint timelinePaint = new Paint(); // 分时阴影画笔(绘制path 尽量不开抗锯齿) private Paint timeShaderPaint = new Paint(); // 分时折线绘制路径 private Path timelinePath = new Path(); // 分时阴影绘制路径 private Path timeShaderPath = new Path(); // 折线路径位置信息 private final float[] pathPts = new float[4]; //间隔 private float space = 0; // 计算 1 个矩形坐标用的 private float[] candleRectBuffer = new float[4]; @Override public void onInit(CandleRender render, AbsChartModule chartModule) { super.onInit(render, chartModule); attribute = render.getAttribute(); borderPaint.setStyle(Paint.Style.STROKE); borderPaint.setStrokeWidth(attribute.borderWidth); borderPaint.setColor(attribute.borderColor); timelinePaint.setStrokeWidth(attribute.timeLineWidth); timelinePaint.setColor(attribute.timeLineColor); timelinePaint.setStyle(Paint.Style.STROKE); timeShaderPaint.setShader( new LinearGradient(0, viewRect.top, 0, viewRect.bottom, new int[] { attribute.timeLineShaderColorBegin, attribute.timeLineShaderColorEnd }, null, Shader.TileMode.REPEAT)); space = (attribute.candleSpace / attribute.candleWidth) / 2; } @Override public void computePoint(int begin, int end, int current) { CandleEntry entry = render.getAdapter().getItem(current); pathPts[0] = current; pathPts[1] = entry.getClose().value; pathPts[2] = current + 0.5f; render.mapPoints(pathPts); if (current == begin) {//开始点 timelinePath.moveTo(pathPts[0], pathPts[1]); timeShaderPath.moveTo(pathPts[0], viewRect.bottom); timeShaderPath.lineTo(pathPts[0], pathPts[1]); } else if (current == end - 1) {//结束点 float endX = pathPts[2] + (pathPts[2] - pathPts[0]); timelinePath.lineTo(endX, pathPts[1]); timeShaderPath.lineTo(endX, pathPts[1]); timeShaderPath.lineTo(endX, viewRect.bottom); } else { timelinePath.lineTo(pathPts[2], pathPts[1]); timeShaderPath.lineTo(pathPts[2], pathPts[1]); } candleRectBuffer[0] = current + space; candleRectBuffer[2] = current + 1 - space; render.mapPoints(candleRectBuffer); // 计算高亮坐标 if (render.isHighlight()) { final float[] highlightPoint = render.getHighlightPoint(); if (candleRectBuffer[0] <= highlightPoint[0] && highlightPoint[0] <= candleRectBuffer[2]) { highlightPoint[0] = pathPts[2]; render.getAdapter().setHighlightIndex(current); } } } @Override public void onComputeOver(Canvas canvas, int begin, int end, float[] extremum) { canvas.save(); canvas.clipRect(viewRect); canvas.drawPath(timelinePath, timelinePaint); canvas.drawPath(timeShaderPath, timeShaderPaint); timelinePath.reset(); timeShaderPath.reset(); canvas.restore(); } @Override public void onDrawOver(Canvas canvas) { } @Override public void onViewChange() { } }