Jump to content
View in the app

A better way to browse. Learn more.

FGX Native

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

ContentPadding у кнопок разного вида не изменяется меньше какого-либо значения

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

Members
В 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

Members
(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.

Account

Navigation

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.