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

[Android] Как изменить цвет системного статус бара и разместить контролы под ним?


zekelive

Вопрос

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

  • 0
  • Модераторы

Друзья, подскажите. Реализовано ли уже в Seattle установка цвета системного StatusBar с цветом ToolBar на форме? Как это реализовано на платформе iOS.

пока такого нет

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

Есть программа на андроид DropSync, она меняет цвет верхнего статусбара под себя(на синий).

Прога умеет синхронизировать с Dropbox вложенные папки и файлы, очень удобно для закачки mp3 каталогов. 

UPD: это не решение, но хотел показать, что возможно...

 

e7dfea1b526f.png

Изменено пользователем rustam_d
Ссылка на комментарий
  • 0

Ага, только скриншот программы на Android... Он-то начиная с 5 версии это умеет. Насколько я знаю пока в Delphi никто это не реализовал.

не ленитесь рубрики читать...как раз речь о ведре.

DropSync с 5-й ? хм...с 4 юзаю, а 5 у меня нет пока.

Изменено пользователем rustam_d
Ссылка на комментарий
  • 0
  • Модераторы

 

Ага, только скриншот программы на Android... Он-то начиная с 5 версии это умеет. Насколько я знаю пока в Delphi никто это не реализовал.

не ленитесь рубрики читать...как раз речь о ведре.

DropSync с 5-й ? хм...с 4 юзаю, а 5 у меня нет пока.

с 5-ки все google приложения научились не только менять цвет

post-59-0-60194900-1446795697_thumb.png

 

может когда нить и мы сможем так делать :)

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

Поскольку тема вызывает не поддельный интерес у пользователей. Я расскажу, как это делал я для одной демо программы, которую я готовил для выступления в ИТМО. Сразу приложу скриншот, как это будет выглядеть:
post-1-0-56626600-1454669560_thumb.pngpost-1-0-92700200-1454669560_thumb.png
 

Сразу скажу, что это решение временное и имеет ряд определенных нюансов, которые появятся после его использования. О том, как исправить эти нюансы указано в самом конце.

Теперь к делу. Андроид позволяет сделать статус бар прозрачным с наложением белого цвета с альфа каналом. Это значит, если мы разместим под статус баром зеленый цвет, то статус бар станет соответствующего темно зеленого цвета. Этим и воспользуемся. Основная идея такая:

  • Говорим Андроиду, что хотим прозрачный статус бар.
  • Указываем андроиду, что хотим размещать форму под статус баром.
  • Размещаем под статус баром TRectangle нужного цвета, в тон TToolBar (если используете)

Теперь по шагам:
 
1. Говорим Андроиду, что хотим прозрачный статус бар. Указываем андроиду, что хотим размещать форму под статус баром.
Создаем файл style.xml со стилем для нашего приложения.

<resources xmlns:android="http://schemas.android.com/apk/res/android">
	<style name="AppTheme" parent="@android:style/Theme.Holo.Light">
		<item name="android:windowTranslucentStatus">true</item>
		<item name="android:windowTranslucentNavigation">true</item>
		<item name="android:windowBackground">@drawable/splash_image_def</item>
		<item name="android:windowNoTitle">true</item>
	</style>
</resources>

В стиле указываем, что мы хотим использовать прозрачный статус бар.
 
Открываем Менеджер развертывания Menu->Project->Deployment Manager и добавляем наш файл стиля в проект только для андроид конфигураций:
post-1-0-23103200-1454670162_thumb.png

  • Remote Path: "res\values\"
  • Remote Name: "styles.xml"

Теперь при запуске программы, андроид будет считать, что:

  •  
  • Приложение будет развернуто на весь экран
  • Статус бар будет прозрачного цвета.

3. Размещаем под статус баром TRectangle нужного цвета, в том TToolBar (если используете)
Я разместил вверху формы TRectangle, который залил требуемым цветом, в тон тул бару:
post-1-0-37805600-1454670342_thumb.png
Высота статус бара у андроида равна 24.
 
Если вы делаете кроссплатформенный проект и для ios тоже, то по умолчанию скрываем этот прямоугольник и добавляем код по его отображению в конструктор формы только на андроиде

constructor TFormMain.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
{$IFDEF ANDROID}
  SystemStatusBarBackground.Visible := True;
{$ENDIF}
end;

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

  • Нативные контролы распологаются по старому, полагая, что форма располагается под статус баром, а не под формой. Поэтому для нативных контролов таких, как TMapView, нужно корректировать позицию или отступы.
  • {$IFDEF ANDROID}
      MapView.Margins.Top := -SystemStatusBarBackground.Height;
    {$ENDIF}
    
  • Формы располагается так же и под нижними программными кнопками: Назад, домой и меню. Поэтому нужно так же иметь в виду, что расположенные снизу контролы, не будут кликабельны. Так как перекрываются нижней панелью с кнопками. Решение - это разместить TLayout под нижней панелью, чтобы сдвинуть ваши контролы к верху.
Ссылка на комментарий
  • 0

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

 

да и насчет прозрачности с белым альфой то же сомнение есть. так как если взять тот же самый гуглмаркет, там при пролистывании страницы бар остается одним цветом, как страница доходит до определенного момента бар ПЛАВНО исчезает и становится прозрачным даже в тот момент когда страница листается. то есть выходит есть способ заставить выкрасить бар в цвет какой ни будь не зависимо от подложки под ним. или очень выпендрится с бубном что бы сделать такой эффект. 

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

Ярослав, а чем Ваш способ лучше чем я продемонстрировал в другой похожей теме?

По сути он делает тоже самое, только кодом. Какие плюсы?

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

Тема оказалась настолько интересна что занялся ей подробней.

 

Мы с zairkz убили много времени, чтобы понять как выкрасить в один цвет без полупрозрачности, взяв скриншот и фотошоп определили, что затемнение происходит на 40%

 

Решение родилось само собой, затемнить цвет ToolBar'a на 40% и цвет выровняется.

Казалось бы можно осветлить цвет для подложки и цвет тоже выровнится, но например белый или светлые цвета нельзя еще осветлить.

 

post-59-0-68319300-1454832959_thumb.png post-59-0-11905100-1454833807_thumb.png

 

также написал процедуру для определения высоты статус бара и панели навигации

procedure androidGetBounds(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;

и в модуле FMX.Platform.Android нужно изменения внести (если вы используете измененный модуль для Intel'а)

     // Fix by Flying Wang &
      CallInUIThread(
        procedure
        begin
          if (not PlatformAndroid.GetFullScreen(nil)) and (SharedActivity.getWindow.getAttributes.Flags and
            TJWindowManager_LayoutParams.JavaClass.FLAG_FULLSCREEN <> TJWindowManager_LayoutParams.JavaClass.FLAG_FULLSCREEN) and
            (SharedActivity.getWindow.getAttributes.Flags and TJWindowManager_LayoutParams.JavaClass.FLAG_TRANSLUCENT_STATUS <>
            TJWindowManager_LayoutParams.JavaClass.FLAG_TRANSLUCENT_STATUS) // fix by ZuBy
        ... 

SystemBar.zip

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

Решил опробовать способ Ярослава с прозрачным статус баром - не получается. Получается только лишь закрасить статус бар в любой цвет, а вот сделать прозрачным никак. Делал все по инструкции. Что может быть не так? Работаю с Seattle 10 Upd1 для Андроида. Есть форма, на ней TTabControl с TImage. 

Ссылка на комментарий
  • 0
  • Модераторы
12 часа назад, zekelive сказал:

Решил опробовать способ Ярослава с прозрачным статус баром - не получается. Получается только лишь закрасить статус бар в любой цвет, а вот сделать прозрачным никак. Делал все по инструкции. Что может быть не так? Работаю с Seattle 10 Upd1 для Андроида. Есть форма, на ней TTabControl с TImage. 

Попробуйте вот так

Ссылка на комментарий
  • 0
11 час назад, ZuBy сказал:

Попробуйте вот так

Спасибо. Ваш способ сработал, но опишу ситуацию которая была конкретно у меня. Проблема была в том, что у меня 2 формы. Первая - загрузочная, которая в последствии вызывает вторую. А весь код я описывал на второй форме, и это не работало, как только я тоже самое описал для первой формы - все получилось.

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

Спасибо. Ваш способ сработал, но опишу ситуацию которая была конкретно у меня. Проблема была в том, что у меня 2 формы. Первая - загрузочная, которая в последствии вызывает вторую. А весь код я описывал на второй форме, и это не работало, как только я тоже самое описал для первой формы - все получилось.

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

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

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

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

Гость
Ответить на вопрос...

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

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

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

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

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

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