Перейти к содержанию
Fire Monkey от А до Я

Рекомендуемые сообщения

  • Модераторы
5 часов назад, aldi77 сказал:

ето получается когда я повернул устройство

Какое устройство? intel?

Ссылка на комментарий
  • 1 месяц спустя...

Добрый день

Тестирую покраску статус бара методом, описанным в блоге Равиля.

Не совсем понятен нюанс с добавлением styles.xml в RemotePath res\values-v21\.

Если так сделать, то при попытке компиляции проекта с SDK API Level, меньшим 19, среда выдает ошибки об отсутствии функций 

\res\values-v21\styles.xml:4: error: Error: No resource found that matches the given name: attr 'android:windowTranslucentNavigation

\res\values-v21\styles.xml:3: error: Error: No resource found that matches the given name: attr 'android:windowTranslucentStatus

Значит ли это, что приложения с этим статус баром не смогут работать под Android ниже 4.4? Даже если они и не поддерживают перекраску статус бара?

И как будет отображаться статус бар под Android 4.4?

Заранее спасибо! 

Ссылка на комментарий
  • Модераторы

Стиль наследуется, потому указан v21, что соответствует Lollipop. Ниже 21 сдк, не будет покраски, будет чёрный статус бар

Ссылка на комментарий

Да, включён.

Но переделан под 9 patch.

В деплойменте к названиям сплешей в конце добавлено _def.9.png и деактивирован файл splash_image_def.xml согласно инструкции http://docwiki.embarcadero.com/RADStudio/Berlin/en/Using_9-patch_Images_in_Android

Изменено пользователем Alex7wrt
Ссылка на комментарий
  • 2 месяца спустя...

Добрый день, сначала мне жаль, потому что я не знаю русского языка. Я использую переводчик Google.
У меня есть следующая проблема: я использую вашу библиотеку для изменения цвета панели состояния (ZenFone3, android 7) отлично работает, пока я не отключу «Включить всплывающее изображение» там, где он больше не компилируется, и возвращает мне следующую ошибку.

[Ошибка PAClient] E2312 D: \ OffersCap \ Mobile \ Android \ Release \ OfferCap \ res \ values-v21 \ styles.xml: 5: Ошибка: Ошибка: ресурс не найден, который соответствует указанному имени (на 'android: windowBackground 'со значением' @ drawable / splash_image_def ').

если вы можете мне помочь, спасибо

Ссылка на комментарий
  • Модераторы
16 часов назад, Alisson R Oliveira сказал:

если вы можете мне помочь, спасибо

решение может быть такое

не использовать стиль, тоже самое можно сделать программно. посмотрите этот модуль

Скрытый текст

unit FMX.StatusBar;

{
  author : ZuBy
  rzaripov1990@gmail.com
}

interface

uses
  System.UITypes, FMX.Platform
{$IFDEF ANDROID} ,
  Androidapi.JNI.GraphicsContentViewText, Androidapi.JNIBridge, Androidapi.Helpers,
  Androidapi.JNI.JavaTypes, Androidapi.JNI.App, FMX.Platform.Android, FMX.Helpers.Android
{$ELSEIF defined(IOS)}
    , FMX.Helpers.iOS, FMX.Platform.iOS, iOSapi.UIKit, iOSapi.Foundation, iOSapi.CoreGraphics, iOSapi.CoreImage
{$ENDIF};

{$IFDEF ANDROID}

type
  JWindowManager_LayoutParamsClassExt = interface(JWindowManager_LayoutParamsClass)
    ['{48861EC2-BC53-440A-B1B8-76FF4DF36F97}']
    { class } function _GetFLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS: Integer; cdecl;
    { class } property FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS: Integer read _GetFLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS;
  end;

  TJWindowManager_LayoutParamsExt = class(TJavaGenericImport<JWindowManager_LayoutParamsClassExt,
    JWindowManager_LayoutParams>)
  end;

  [JavaSignature('android/view/Window')]
  JWindowExt = interface(JWindow)
    ['{2810B178-9634-453D-8963-19CE145E6669}']
    procedure setStatusBarColor(color: Integer); cdecl;

    function getStatusBarColor: Integer; cdecl;
  end;

  TJWindowExt = class(TJavaGenericImport<JWindowClass, JWindowExt>)
  end;

function GetWindowExt: JWindowExt;
{$ENDIF}
function Darker(color: TAlphaColor; Percent: Byte): TAlphaColor;

procedure StatusBarGetBounds(out StatusBar, navigationBar: Integer);  // получаем размеры статус бара и нав бара
procedure StatusBarSetColor(const aColor: TAlphaColor); // устанавливаем цвет формы!!

implementation

uses
  System.SysUtils;

function MulDiv(nNumber, nNumerator, nDenominator: Integer): Integer;

  function MathRound(AValue: Extended): Int64; inline;
  begin
    if AValue >= 0 then
      Result := Trunc(AValue + 0.5)
    else
      Result := Trunc(AValue - 0.5);
  end;

begin
  if nDenominator = 0 then
    Result := -1
  else
    Result := MathRound(Int64(nNumber) * Int64(nNumerator) / nDenominator);
end;

function Darker(color: TAlphaColor; Percent: Byte): TAlphaColor;
var
  r, g, b: Byte;
begin
  r := TAlphaColorRec(color).r;
  g := TAlphaColorRec(color).g;
  b := TAlphaColorRec(color).b;
  r := r - MulDiv(r, Percent, 100);
  g := g - MulDiv(g, Percent, 100);
  b := b - MulDiv(b, Percent, 100);
  Result := TAlphaColorF.Create(r / 255, g / 255, b / 255, 1).ToAlphaColor;
end;

function Lighter(color: TAlphaColor; Percent: Byte): TAlphaColor;
var
  r, g, b: Byte;
begin
  r := TAlphaColorRec(color).r;
  g := TAlphaColorRec(color).g;
  b := TAlphaColorRec(color).b;
  r := r + MulDiv(255 - r, Percent, 100);
  g := g + MulDiv(255 - g, Percent, 100);
  b := b + MulDiv(255 - b, Percent, 100);
  Result := TAlphaColorF.Create(r / 255, g / 255, b / 255, 1).ToAlphaColor;
end;

{$IFDEF ANDROID}

function GetWindowExt: JWindowExt;
begin
  Result := TJWindowExt.Wrap((MainActivity.getWindow as ILocalObject).GetObjectID);
end;
{$ENDIF}

procedure StatusBarGetBounds(out StatusBar, navigationBar: Integer);
{$IFDEF ANDROID}
var
  KeyCharacterMap: JKeyCharacterMap;
  resourceID: Integer;
  ScreenService: IFMXScreenService;
  sScale: Single;
{$ENDIF}
begin
  navigationBar := 0;
  StatusBar := 0;
{$IFDEF ANDROID}
  if TOSVersion.Check(5, 0) then // вроде только работает с 5.0 ниже нет устройства проверить
  begin
    sScale := 1;
    if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, IInterface(ScreenService)) then
      sScale := ScreenService.GetScreenScale; // получаем скейл

    resourceID := TAndroidHelper.Activity.getResources.getIdentifier(StringToJString('status_bar_height'),
      StringToJString('dimen'), StringToJString('android'));
    if resourceID > 0 then
      StatusBar := Trunc(TAndroidHelper.Activity.getResources.getDimensionPixelSize(resourceID) / sScale);

    if not TJKeyCharacterMap.JavaClass.deviceHasKey(TJKeyEvent.JavaClass.KEYCODE_BACK) then
    // проверка на существование наэкранных кнопок или физических
    begin
      resourceID := TAndroidHelper.Activity.getResources.getIdentifier(StringToJString('navigation_bar_height'),
        StringToJString('dimen'), StringToJString('android'));
      if resourceID > 0 then
        navigationBar := Trunc(TAndroidHelper.Activity.getResources.getDimensionPixelSize(resourceID) / sScale);
    end;
  end;
{$ENDIF}
end;

{$IFDEF IOS}

function GetStatusBarView: UIView;
var
  I: Integer;
  LViews: NSArray;
  LView: UIView;
begin
  Result := nil;
  LViews := SharedApplication.keyWindow.rootViewController.view.subviews;
  for I := 0 to LViews.count - 1 do
  begin
    LView := TUIView.Wrap(LViews.objectAtIndex(I));
    if CGRectEqualToRect(LView.frame, SharedApplication.statusBarFrame) <> 0 then
    begin
      Result := LView;
      Break;
    end;
  end;
end;

procedure SetStatusBarBackgroundColor(const ABackgroundColor: TAlphaColor);
var
  Red: Single;
  Green: Single;
  Blue: Single;
  ColorCI: CIColor;
  ColorUI: UIColor;
  StatusBarView: UIView;
begin
  StatusBarView := GetStatusBarView;
  if StatusBarView = nil then
    Exit;
  Red := TAlphaColorRec(ABackgroundColor).r / 255;
  Green := TAlphaColorRec(ABackgroundColor).g / 255;
  Blue := TAlphaColorRec(ABackgroundColor).b / 255;
  ColorCI := TCIColor.Wrap(TCIColor.OCClass.colorWithRed(Red, Green, Blue));
  ColorUI := TUIColor.Wrap(TUIColor.OCClass.colorWithCIColor(ColorCI));
  StatusBarView.setBackgroundColor(ColorUI);
  if TOSVersion.Check(7, 0) then
    SharedApplication.keyWindow.rootViewController.setNeedsStatusBarAppearanceUpdate;
end;
{$ENDIF}

procedure StatusBarSetColor(const aColor: TAlphaColor);
{$IFDEF ANDROID}
var
  Window: JWindowExt;
{$ENDIF}
begin
{$IFDEF ANDROID}
  CallInUIThread(
    procedure
    begin
      if TOSVersion.Check(5, 0) then
      begin
        Window := GetWindowExt;
        Window.setFlags(TJWindowManager_LayoutParams.JavaClass.FLAG_TRANSLUCENT_STATUS,
          TJWindowManager_LayoutParams.JavaClass.FLAG_TRANSLUCENT_STATUS);
        Window.setFlags(TJWindowManager_LayoutParamsExt.JavaClass.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS,
          TJWindowManager_LayoutParamsExt.JavaClass.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        Window.setStatusBarColor(-16777216);
      end;
    end);
{$ENDIF}
{$IFDEF IOS}
  SetStatusBarBackgroundColor(aColor);
{$ENDIF}
end;

end.

 

Ссылка на комментарий

Он работал, теперь он рисует строку состояния, но экран идет позади ... Я не видел, чтобы функция могла получить высоту строки состояния, чтобы сделать интервал, например, один из предыдущего примера
"Layout.Margins.Top: = TmyWindow.StatusBarHeight;"
Не могли бы вы помочь мне, как мне это сделать с этим новым подразделением, которое вы показали?

благодарный

Ссылка на комментарий
  • Модераторы
1 час назад, Alisson R Oliveira сказал:

Он работал, теперь он рисует строку состояния, но экран идет позади ... Я не видел, чтобы функция могла получить высоту строки состояния, чтобы сделать интервал, например, один из предыдущего примера
"Layout.Margins.Top: = TmyWindow.StatusBarHeight;"
Не могли бы вы помочь мне, как мне это сделать с этим новым подразделением, которое вы показали?

благодарный

Использовать процедуру 

StatusBarGetBounds, там будет высота статус бара

Ссылка на комментарий

извините за мое понимание вашего подразделения. Процедура «StatusBarGetBounds» не является функцией, которая не возвращает мне значение высоты строки состояния, поэтому я говорю, что у меня есть много знаний о предмете, высота бара состояния и босса для всех версий android (от 5 ) и независимо от марки устройства (asus, samsung, lg и др.)? Как вы можете привести пример правильного использования описанных вами процедур.

еще раз спасибо

Ссылка на комментарий
  • Модераторы
2 часа назад, Alisson R Oliveira сказал:

извините за мое понимание вашего подразделения. Процедура «StatusBarGetBounds» не является функцией, которая не возвращает мне значение высоты строки состояния, поэтому я говорю, что у меня есть много знаний о предмете, высота бара состояния и босса для всех версий android (от 5 ) и независимо от марки устройства (asus, samsung, lg и др.)? Как вы можете привести пример правильного использования описанных вами процедур.

еще раз спасибо

Процедура возвращает результат в параметрах

var
  statusbar, navbar: integer;
begin
  StatusBarGetBounds(statusbar, navbar);
  Control.Margin.Top := statusbar;
end;

 

Ссылка на комментарий

Очень хорошая проблема позиционирования управления по отношению к разрешенной строке состояния, я искал функцию, которая возвращает мне целое число, плюс и процедуру.

кажется, что все работает отлично, за исключением одной детали, цвет, который я передаю как параметр, не используется для рисования строки состояния. и фиксированный цвет. анализируя процедуру, которая делает это «StatusBarSetColor» увидела, что он получает «const aColor: TAlphaColor» и только использует на устройствах iOS в Android фиксированное значение

procedure StatusBarSetColor(const aColor: TAlphaColor);
{$IFDEF ANDROID}
var
  Window: JWindowExt;
{$ENDIF}
begin
{$IFDEF ANDROID}
  CallInUIThread(
    procedure
    begin
      if TOSVersion.Check(5, 0) then
      begin
        Window := GetWindowExt;
        Window.setFlags(TJWindowManager_LayoutParams.JavaClass.FLAG_TRANSLUCENT_STATUS,
          TJWindowManager_LayoutParams.JavaClass.FLAG_TRANSLUCENT_STATUS);
        Window.setFlags(TJWindowManager_LayoutParamsExt.JavaClass.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS,
          TJWindowManager_LayoutParamsExt.JavaClass.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        Window.setStatusBarColor(-16777216);
      end;
    end);
{$ENDIF}
{$IFDEF IOS}
  SetStatusBarBackgroundColor(aColor);
{$ENDIF}
end;

Screenshot_20171113-104835.jpg

Ссылка на комментарий
  • Модераторы
1 час назад, Alisson R Oliveira сказал:

Очень хорошая проблема позиционирования управления по отношению к разрешенной строке состояния, я искал функцию, которая возвращает мне целое число, плюс и процедуру.

кажется, что все работает отлично, за исключением одной детали, цвет, который я передаю как параметр, не используется для рисования строки состояния. и фиксированный цвет. анализируя процедуру, которая делает это «StatusBarSetColor» увидела, что он получает «const aColor: TAlphaColor» и только использует на устройствах iOS в Android фиксированное значение

procedure StatusBarSetColor(const aColor: TAlphaColor);
{$IFDEF ANDROID}
var
  Window: JWindowExt;
{$ENDIF}
begin
{$IFDEF ANDROID}
  CallInUIThread(
    procedure
    begin
      if TOSVersion.Check(5, 0) then
      begin
        Window := GetWindowExt;
        Window.setFlags(TJWindowManager_LayoutParams.JavaClass.FLAG_TRANSLUCENT_STATUS,
          TJWindowManager_LayoutParams.JavaClass.FLAG_TRANSLUCENT_STATUS);
        Window.setFlags(TJWindowManager_LayoutParamsExt.JavaClass.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS,
          TJWindowManager_LayoutParamsExt.JavaClass.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        Window.setStatusBarColor(-16777216);
      end;
    end);
{$ENDIF}
{$IFDEF IOS}
  SetStatusBarBackgroundColor(aColor);
{$ENDIF}
end;

Screenshot_20171113-104835.jpg

Текущая реализация не позволяет нам менять цвет статус бара, потому что в FMX используется старая тема Holo.

Поэтому устанавливается полупрозрачный цвет для нативного окна, и регулируется цвет статус бара с помощью установки цвета формы. 

Так достигается эффект покраски статус бара

Ссылка на комментарий

Я понимаю, что я рассмотрю дорожную карту грузоотправителя, чтобы посмотреть, будет ли эта деталь изменена. С вашим объяснением и вашим устройством я помещаю TRectangle с желаемым цветом, чтобы быть backgroud, поэтому у меня был «желаемый результат».

Большое спасибо

Ссылка на комментарий
  • Модераторы
16 минут назад, haword сказал:

а тему поменять нельзя с Holo на Material в ресурсах?

наверное можно поменять, но не ясно на что это повлияет

Ссылка на комментарий
  • 2 месяца спустя...
В 13/11/2017 в 12:15, Равиль Зарипов (ZuBy) сказал:

Текущая реализация не позволяет нам менять цвет статус бара, потому что в FMX используется старая тема Holo.

Поэтому устанавливается полупрозрачный цвет для нативного окна, и регулируется цвет статус бара с помощью установки цвета формы. 

Так достигается эффект покраски статус бара

Доброе утро ... жаль открывать тропик после долгого времени, но я утверждал приложение на других устройствах, что панель навигации не является физической (назад, дома, окнами), и с этим она становится полностью прозрачной, а элементы управления белыми, например могу я решить ???

благодарный

Ссылка на комментарий
  • Модераторы
21 час назад, Alisson R Oliveira сказал:

Доброе утро ... жаль открывать тропик после долгого времени, но я утверждал приложение на других устройствах, что панель навигации не является физической (назад, дома, окнами), и с этим она становится полностью прозрачной, а элементы управления белыми, например могу я решить ???

благодарный

попробуйте последнюю версию

Ссылка на комментарий
  • 1 год спустя...

Запустил код по ссылке на delphi 10.3.2, android 8.1 Xiaomi redmi 5 plus

В моем случае выяснилось, что поведение зависит от состояния Mainform.Borderstyle

Если none - ведет себя как Fullscreen, статусбар прячется

 

Дополнено! 

Чистый проект на 10.3.2 сам добавляет в Deployment файл styles-v21.xml

Его нужно отключить! 

image.png.ce012efcddf18ab37750c1e9c4e0051b.png

 

иначе будет только вариант Fullscreen (он же Borderstyle=none) когда статусбар скрыт и выезжает полупрозрачный, либо обычный неокрашенный статаусбар.

Если без него впоследствии что-то не взлетит, можно так же как с основным styles.xml добавить в deployment свой, модифицированный, со строками

        <item name="android:windowTranslucentStatus">true</item>
        <item name="android:windowTranslucentNavigation">false</item>
 

У меня после отключения окрашивание статусбара работает корректно.

Изменено пользователем krapotkin
Ссылка на комментарий
  • 6 месяцев спустя...

Доброго времени сутки.

На Samsung Galaxy S8 Edge проект когда открываю выдаёт вот так:

image.thumb.png.9d595d85ae7aad0777df7dd089bdd6ed.png  

кто в курсе почему так происходит? вроде красный панель доле перекрывать NavigationBar?

заранее спасибо

Ссылка на комментарий
  • 4 месяца спустя...

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...