Jump to content
Yaroslav Brovin
Message added by Yaroslav Brovin,

Please be aware that these comments were copied here from another source and that the date and time shown for each comment may not be accurate.

  • Status: Open
  • Priority: Normal
  • Resolution: Unresolved
  • Platform: Android
  • Affects version: 1.16.3.0

Не могу понять. Если в редакторе делаешь ContentPadding = 0, то текст кнопки "прилепляется" к границе кнопки, ну как и ожидается. В рантайме всё равно зазор появляется. Набросал тестовое приложение - минимальное значение равно 8. Если делать меньше, то ничего визуально не меняется. В "боевом" приложении это значение равно 15. Отчего так? Я хотел сделать ContentPadding равным 3, чтобы кнопки помещались, а из-за этого зазора они налезают друг на друга.

 

20231108.zip


User Feedback

Recommended Comments

dervish00

Active subscription

Добавлю. Если после ресайза менять ширину кнопок вручную, то тогда всё нормально работает. Отсюда вывод, что размер кнопки вычисляется неправильно. Добавил это изменение ручное в пример.

20231108-2.zip

dervish00

Active subscription

Проводя эксперименты дальше, выяснил, что неправильно высчитывается ширина именно у кнопок. Если искусственно подставить вместо кнопки метку, а потом кнопке задать в качестве ширины вычисленную ширину метки, то предварительно всё выглядит правильно.

procedure ButtonResize(Sender: TObject; MinWidth : integer = 0);
var
  ButtonSize: TSizeF;
  btn : TfgButton absolute Sender;

  lLabel : TfgLabel;
  lbtnAppearance : TfgButtonAppearance;

begin
   try
      lLabel := TfgLabel.Create(nil);
      lLabel.Parent := nil;
      lLabel.Text := btn.Text;
      lLabel.Size := btn.Size;
      case btn.Kind of
         TfgButtonKind.Default : lbtnAppearance := TfgButtonAppearanceDefault(btn.Appearance);
         TfgButtonKind.Text : lbtnAppearance := TfgButtonAppearanceText(btn.Appearance);
         TfgButtonKind.Outlined : lbtnAppearance := TfgButtonAppearanceOutlined(btn.Appearance);
         TfgButtonKind.Contained : lbtnAppearance := TfgButtonAppearanceContained(btn.Appearance);
      end;
      lLabel.Font := lbtnAppearance.Text.Font;
      lLabel.ContentPadding := lbtnAppearance.ContentPadding;
      ButtonSize := lLabel.MeasureSize(TfgMeasuringSpecification.Unspecified, 0, TfgMeasuringSpecification.Fixed, lLabel.Height);
   finally
      FreeAndNil(lLabel);
   end;
//   ButtonSize := btn.MeasureSize(TfgMeasuringSpecification.Unspecified, btn.Width, TfgMeasuringSpecification.Fixed, btn.Height);
   ButtonSize.Width := Max(ButtonSize.Width,MinWidth);
   btn.Size.SetSizeF(ButtonSize);
end;

 

dervish00

Active subscription
(edited)

Еще дополню. Совершенно необъяснимо, но на некоторых кнопках и этот трюк не срабатывает. Например если текст у кнопки задать "с 02.11.2019 по 16.11.2023", то обрезаются последние три символа, а если у этой же кнопки текст будет "ХХХХХХХХХХХХХХХХХХХХХХХХХE" (т.е. кол-во символов такое же), то этот текст спокойно помещается. Фантастика.

Edited by dervish00
ошибка

  • Administrators

У кнопки есть доп. внутренний отступ на Android, который спрятан так, что до него не добраться. Я пока изучаю вопрос. 

  • Administrators
6 минут назад, dervish00 сказал:

Совершенно необъяснимо, но на некоторых кнопках и этот трюк не срабатывает. Например если текст у кнопки задать "с 02.11.2019 по 16.11.2023", то обрезаются последние три символа, а если у этой же кнопки текст будет "ХХХХХХХХХХХХХХХХХХХХХХХХХE" (т.е. кол-во символов такое же), то этот текст спокойно помещается. Фантастика.

Строки с одинаковым количеством символов чаще всего не равны по ширине. Это справедливо только для моно-шрифта. Пробел в обычном шрифте гораздо меньше, чем любой другой символ. А Ж обычно как-раз одна из самых широких букв. 

gorodoro

Active subscription
В 16.11.2023 в 15:42, dervish00 сказал:

Проводя эксперименты дальше, выяснил, что неправильно высчитывается ширина именно у кнопок. Если искусственно подставить вместо кнопки метку, а потом кнопке задать в качестве ширины вычисленную ширину метки, то предварительно всё выглядит правильно.

procedure ButtonResize(Sender: TObject; MinWidth : integer = 0);
var
  ButtonSize: TSizeF;
  btn : TfgButton absolute Sender;

  lLabel : TfgLabel;
  lbtnAppearance : TfgButtonAppearance;

begin
   try
      lLabel := TfgLabel.Create(nil);
      lLabel.Parent := nil;
      lLabel.Text := btn.Text;
      lLabel.Size := btn.Size;
      case btn.Kind of
         TfgButtonKind.Default : lbtnAppearance := TfgButtonAppearanceDefault(btn.Appearance);
         TfgButtonKind.Text : lbtnAppearance := TfgButtonAppearanceText(btn.Appearance);
         TfgButtonKind.Outlined : lbtnAppearance := TfgButtonAppearanceOutlined(btn.Appearance);
         TfgButtonKind.Contained : lbtnAppearance := TfgButtonAppearanceContained(btn.Appearance);
      end;
      lLabel.Font := lbtnAppearance.Text.Font;
      lLabel.ContentPadding := lbtnAppearance.ContentPadding;
      ButtonSize := lLabel.MeasureSize(TfgMeasuringSpecification.Unspecified, 0, TfgMeasuringSpecification.Fixed, lLabel.Height);
   finally
      FreeAndNil(lLabel);
   end;
//   ButtonSize := btn.MeasureSize(TfgMeasuringSpecification.Unspecified, btn.Width, TfgMeasuringSpecification.Fixed, btn.Height);
   ButtonSize.Width := Max(ButtonSize.Width,MinWidth);
   btn.Size.SetSizeF(ButtonSize);
end;

 

Я в итоге так сделал:

procedure buttonResize(aButton: TfgButton; aSize: single);

begin

aButton.TextSettings.Font.Size := aSize * TfgAndroidHelper.Activity.getResources.getConfiguration.fontScale;

aButton.Realign;

var Ls := aButton.MeasureSize(TfgMeasuringSpecification.Unspecified, 0, TfgMeasuringSpecification.Fixed);

Ls.Width := aButton.Appearance.ContentPadding.Left + Ls.Width + aButton.Appearance.ContentPadding.Right;

Ls.Height := aButton.Appearance.ContentPadding.Top + (aButton.TextSettings.Font.Size * 2) + aButton.Appearance.ContentPadding.Bottom;

aButton.Size.SetSizeF(Ls);

end;

procedure TFormMain.fgApplicationEvents1ApplicationStateChanged(Sender: TObject; const AOldState, ANewState: TfgApplicationState);

begin

buttonResize(fgButton1, 20); //размер шрифта, разумеется, на своё усмотрение

end;

Выглядит так:

Не самое изящное решение, но всё вроде вполне корректно и пропорционально 🥲

gorodoro

Active subscription
(edited)

А если на старте ещё такое добавить, то тогда размер кнопки совсем оптимальный получается:

procedure TFormMain.fgFormCreate(Sender: TObject);

begin

fgButton1.Appearance.ContentPadding.SetValues(8, 0, 8, 0, 0, 0);

end;

Видимо, это как-то связано с тем, что Ярослав ранее говорил:

В 16.11.2023 в 18:09, Yaroslav Brovin сказал:

У кнопки есть доп. внутренний отступ на Android, который спрятан так, что до него не добраться. Я пока изучаю вопрос. 

Edited by gorodoro

Create an account or sign in to comment

Recently Browsing 0

  • No registered users viewing this page.