Решение для нового API-интерфейса заставки: искажения, разные версии Android…Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Решение для нового API-интерфейса заставки: искажения, разные версии Android…

Сообщение Anonymous »

На самом деле, 2 шага: создание тем и создание условия (условный метод в действии) a) Основная тема-заставка
Это основная тема-заставка (она предназначена для устройств с ОС Android менее 12 (sdk 31)!)
Почему это так? Для простоты условия в методе в активности, чтобы нам не пришлось ставить два условия: потому что «если your_android_version меньше 12» — это не совсем аккуратное условие (можете попробовать, если не верите…)
Итак, это будет наша «родительская» тема:
style name="ThemeAppStarting" parent="Theme.SplashScreen"

(Настройка фона заставки, анимированного значка и продолжительности анимации.)
Здесь — фон белый:
item name="windowSplashScreenBackground">#ffffff

Обратите внимание! Следующее свойство (рисуемый элемент) будет расширено в нашей «подтеме»!
В этой теме мы не можем пропустить настройку рисования, поскольку значок заставки может быть (по крайней мере, на сегодняшний день, 19 февраля) искажен или частично видимый… (это, конечно, тоже зависит от вашего рисования).
Поэтому мы помещаем либо тот же самый рисуемый объект (например, значок приложения), но (Внимание!), завернутый во вставку* с «большими числами» ( '83'), вот так:
*//взято отсюда //>>> Новый экран-заставка отображается в форме круга


//чтобы создать вставку, щелкните правой кнопкой мыши папку «drawable» > «Создать» > «Рисуемый файл ресурсов»
Или мы можем использовать любой другой рисуемый файл , но опять же (конечно, в зависимости от свойств рисуемого объекта) вы можете захотеть поместить его в (отдельную) вставку -->
item name="windowSplashScreenAnimatedIcon" type="drawable">@drawable/splash_inset_less_than_12_andr@style/Theme.MyApplicationHCLTest



b) Расширено из основной темы-заставки
Эта тема является расширением («подтемой») основной темы их, используя только один элемент (если вы не хотите использовать windowSplashScreenBrandingImage):
style name="SplashThemeAndroid12Plus" parent="ThemeAppStarting"

Обратите внимание!!! Это может быть как с рисуемым элементом, так и без него!
Если он без элемента, Android (начиная с версии ?(не помню)) использует значок приложения в качестве заставки!
Если мы определим это сюда (то есть даем ссылку на рисуемый ресурс), мы, таким образом, можем использовать здесь любой другой рисуемый ресурс!
Кроме того, мы можем установить размер значка на устройстве (ов) экран(ы) с помощью 'inset'*!
*Новый экран-заставка показан в форме круга
Для этого нам нужно создать рисуемый ресурс (см. выше) и «играть» ' со вставленными значениями (числами):
что-то вроде этого:
inset xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@mipmap/your_ic_launcher"
android:insetLeft="35dp"
android:insetRight="35dp"
android:insetTop="35dp"
android:insetBottom="35dp

а затем просто сформулировать это так:
item name="windowSplashScreenAnimatedIcon" type="drawable">@drawable/splash_inset_andr_12

"При желании вы можете использовать windowSplashScreenBrandingImage, чтобы установить изображение, которое будет отображаться
в нижней части экрана-заставки. Рекомендации по дизайну не рекомендуют использовать фирменное изображение."
/>https://developer.android.com/develop/u ... ash-screen
с соотношением сторон чего-то около 446x177 (у меня такое)
item name="android:windowSplashScreenBrandingImage" tools:targetApi="s">@drawable/your_branded_image


  • Создать метод использования условных тем
суть в том, куда следует поместить условный метод! (Потому что я пытался запустить его из onCreate… безуспешно и в течение долгого времени…)
Хотя заставка создается в методе onCreate, перед super.onCreate и setContentView — в onResume должен быть помещен условный метод! !! На самом деле я нашел решение здесь, в Stackoverflow, от человека, который спрашивал об этом, а затем сам ответил на свой вопрос. Я добавлю ссылку, когда найду ее.
@Override
protected void onResume() {
int currentApiVersion = android.os.Build.VERSION.SDK_INT;
if (currentApiVersion >= android.os.Build.VERSION_CODES.S) //public static final S = 31 //Android 12
{
//you can check if not null here… (see below)
getSplashScreen().setSplashScreenTheme(R.style.ThemeAppStartingV31Plus);
}
super.onResume();
}

Для этого я общался с OpenAI (https://chat.openai.com/chat), и вот что я из этого узнал:

«Проблема может заключаться в том, что метод onCreate() вашего действия может быть вызван до завершения заставки, а это означает, что метод getSplashScreen() может возвращать значение null при попытке доступа к нему. Чтобы решить эту проблему, вы можете вместо этого попробовать переместить условный оператор в метод onResume()».
«Да, onResume() — еще одно хорошее место для размещения условного оператора, потому что он будет вызывается каждый раз, когда действие выходит на передний план, например, когда приложение возобновляется из фонового режима или после закрытия экрана-заставки».
«Ваш обновленный код выглядит хорошо и должен работать правильно Использование getSplashScreen().setSplashScreenTheme() — это правильный способ динамической установки темы заставки во время выполнения, а использование темы R.style.ThemeAppStartingV31Plus, которую вы определили для устройств Android 12+, — это правильный способ условно применить новую заставку. тема».
Больше от OpenAI:
«Вот пример (Java):
public class MyActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
}

@Override
protected void onResume() {
super.onResume();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
if (getSplashScreen() != null) {
getSplashScreen().setSplashScreenTheme(R.style.ThemeAppStartingV31Plus);
}
}
}
}

Перемещая условный оператор в метод onResume(), вы гарантируете, что заставка завершится, прежде чем пытаться получить к ней доступ».
Подробнее от OpenAI:
«Однако в этом случае мы можем поместить условный оператор в метод setContentView(), который вызывается внутри onCreate().
Вот пример:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

// check SDK version and set appropriate theme

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
setTheme(R.style.Theme_MyApp_V31);
}

setContentView(R.layout.activity_main);
}

В этом примере метод setTheme() используется для установки соответствующей темы перед вызовом setContentView(). Тема устанавливается условно в зависимости от версии SDK устройства с помощью оператора if…»
Подробнее от OpenAI (начиная с моего вопроса)
Я:
А, понятно! Считаете ли вы, что это (совет выше) лучшая альтернатива помещению такого условия (в onResume):
@Override
protected void onResume() {
int currentApiVersion = android.os.Build.VERSION.SDK_INT;
if (currentApiVersion >= android.os.Build.VERSION_CODES.S) //public static final S = 31 //Android 12
{
getSplashScreen().setSplashScreenTheme(R.style.ThemeAppStartingV31Plus);
}
super.onResume();
}

OpenAI:
«Да, onResume() — еще одно хорошее место для размещения условного оператора, поскольку он будет вызываться каждый раз, когда действие дойдет до на переднем плане, например, когда приложение возобновляет работу из фонового режима или после завершения работы заставки.
Ваш обновленный код выглядит хорошо и должен работать правильно. Использование getSplashScreen().setSplashScreenTheme() — это правильный способ динамической установки темы заставки во время выполнения, а использование темы R.style.ThemeAppStartingV31Plus, которую вы определили для устройств Android 12+, — это правильный способ условно применить новую тему заставки. .
Просто имейте в виду, что onResume() вызывается каждый раз, когда ваша активность выходит на передний план, поэтому, если ваша активность будет приостановлена, а затем возобновлена, условие будет проверено снова. Если оценка состояния требует больших затрат или имеет побочные эффекты, возможно, вам стоит подумать о том, чтобы перенести его в другое место. Но если это простая проверка, такая как версия SDK, в onResume() все будет хорошо».
Надеюсь, кому-нибудь это принесет пользу! 😉
Вот также ссылка для установки времени отображения значка (неанимированного) на экране, если он вам нравится: Android 12 Splash Screen API — увеличение продолжительности SplashScreen
PS
Вам также может понадобиться это:
super.onCreate(savedInstanceState);

//это сделано для того, чтобы не было белого экрана после закрытия основного (запускается onDestroy, который можно воссоздать с помощью «Не сохранять действия»)
/ /подумайте о меньшем, чем «50» или даже «0», чтобы сделать переход вообще незаметным, если хотите!
if (savedInstanceState != null){
DELAY = 50;
}


Подробнее здесь: https://stackoverflow.com/questions/755 ... d-versions
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»