Пример #1
0
        public override void paint(PaintingContext context, Offset offset)
        {
            Canvas canvas               = context.canvas;
            float  currentValue         = _state.position.value;
            float  currentReactionValue = _state._reaction.value;

            float visualPosition = 0.0f;

            switch (textDirection)
            {
            case TextDirection.rtl:
                visualPosition = 1.0f - currentValue;
                break;

            case TextDirection.ltr:
                visualPosition = currentValue;
                break;
            }

            Paint paint = new Paint()
            {
                color = Color.lerp(trackColor, activeColor, currentValue)
            };
            Rect trackRect = Rect.fromLTWH(
                offset.dx + (size.width - CupertinoSwitchUtils._kTrackWidth) / 2.0f,
                offset.dy + (size.height - CupertinoSwitchUtils._kTrackHeight) / 2.0f,
                CupertinoSwitchUtils._kTrackWidth,
                CupertinoSwitchUtils._kTrackHeight
                );
            RRect trackRRect = RRect.fromRectAndRadius(trackRect, Radius.circular(CupertinoSwitchUtils._kTrackRadius));

            canvas.drawRRect(trackRRect, paint);

            float currentThumbExtension = CupertinoThumbPainter.extension * currentReactionValue;
            float thumbLeft             = MathUtils.lerpNullableFloat(
                trackRect.left + CupertinoSwitchUtils._kTrackInnerStart - CupertinoThumbPainter.radius,
                trackRect.left + CupertinoSwitchUtils._kTrackInnerEnd - CupertinoThumbPainter.radius -
                currentThumbExtension,
                visualPosition
                );
            float thumbRight = MathUtils.lerpNullableFloat(
                trackRect.left + CupertinoSwitchUtils._kTrackInnerStart + CupertinoThumbPainter.radius +
                currentThumbExtension,
                trackRect.left + CupertinoSwitchUtils._kTrackInnerEnd + CupertinoThumbPainter.radius,
                visualPosition
                );
            float thumbCenterY = offset.dy + size.height / 2.0f;
            Rect  thumbBounds  = Rect.fromLTRB(
                thumbLeft,
                thumbCenterY - CupertinoThumbPainter.radius,
                thumbRight,
                thumbCenterY + CupertinoThumbPainter.radius
                );

            context.pushClipRRect(needsCompositing, Offset.zero, thumbBounds, trackRRect,
                                  (PaintingContext innerContext, Offset offset1) => {
                CupertinoThumbPainter.switchThumb().paint(innerContext.canvas, thumbBounds);
            });
        }