using System; using System.ComponentModel; using Android.Content.Res; using Android.Graphics; using Android.Text; using Android.Util; using Android.Widget; using AColor = Android.Graphics.Color; namespace Xamarin.Forms.Platform.Android { public class LabelRenderer : ViewRenderer { ColorStateList _labelTextColorDefault; int _lastConstraintHeight; int _lastConstraintWidth; SizeRequest? _lastSizeRequest; float _lastTextSize = -1f; Typeface _lastTypeface; Color _lastUpdateColor = Color.Default; FormsTextView _view; bool _wasFormatted; public LabelRenderer() { AutoPackage = false; } public override SizeRequest GetDesiredSize(int widthConstraint, int heightConstraint) { if (_lastSizeRequest.HasValue) { // if we are measuring the same thing, no need to waste the time bool canRecycleLast = widthConstraint == _lastConstraintWidth && heightConstraint == _lastConstraintHeight; if (!canRecycleLast) { // if the last time we measured the returned size was all around smaller than the passed constraint // and the constraint is bigger than the last size request, we can assume the newly measured size request // will not change either. int lastConstraintWidthSize = MeasureSpecFactory.GetSize(_lastConstraintWidth); int lastConstraintHeightSize = MeasureSpecFactory.GetSize(_lastConstraintHeight); int currentConstraintWidthSize = MeasureSpecFactory.GetSize(widthConstraint); int currentConstraintHeightSize = MeasureSpecFactory.GetSize(heightConstraint); bool lastWasSmallerThanConstraints = _lastSizeRequest.Value.Request.Width < lastConstraintWidthSize && _lastSizeRequest.Value.Request.Height < lastConstraintHeightSize; bool currentConstraintsBiggerThanLastRequest = currentConstraintWidthSize >= _lastSizeRequest.Value.Request.Width && currentConstraintHeightSize >= _lastSizeRequest.Value.Request.Height; canRecycleLast = lastWasSmallerThanConstraints && currentConstraintsBiggerThanLastRequest; } if (canRecycleLast) return _lastSizeRequest.Value; } SizeRequest result = base.GetDesiredSize(widthConstraint, heightConstraint); result.Minimum = new Size(Math.Min(Context.ToPixels(10), result.Request.Width), result.Request.Height); _lastConstraintWidth = widthConstraint; _lastConstraintHeight = heightConstraint; _lastSizeRequest = result; return result; } protected override TextView CreateNativeControl() { return new FormsTextView(Context); } protected override void OnElementChanged(ElementChangedEventArgs