Exemplo n.º 1
0
        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();
        }
Exemplo n.º 2
0
        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();
        }
Exemplo n.º 3
0
        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);
                }
            }
        }
Exemplo n.º 4
0
        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);
                }
            }
        }