• 0
zekelive

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

Вопросы

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 ответов на этот вопрос

  • 0

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

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

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

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

 

e7dfea1b526f.png

Изменено пользователем rustam_d

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 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

Жаль, очень жаль..спасибо за ответы, в любом случае)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 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

Не знаю у кого как. У меня
Resource entry AppTheme already has bag item android:windowBackground.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Не знаю у кого как. У меня

Resource entry AppTheme already has bag item android:windowBackground.

 В Deployment уберите галку с файла styles.xml 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 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 формы. Первая - загрузочная, которая в последствии вызывает вторую. А весь код я описывал на второй форме, и это не работало, как только я тоже самое описал для первой формы - все получилось.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Похожий контент

    • От Юрий Гусач
      Доброго дня!
      Проясните пожалуйста ситуацию: при запуске программы  под Андроидом на различных устройствах я получаю размеры формы, которые вроде всегда в разы меньше чем максимальное разрешение экрана конкретного устройства. Я пробовал планшеты и разные смартфоны. Написал тестовую прогу, которая выводит СlientScreen и  ClientWidth формы, на которой ничего больше нет. Например для крайне бюджетного смартфона Fly FS-549 получилось 497 х 320, а по паспорту 854x480. Разрешение и так хреновое, а Delphi его еще сильнее уменьшает. -       Почему это происходит и можно ли как то это обойти?
       
       
    • От Андрей Лещинский
      Здравствуйте ребята. С Firemonkey знаком только два дня. Многое уже подчеркнул с данного форума. Спасибо вам. 
      Проблема заключается в том, что у меня sdk для андроид 7 версии. Я собираю apk файл, запускаю его на Андроид 7 и все отлично, но как только я устанавливаю приложение на Андроид например версии 5, то при запуске оно мерцает пару раз и потом отображается отлично. Не подскажите в чем проблема? Я пробовал проект с данного форума, чтобы форма уходила под статусбара. Вот все они и мерцают на Андроид ниже 7, другие не пробовал проекты
      Стаж у меня только 2 дня, скажите в какую сторону смотреть мне далее
    • От gutalin79
      Почему при добавлении MapView в пример Android Service, приложение перестает работать?
      AndroidSimpleService.zip
       
       
       
      Пример делал по этому видео: 
       
    • От Astghik
      Hello !!!
      I want onButtonClick create popup. I use TPopup component. All good, but on android "Back button" click closing forma. But I want close popup (when popup is shown).

       
      //---------------------------------------------------------------------------------
      void __fastcall  btn3PointsClick(TObject *Sender)
      {
          PopUpSettings->IsOpen = true;
          PopUpSettings->PlacementTarget = btn3Points;
          PopUpSettings->BringToFront();
      }
      //-------------------------------------------------------------------------------------
      void __fastcall FormCloseQuery(TObject *Sender, bool &CanClose)
      {
          try {
              if (PopUpSettings->IsOpen == true) {
                  CanClose = false;
              }
              else {
                  CanClose = true;
              }
          } __finally {
              PopUpSettings->IsOpen = false;
          }
      }
      //-------------------------------------------------------------------
       
    • От Rokweb
      Таймер с интервалом 1мс заметно подтормаживает во время выполнения анимации TFloatAnimation в Tokyo. У всех так или только у меня?
    • От Rokweb
      Здравствуйте.
      Речь пойдёт об Android.
      Использовал в Berlin данный unit для проигрывания звуков (TMediaPlayer не подходит) и все отлично работало. Сейчас перешел на Tokyo и происходит зависание в цикле:
       
      while not GLoaded do begin Sleep(10); Application.ProcessMessages; end;  
      Модуль прикрепил в сообщении.
       
      Так же интересует - возможно ли, использовать стиль, созданный в процессе разработки Android приложения - в iOS и если да - то как это правильно реализовать (почти каждый контрол имеет сейчас свой стиль)?
       
      Прошу помощи.
      GameAudioManager.zip
    • От zekelive
      Товарищи, здравствуйте. Хотел бы проконсультироваться с вами на довольно сложно для меня тему. Имеется клиентское мобильное приложение на Андроид. Принцип его просто, загружает фирмы из БД в scrollbox. За счёт того, что сразу загрузка всех данных из сервера занимает длительное время, было принято решение загружать с сервера только ключевую информацию (название фирмы), а остальную информацию загружать из локальной БД. При этом, т.к. файл БД можно легко вытащить из apk файла любому человеку, размещать всю БД на локалке нельзя. Только информацию в целом не представляющую большой значимости в отдельности от названия фирмы и не только. 
      Вопрос, правильная ли схему построения была выбрана с точки зрения защиты данных (если это так можно назвать), и оптимизации загрузки информации. 
      Приветствуются ваши советы, как лучше построить схему взаимодействия приложения с БД, или как лучше защитить данные. В идеале для быстродействия, загнать побольше данных в локальную БД. 
    • От Edward Tarasov
      Привет всем. кто сталкивался с такой ерундой, что в webbrowser вместо сайта тупо белый экран?? причем сам сайт отображаеться норм, и на том же планшете, но в стандартном бразуере и на компе... и именно этот сайт не пашет из приложения
    • От zekelive
      Друзья, первый раз столкнулся с картами и не пойму в чем дело. Приложение подписано, релизная версия. Добавил карты на форму и запустил на компиляцию, все отлично. Запускаю на смартфоне - приложение сразу вылетает. Ничего не прописывал связанное с картами, просто добавил компонент на форму. Что не так ?
    • От Алексей Алексеев
      Здравствуйте! Помогите начинающему, всё перелазил, всё что мог и всё безрезультатно.
      Такая проблема: 
      Стоит задача убрать перенос строки в Memo:
      Из 
      "1строка"
      "2строка" 
      сделать:
      "1строка 2строка" .
      Казалось бы все просто:
      memo1.Text:=memo1.Text.Replace(#13#10,' '); И на Windows всё работает, но на Android отказывается!
      Просто не реагирует, ошибок не выдает. Проверял на XE8 и на 10.2.
      Может дело в смартфоне Xiomi miMax? Так как вообще memo на нём глючит...
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу