using Android.Content; using Android.Content.Res; using Android.Graphics; using Android.Text; using Android.Util; using Android.Views; using Android.Widget; using System; using System.ComponentModel; using Xamarin.Forms.PlatformConfiguration.TizenSpecific; namespace Xamarin.Forms.Platform.Android { public class LabelRenderer : ViewRenderer { ColorStateList _labelTextColorDefault; float _lineSpacingExtraDefault; float _lineSpacingMultiplierDefault; int _lastConstraintHeight; int _lastConstraintWidth; SizeRequest? _lastSizeRequest; float _lastTextSize = -1f; Typeface _lastTypeface; Color _lastUpdateColor = Color.Default; FormsTextView _view; bool _wasFormatted; readonly MotionEventHelper _motionEventHelper = new MotionEventHelper(); SpannableString _spannableString; public LabelRenderer(Context context) : base(context) { AutoPackage = false; } [Obsolete("This constructor is obsolete as of version 2.5. Please use LabelRenderer(Context) instead.")] 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 void OnLayout(bool changed, int l, int t, int r, int b) { base.OnLayout(changed, l, t, r, b); Control.RecalculateSpanPositions(Element, _spannableString, new SizeRequest(new Size(r - l, b - t))); } protected override TextView CreateNativeControl() { return new FormsTextView(Context); } protected override void OnElementChanged(ElementChangedEventArgs