protected override void selectXOnChart(int x, int y) { if (chartData == null || isEmpty) { return; } double theta = Math.Atan2(chartArea.centerY() + 16 - y, chartArea.centerX() - x); float a = (float)(MathEx.ToDegrees(theta) - 90); if (a < 0) { a += 360f; } a /= 360; float p = 0; int newSelection = -1; float selectionStartA = 0f; float selectionEndA = 0f; for (int i = 0; i < lines.Count; i++) { if (!lines[i].enabled && lines[i].alpha == 0) { continue; } if (a > p && a < p + darawingValuesPercentage[i]) { newSelection = i; selectionStartA = p; selectionEndA = p + darawingValuesPercentage[i]; break; } p += darawingValuesPercentage[i]; } if (currentSelection != newSelection && newSelection >= 0) { currentSelection = newSelection; invalidate(); //pieLegendView.setVisibility(Visibility.Visible); LineViewData l = lines[newSelection]; //pieLegendView.setData(l.line.name, (int)values[currentSelection], l.lineColor); float r = (float)rectF.Width / 2; int xl = (int)Math.Min( rectF.centerX() + r * Math.Cos(MathEx.ToRadians((selectionEndA * 360f) - 90f)), rectF.centerX() + r * Math.Cos(MathEx.ToRadians(((selectionStartA * 360f) - 90f))) ); if (xl < 0) { xl = 0; } int yl = (int)Math.Min( (rectF.centerY() + r * Math.Sin(MathEx.ToRadians((selectionStartA * 360f) - 90f))), rectF.centerY() + r * Math.Sin(MathEx.ToRadians(((selectionEndA * 360f) - 90f))) ); yl = (int)Math.Min(rectF.centerY(), yl); yl -= 50; // if (yl < 0) yl = 0; //pieLegendView.setTranslationX(xl); //pieLegendView.setTranslationY(yl); //bool v = false; //if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) //{ // v = performHapticFeedback(HapticFeedbackConstants.TEXT_HANDLE_MOVE, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING); //} //if (!v) //{ // performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING); //} } moveLegend(); }
protected void drawChart(CanvasDrawingSession canvas) { if (chartData == null) { return; } float fullWidth = chartWidth / (pickerDelegate.pickerEnd - pickerDelegate.pickerStart); float offset = fullWidth * pickerDelegate.pickerStart - HORIZONTAL_PADDING; float p; float lineWidth; if (chartData.xPercentage.Length < 2) { p = 1f; lineWidth = 1f; } else { p = chartData.xPercentage[1] * fullWidth; lineWidth = chartData.xPercentage[1] * (fullWidth - p); } int additionalPoints = (int)(HORIZONTAL_PADDING / p) + 1; int localStart = Math.Max(0, startXIndex - additionalPoints - 2); int localEnd = Math.Min(chartData.xPercentage.Length - 1, endXIndex + additionalPoints + 2); for (int k = 0; k < lines.Count; k++) { LineViewData line = lines[k]; line.linesPathBottomSize = 0; } float transitionAlpha = 1f; //canvas.save(); if (transitionMode == TRANSITION_MODE_PARENT) { postTransition = true; selectionA = 0f; transitionAlpha = 1f - transitionParams.progress; canvas.Transform = Matrix3x2.CreateScale( new Vector2(1 + 2 * transitionParams.progress, 1f), new Vector2(transitionParams.pX, transitionParams.pY) ); } else if (transitionMode == TRANSITION_MODE_CHILD) { transitionAlpha = transitionParams.progress; canvas.Transform = Matrix3x2.CreateScale( new Vector2(transitionParams.progress, 1f), new Vector2(transitionParams.pX, transitionParams.pY) ); } else if (transitionMode == TRANSITION_MODE_ALPHA_ENTER) { transitionAlpha = transitionParams.progress; } bool selected = selectedIndex >= 0 && legendShowing; for (int i = localStart; i <= localEnd; i++) { float stackOffset = 0; if (selectedIndex == i && selected) { continue; } for (int k = 0; k < lines.Count; k++) { LineViewData line = lines[k]; if (!line.enabled && line.alpha == 0) { continue; } int[] y = line.line.y; float xPoint = p / 2 + chartData.xPercentage[i] * (fullWidth - p) - offset; float yPercentage = y[i] / currentMaxHeight; float height = yPercentage * (MeasuredHeight - chartBottom - SIGNATURE_TEXT_HEIGHT) * line.alpha; float yPoint = MeasuredHeight - chartBottom - height; line.linesPath[line.linesPathBottomSize++] = xPoint; line.linesPath[line.linesPathBottomSize++] = yPoint - stackOffset; line.linesPath[line.linesPathBottomSize++] = xPoint; line.linesPath[line.linesPathBottomSize++] = MeasuredHeight - chartBottom - stackOffset; stackOffset += height; } } for (int k = 0; k < lines.Count; k++) { StackBarViewData line = lines[k]; Paint paint = selected || postTransition ? line.unselectedPaint : line.paint; if (selected) { line.unselectedPaint.Color = Extensions.blendARGB(line.lineColor, line.blendColor, selectionA); } if (postTransition) { line.unselectedPaint.Color = Extensions.blendARGB(line.lineColor, line.blendColor, 1f); } paint.A = (byte)(255 * transitionAlpha); paint.StrokeWidth = lineWidth; paint.StrokeCap = Microsoft.Graphics.Canvas.Geometry.CanvasCapStyle.Flat; canvas.DrawLines(line.linesPath, 0, line.linesPathBottomSize, paint); } if (selected) { float stackOffset = 0; for (int k = 0; k < lines.Count; k++) { LineViewData line = lines[k]; if (!line.enabled && line.alpha == 0) { continue; } int[] y = line.line.y; float xPoint = p / 2 + chartData.xPercentage[selectedIndex] * (fullWidth - p) - offset; float yPercentage = y[selectedIndex] / currentMaxHeight; float height = yPercentage * (MeasuredHeight - chartBottom - SIGNATURE_TEXT_HEIGHT) * line.alpha; float yPoint = MeasuredHeight - chartBottom - height; line.paint.StrokeWidth = lineWidth; line.paint.A = (byte)(255 * transitionAlpha); canvas.DrawLine(xPoint, yPoint - stackOffset, xPoint, MeasuredHeight - chartBottom - stackOffset, line.paint); stackOffset += height; } } //canvas.restore(); }
protected override void drawPickerChart(CanvasDrawingSession canvas) { if (chartData != null) { int n = chartData.xPercentage.Length; int nl = lines.Count; for (int k = 0; k < lines.Count; k++) { LineViewData line = lines[k]; line.linesPathBottomSize = 0; } float p = (1f / chartData.xPercentage.Length) * pickerWidth; for (int i = 0; i < n; i++) { float stackOffset = 0; float xPoint = p / 2 + chartData.xPercentage[i] * (pickerWidth - p); float sum = 0; int drawingLinesCount = 0; bool allDisabled = true; for (int k = 0; k < nl; k++) { LineViewData line = lines[k]; if (!line.enabled && line.alpha == 0) { continue; } float v = line.line.y[i] * line.alpha; sum += v; if (v > 0) { drawingLinesCount++; if (line.enabled) { allDisabled = false; } } } for (int k = 0; k < nl; k++) { LineViewData line = lines[k]; if (!line.enabled && line.alpha == 0) { continue; } int[] y = line.line.y; float yPercentage; if (drawingLinesCount == 1) { if (y[i] == 0) { yPercentage = 0; } else { yPercentage = line.alpha; } } else { if (sum == 0) { yPercentage = 0; } else if (allDisabled) { yPercentage = (y[i] / sum) * line.alpha * line.alpha; } else { yPercentage = (y[i] / sum) * line.alpha; } } float yPoint = (yPercentage) * (pikerHeight); line.linesPath[line.linesPathBottomSize++] = xPoint; line.linesPath[line.linesPathBottomSize++] = pikerHeight - yPoint - stackOffset; line.linesPath[line.linesPathBottomSize++] = xPoint; line.linesPath[line.linesPathBottomSize++] = pikerHeight - stackOffset; stackOffset += yPoint; } } for (int k = 0; k < nl; k++) { LineViewData line = lines[k]; line.paint.StrokeWidth = p; line.paint.A = 255; //line.paint.setAntiAlias(false); canvas.DrawLines(line.linesPath, 0, line.linesPathBottomSize, line.paint); } } }
protected override void DrawPickerChart(CanvasDrawingSession canvas) { if (chartData != null) { int n = chartData.xPercentage.Length; int nl = lines.Count; for (int k = 0; k < lines.Count; k++) { LineViewData line = lines[k]; line.linesPathBottomSize = 0; } int step = (int)Math.Max(1, Math.Round(n / 200f)); if (yMaxPoints == null || yMaxPoints.Length < nl) { yMaxPoints = new int[nl]; } for (int i = 0; i < n; i++) { float stackOffset = 0; float xPoint = chartData.xPercentage[i] * pickerWidth; for (int k = 0; k < nl; k++) { LineViewData line = lines[k]; if (!line.enabled && line.alpha == 0) { continue; } int y = line.line.y[i]; if (y > yMaxPoints[k]) { yMaxPoints[k] = y; } } if (i % step == 0) { for (int k = 0; k < nl; k++) { LineViewData line = lines[k]; if (!line.enabled && line.alpha == 0) { continue; } float h = ANIMATE_PICKER_SIZES ? pickerMaxHeight : chartData.maxValue; float yPercentage = yMaxPoints[k] / h * line.alpha; float yPoint = yPercentage * pickerHeight; line.linesPath[line.linesPathBottomSize++] = xPoint; line.linesPath[line.linesPathBottomSize++] = pickerHeight - yPoint - stackOffset; line.linesPath[line.linesPathBottomSize++] = xPoint; line.linesPath[line.linesPathBottomSize++] = pickerHeight - stackOffset; stackOffset += yPoint; yMaxPoints[k] = 0; } } } float p; if (chartData.xPercentage.Length < 2) { p = 1f; } else { p = chartData.xPercentage[1] * pickerWidth; } for (int k = 0; k < nl; k++) { LineViewData line = lines[k]; line.paint.StrokeWidth = p * step; line.paint.A = 255; canvas.DrawLines(line.linesPath, 0, line.linesPathBottomSize, line.paint); } } }