Я хочу использовать функцию автоматического изменения размера android текстовых представлений в моем решении форм xamarin, чтобы по мере увеличения длины текста размеры шрифта сокращались, чтобы никогда не выходить за границы метки и не усекаться. Для этого я создал настраиваемый элемент управления Label и добавил настраиваемое средство визуализации android. Не работает в Android 7 и ниже. Он работает в Android 8 и выше.
Согласно docs поддержка автоматического изменения размера была введена в android 8, но может поддерживаться обратно до Android 4 с помощью AppCompat. v4. Однако моя настраиваемая визуализированная метка просто отображает размер шрифта по умолчанию в Android pre 8. Он отлично работает на 8+ устройствах, размер текста метки изменяется по мере необходимости, чтобы не выходить за границы. В принятом ответе на этот вопрос с аналогичной проблемой на нативном android говорится, что это может быть связано с отсутствием установки ширины и высоты, я пробовал явно установить widthrequest и heightrequest, и это не меняется что-нибудь. Также установка maxlines = 1 ничего не меняет. Альтернативный тред предполагает, что виноваты нестандартные шрифты. Я создал решение ванильных форм, используя шрифт устройства по умолчанию, и получил тот же эффект.
Мой код:
internal class AutosizeLabelRenderer : LabelRenderer
{
#region constructor
public AutosizeLabelRenderer(Context context) : base(context)
{
}
#endregion
#region overridable
protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
{
base.OnElementChanged(e);
if (e.NewElement == null || !(e.NewElement is AutoSizeLabel autoLabel) || Control == null) { return; }
TextViewCompat.SetAutoSizeTextTypeUniformWithConfiguration(Control, autoLabel.AutoSizeMinTextSize,
autoLabel.AutoSizeMaxTextSize, autoLabel.AutoSizeStepGranularity, (int)ComplexUnitType.Sp);
}
#endregion
}
public class AutoSizeLabel : Label
{
public int AutoSizeMaxTextSize
{
get => (int)GetValue(AutoSizeMaxTextSizeProperty);
set => SetValue(AutoSizeMaxTextSizeProperty, value);
}
public static readonly BindableProperty AutoSizeMaxTextSizeProperty = BindableProperty.Create(
nameof(AutoSizeMaxTextSize), // the name of the bindable property
typeof(int), // the bindable property type
typeof(AutoSizeLabel)); // the default value for the property
public int AutoSizeMinTextSize
{
get => (int)GetValue(AutoSizeMinTextSizeProperty);
set => SetValue(AutoSizeMinTextSizeProperty, value);
}
public static readonly BindableProperty AutoSizeMinTextSizeProperty = BindableProperty.Create(
nameof(AutoSizeMinTextSize), // the name of the bindable property
typeof(int), // the bindable property type
typeof(AutoSizeLabel)); // the default value for the property
public int AutoSizeStepGranularity
{
get => (int)GetValue(AutoSizeStepGranularityProperty);
set => SetValue(AutoSizeStepGranularityProperty, value);
}
public static readonly BindableProperty AutoSizeStepGranularityProperty = BindableProperty.Create(
nameof(AutoSizeStepGranularity), // the name of the bindable property
typeof(int), // the bindable property type
typeof(AutoSizeLabel)); // the default value for the property
//
}
Не работает: Android 7 - текст не усадка
Working as expected: Android 8 and above
Xaml for above images: