Я хотів зробити свою програму більш професійною, тому вирішив, що хочу зробити заставку.
Як би я його створив і потім реалізував?
Я хотів зробити свою програму більш професійною, тому вирішив, що хочу зробити заставку.
Як би я його створив і потім реалізував?
Відповіді:
Подальше читання:
Стара відповідь:
ЯК : Простий екран
Цей відповідь показує вам, як відображати екран заставки протягом певного часу, коли ваш додаток запускається, наприклад, з брендингових причин. Наприклад, ви можете вибрати екран відображення протягом 3 секунд. Однак якщо ви хочете показати екран екрана протягом певного періоду часу (наприклад, час запуску програми), слід ознайомитися з відповіддю Абдулли https://stackoverflow.com/a/15832037/401025 . Однак майте на увазі, що запуск програми може бути дуже швидким на нових пристроях, тому користувач просто побачить спалах, що погано UX.
Спершу потрібно визначити екран екрана у вашому layout.xml
файлі
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ImageView android:id="@+id/splashscreen" android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:src="@drawable/splash"
android:layout_gravity="center"/>
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Hello World, splash"/>
</LinearLayout>
І ваша діяльність:
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
public class Splash extends Activity {
/** Duration of wait **/
private final int SPLASH_DISPLAY_LENGTH = 1000;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.splashscreen);
/* New Handler to start the Menu-Activity
* and close this Splash-Screen after some seconds.*/
new Handler().postDelayed(new Runnable(){
@Override
public void run() {
/* Create an Intent that will start the Menu-Activity. */
Intent mainIntent = new Intent(Splash.this,Menu.class);
Splash.this.startActivity(mainIntent);
Splash.this.finish();
}
}, SPLASH_DISPLAY_LENGTH);
}
}
Це все ;)
SPLASH_DISPLAY_LENGTH
час. Ви повинні зробити це замість цього: bignerdranch.com/blog/splash-screens-the-right-way
Зауважте, що це рішення не дасть користувачеві більше чекати: затримка екрана сплеску залежить від часу запуску програми.
Якщо ви відкриєте будь-який додаток для Android, ви отримаєте за замовчуванням якийсь чорний екран із заголовком та піктограмою додатка зверху, ви можете змінити це, використовуючи стиль / тему.
Спочатку створіть style.xml у папці значень та додайте до неї стиль.
<style name="splashScreenTheme" parent="@android:style/Theme.DeviceDefault.Light.NoActionBar">
<item name="android:windowBackground">@drawable/splash_screen</item>
</style>
Замість використання @android:style/Theme.DeviceDefault.Light.NoActionBar
ви можете використовувати будь-яку іншу тему як батьків.
По-друге, у вашому додатку Manifest.xml додайте android:theme="@style/splashScreenTheme"
до своєї основної діяльності.
<activity
android:name="MainActivity"
android:label="@string/app_name"
android:theme="@style/splashScreenTheme" >
По-третє, оновіть свою тему під час запуску onCreate ().
protected void onCreate(Bundle savedInstanceState) {
// Make sure this is before calling super.onCreate
setTheme(R.style.mainAppTheme);
super.onCreate(savedInstanceState);
}
ОНОВЛЕННЯ Перевірте цю публікацію .
Завдяки @ mat1h та @adelriosantiago
<item name="android:background">
це перекриє windowBackground
. І без android:background
визначення, моє передумови в будь-яких фрагментах було б прозорим, що розкривало б активність за змістом переднього плану.
ваш Splash.java може виглядати так:
public class Splash extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.splash);
int secondsDelayed = 1;
new Handler().postDelayed(new Runnable() {
public void run() {
startActivity(new Intent(Splash.this, ActivityB.class));
finish();
}
}, secondsDelayed * 1000);
}
}
перейдіть ActivityB.class
на ту діяльність, яку ви хочете розпочати після екрана заставки
перевірте свій файл маніфесту і він повинен виглядати так
<activity android:name=".HomeScreen" android:label="@string/app_name"> </activity> <activity android:name=".Splash" android:label="@string/title_activity_splash_screen"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
Відповіді вище дуже хороші, але я хотів би додати ще щось. Я новачок в Android, я зіткнувся з цією проблемою під час своєї розробки. сподіваюся, що це може допомогти комусь, як я.
Екран Splash - це точка входу мого додатка, тому додайте наступні рядки в AndroidManifest.xml.
<activity
android:name=".SplashActivity"
android:theme="@android:style/Theme.DeviceDefault.Light.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Екран сплеску повинен відображатися лише один раз у життєвому циклі програми, я використовую булеву змінну для запису стану екрана сплеску та показую лише в перший раз.
public class SplashActivity extends Activity {
private static boolean splashLoaded = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (!splashLoaded) {
setContentView(R.layout.activity_splash);
int secondsDelayed = 1;
new Handler().postDelayed(new Runnable() {
public void run() {
startActivity(new Intent(SplashActivity.this, MainActivity.class));
finish();
}
}, secondsDelayed * 500);
splashLoaded = true;
}
else {
Intent goToMainActivity = new Intent(SplashActivity.this, MainActivity.class);
goToMainActivity.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(goToMainActivity);
finish();
}
}
}
щасливе кодування!
android:noHistory="true"
в , AndroidManifest.xml
щоб заборонити йому йти назад до заставки з допомогою кнопки назад.
Відповідь Абдулли чудова. Але я хочу додати ще кілька деталей до нього зі своєю відповіддю.
Реалізація екрана заставки
Правильна реалізація екрана виплескування дещо інша, ніж ви могли собі уявити. Вигляд сплеску, який ви бачите, повинен бути готовий негайно, навіть до того, як ви зможете надути файл макета під час своєї дії.
Таким чином, ви не будете використовувати файл макета. Замість цього вкажіть фон екрана заставки як фон теми діяльності. Для цього спочатку створіть XML, який можна малювати в Res / Dravable.
background_splash.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:drawable="@color/gray"/>
<item>
<bitmap
android:gravity="center"
android:src="@mipmap/ic_launcher"/>
</item>
</layer-list>
Це просто список шарів з логотипом у центрі кольору фону з ним.
Тепер відкрийте styles.xml та додайте цей стиль
<style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
<item name="android:windowBackground">@drawable/background_splash</item>
</style>
Цю тему потрібно виконати на панелі дій та з фоном, який ми тільки що створили вище.
І в маніфесті вам потрібно встановити SplashTheme на діяльність, яку ви хочете використовувати як сплеск.
<activity
android:name=".SplashActivity"
android:theme="@style/SplashTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
Потім всередині коду вашої активності перейдіть до певного екрану користувача, використовуючи наміри.
public class SplashActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
finish();
}
}
Це правильний шлях. Ці відповіді я використав для відповіді.
YouTube
приводу цього. Але я думаю, що проблема розміру растрових зображень буде проблемою, оскільки ви не можете змінити її розмір за допомогою layer-list
.
Створіть Activity
SplashScreen.java
public class SplashScreen extends Activity {
protected boolean _active = true;
protected int _splashTime = 3000; // time to display the splash screen in ms
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.splashscreen);
Thread splashTread = new Thread() {
@Override
public void run() {
try {
int waited = 0;
while (_active && (waited < _splashTime)) {
sleep(100);
if (_active) {
waited += 100;
}
}
} catch (Exception e) {
} finally {
startActivity(new Intent(SplashScreen.this,
MainActivity.class));
finish();
}
};
};
splashTread.start();
}
}
splashscreen.xml
буде так
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="600px" android:layout_height="1024px"
android:background="#FF0000">
</RelativeLayout>
Splash Screnn, за замовчуванням, автоматично не робить Вашу програму більш професійною. Професійно розроблений екран Splash має можливість зробити ваш додаток більш професійним, але якщо ви не знаєте, як його написати, то наскільки професійним буде решта вашої програми.
Про єдину причину (виправдання) мати сплеск-екран - це те, що ви робите велику кількість розрахунків або чекаєте запуску GPS / WiFi, тому що ваша програма покладається на це до запуску. Без результату цих розрахунків або доступу до GPS / WiFi (тощо) ваша програма не загинула у воді, тому ви відчуваєте, що вам потрібен екран сплеску, і ОБОВ'ЯЗКОВО блокувати перегляд екрана для будь-яких інших запущених програм (включаючи фон ).
Такий екран сплеску повинен виглядати як ваша програма на весь екран, щоб створити враження, що він вже ініціалізований, після завершення тривалих обчислень можна буде заповнити остаточну інформацію (зображення налаштовано). Шанс того , що бути так чи що це єдиний спосіб , програма може бути розроблена могутній мала .
Було б краще дозволити Користувачеві (і решті ОС) зробити щось інше, поки вони чекають, а не спроектувати вашу Програму залежно від чогось, що займе певний час (коли тривалість очікування невизначена).
На вашому телефоні вже значки, які говорять про те, що запускається GPS / WiFi. Час або простір, зайнятий екраном сплеску, можна витратити на завантаження попередніх розрахунків або фактично на виконання розрахунків. Дивіться перше посилання нижче щодо проблем, які ви створюєте, і що потрібно враховувати.
Якщо ви абсолютно повинні зачекати цих розрахунків або GPS / WiFi, найкраще просто запустити додаток і мати спливаюче вікно, яке говорить про те, що потрібно чекати обчислень (ТЕКСТУАЛЬНЕ повідомлення про ініціалізацію) нормально). Очікується очікування GPS / WiFi (якщо вони вже не були включені в іншій програмі), тому оголошення про час очікування не потрібні.
Пам’ятайте, що коли екран Splash запускає, що ваша програма IS вже запущена, все, що ви робите, - це затягувати використання вашої програми та підтягувати CPU / GPU, щоб зробити щось, що більшість не вважає за потрібне.
Нам краще дійсно чекати і бачити ваш екран Splash кожен раз, коли ми запускаємо вашу програму, або ми не будемо відчувати, що це написано дуже професійно. Створення ПОВНОГО екрана Splash Screen і дубліката фактичного екрану програми (тому ми вважаємо, що він ініціалізований, коли насправді він не має) МОЖЕ досягти своєї мети (зробити вашу програму виглядати більш професійною), але я не став би багато на це ставити.
Чому б цього не зробити: http://cyrilmottier.com/2012/05/03/splash-screens-are-evil-dont-use-them/
Як це зробити: https://encrypted.google.com/search?q=Android+splash+screen+source
Тож є вагома причина цього не робити, але якщо ви впевнені, що ваша ситуація якимось чином не відповідає цим прикладам, тоді засоби для цього наведені вище. Будьте впевнені, що це дійсно робить вашу заявку більш професійною, або ви перемогли єдину причину, яку ви зробили для цього.
Це як канал YouTube, який починає кожне відео з тривалим графічним вступом (і Outro) або відчуває необхідність розповісти жарт або пояснити, що сталося за минулий тиждень (коли це не канал комедії чи LifeStyles). Просто покажіть шоу! (Просто запустіть програму).
Перш за все, відповіді дійсно дуже хороші. Але є проблеми витоку пам'яті. Ця проблема часто відома в Android-спільноті як "Витік активності" . Тепер що саме це означає?
Коли відбувається зміна конфігурації, наприклад зміна орієнтації, Android знищує Діяльність та відтворює її. Зазвичай, збирач сміття просто очистить виділену пам'ять старого екземпляра Activity, і ми всі хороші.
"Витік активності" посилається на ситуацію, коли збирач сміття не може очистити виділену пам'ять старого екземпляра Activity, оскільки це being (strong) referenced
від об'єкта, який жив екземпляром Activity. Кожен додаток для Android має певний об'єм пам'яті, виділений для нього. Коли Garbage Collector не зможе звільнити невикористану пам'ять, продуктивність програми поступово знизиться і в кінцевому підсумку вийде з OutOfMemory
ладу.
Як визначити, чи додаток просочує пам'ять чи ні? Найшвидший спосіб - відкрити вкладку «Пам'ять» в Android Studio і звернути увагу на виділену пам’ять під час зміни орієнтації. Якщо виділена пам'ять продовжує збільшуватися і ніколи не зменшується, то у вас є витік пам'яті.
1.Помітка протікає, коли користувач змінює орієнтацію.
Спочатку потрібно визначити екран заставки у splashscreen.xml
файлі ресурсу вашого макета
Приклад коду для дії на екрані заставки.
public class Splash extends Activity {
// 1. Create a static nested class that extends Runnable to start the main Activity
private static class StartMainActivityRunnable implements Runnable {
// 2. Make sure we keep the source Activity as a WeakReference (more on that later)
private WeakReference mActivity;
private StartMainActivityRunnable(Activity activity) {
mActivity = new WeakReference(activity);
}
@Override
public void run() {
// 3. Check that the reference is valid and execute the code
if (mActivity.get() != null) {
Activity activity = mActivity.get();
Intent mainIntent = new Intent(activity, MainActivity.class);
activity.startActivity(mainIntent);
activity.finish();
}
}
}
/** Duration of wait **/
private final int SPLASH_DISPLAY_LENGTH = 1000;
// 4. Declare the Handler as a member variable
private Handler mHandler = new Handler();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(icicle);
setContentView(R.layout.splashscreen);
// 5. Pass a new instance of StartMainActivityRunnable with reference to 'this'.
mHandler.postDelayed(new StartMainActivityRunnable(this), SPLASH_DISPLAY_LENGTH);
}
// 6. Override onDestroy()
@Override
public void onDestroy() {
// 7. Remove any delayed Runnable(s) and prevent them from executing.
mHandler.removeCallbacksAndMessages(null);
// 8. Eagerly clear mHandler allocated memory
mHandler = null;
}
}
Для отримання додаткової інформації перейдіть за цим посиланням
Зупинка на екрані заставки для 5-х 5-х зайвих не має особливого сенсу. Добре, якщо ви завантажуєте щось у фоновому режимі, дотримуйтесь цього підходу, щоб реалізувати екран сплеску: Реалізація екрана виплеску правильним способом трохи інша, ніж ви могли собі уявити. Вигляд сплеску, який ви бачите, повинен бути готовий негайно, навіть до того, як ви зможете надути файл макета під час своєї дії.
Таким чином, ви не будете використовувати файл макета. Замість цього вкажіть фон екрана заставки як фон теми діяльності. Для цього спочатку створіть XML, який можна малювати в res / dravable.
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:drawable="@color/gray"/>
<item>
<bitmap
android:gravity="center"
android:src="@mipmap/ic_launcher"/>
</item>
</layer-list>
Тут я встановив колір тла та зображення.
Далі ви встановите це як тло дії вашого сплеску в темі. Перейдіть до файлу styles.xml та додайте нову тему для вашої активності:
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
</style>
<style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
<item name="android:windowBackground">@drawable/background_splash</item>
</style>
</resources>
У новій програмі SplashTheme встановіть атрибут фону вікна для XML, який можна малювати. Налаштуйте це як тему вашої активності за допомогою сплеску в AndroidManifest.xml:
<activity
android:name=".SplashActivity"
android:theme="@style/SplashTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Нарешті, клас SplashActivity повинен просто переслати вас до вашої основної діяльності:
public class SplashActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
finish();
}
}
Детальніше читайте це: 1. https://www.bignerdranch.com/blog/splash-screens-the-right-way/ 2. http://blog.goodbarber.com/3-tips-to-create-a -great-splash-screen-for-your-mobile-app_a287.html
Тут повний код
SplashActivity.java
public class SplashActivity extends AppCompatActivity {
private final int SPLASH_DISPLAY_DURATION = 1000;
@Override
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
new Handler().postDelayed(new Runnable(){
@Override
public void run() {
Intent mainIntent = new Intent(SplashActivity.this,MainActivity.class);
SplashActivity.this.startActivity(mainIntent);
SplashActivity.this.finish();
}
}, SPLASH_DISPLAY_DURATION);
}}
У графічних ресурсах створіть цей bg_splash.xml
<?xml version="1.0" encoding="utf-8"?><layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:drawable="@color/app_color"/>
<item>
<bitmap
android:gravity="center"
android:src="@drawable/ic_in_app_logo_big"/>
</item></layer-list>
У styles.xml створіть власну тему
<style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
<item name="android:windowBackground">@drawable/bg_splash</item>
</style>
і нарешті в AndroidManifest.xml вкажіть тему своєї діяльності
<activity
android:name=".activities.SplashActivity"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:theme="@style/SplashTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Ура.
drawable
Екрани заставки не повинні завантажуватися з файлу макета, можливо, все-таки буде деяке відставання під час завантаження.
Найкращий спосіб - створити Тему саме для свого SplashScreenActivity та встановити ресурс, який the android:windowBackground
можна отримати.
https://www.bignerdranch.com/blog/splash-screens-the-right-way/
Коротко:
Заявіть про свій SplashScreenActivity у маніфесті:
<activity
android:name=".activities.SplashScreenActivity"
android:theme="@style/SplashTheme"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
У вашому SplashScreenActivity.java:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = new Intent(this, MainActivity_.class);
startActivity(intent);
finish();
}
Далі створіть ресурс для фонового вікна вашої теми:
<style name="SplashTheme" parent="Theme.Bumpfie.Base">
<item name="android:windowBackground">@drawable/splash</item>
</style>
Мальований файл splash.xml:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/white"/>
<item>
<bitmap
android:gravity="center"
android:src="@drawable/app_logo"/>
</item>
</layer-list>
Після Android Marshmallow , інше продуктивне використання екрана Splash, яке мені здається, вимагає необхідностіAndroid Permissions
на екрані сплеску вашого додатка.
Схоже, більшість додатків обробляють запит на дозвіл таким чином.
Діалоги мають поганий UIX, і вони порушують основний потік і змушують вас вирішувати час виконання, і правда, більшість користувачів може навіть не хвилюватись, якщо ваш додаток хоче щось написати на SD-карту. Деякі з них можуть навіть не зрозуміти, що ми намагаємося передати, поки ми не перекладемо це простою англійською мовою.
Запит дозволів за один раз зробить меншу кількість "якщо ще" перед кожною операцією, і ваш код виглядає безладним.
Це приклад того, як ви можете попросити дозволу у вашій діяльності з плесканням для пристроїв, на яких працює ОС Android 23+.
Якщо всі дозволи надано АБО вже надано АБО додаток працює на Pre Marshmallow ТОЛЬКО, просто перейдіть і покажіть основний вміст з невеликою затримкою на півсекунди, щоб користувач міг оцінити зусилля, які ми доклали, читаючи це питання, і намагаючись дати все можливе.
import android.Manifest;
import android.annotation.TargetApi;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;
import com.c2h5oh.beer.R;
import com.c2h5oh.beer.utils.Animatrix;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class SplashActivity extends AppCompatActivity {
final private int REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS = 124;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.splash);
//show animations
Animatrix.scale(findViewById(R.id.title_play), 100);
Animatrix.scale(findViewById(R.id.title_edit), 100);
Animatrix.scale(findViewById(R.id.title_record), 100);
Animatrix.scale(findViewById(R.id.title_share), 100);
if (Build.VERSION.SDK_INT >= 23) {
// Marshmallow+ Permission APIs
fuckMarshMallow();
} else {
// Pre-Marshmallow
///Display main contents
displaySplashScreen();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS: {
Map<String, Integer> perms = new HashMap<String, Integer>();
// Initial
perms.put(Manifest.permission.READ_EXTERNAL_STORAGE, PackageManager.PERMISSION_GRANTED);
perms.put(Manifest.permission.RECORD_AUDIO, PackageManager.PERMISSION_GRANTED);
perms.put(Manifest.permission.MODIFY_AUDIO_SETTINGS, PackageManager.PERMISSION_GRANTED);
perms.put(Manifest.permission.VIBRATE, PackageManager.PERMISSION_GRANTED);
// Fill with results
for (int i = 0; i < permissions.length; i++)
perms.put(permissions[i], grantResults[i]);
// Check for ACCESS_FINE_LOCATION
if (perms.get(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED
&& perms.get(Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED
&& perms.get(Manifest.permission.MODIFY_AUDIO_SETTINGS) == PackageManager.PERMISSION_GRANTED
&& perms.get(Manifest.permission.VIBRATE) == PackageManager.PERMISSION_GRANTED) {
// All Permissions Granted
// Permission Denied
Toast.makeText(SplashActivity.this, "All Permission GRANTED !! Thank You :)", Toast.LENGTH_SHORT)
.show();
displaySplashScreen();
} else {
// Permission Denied
Toast.makeText(SplashActivity.this, "One or More Permissions are DENIED Exiting App :(", Toast.LENGTH_SHORT)
.show();
finish();
}
}
break;
default:
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
@TargetApi(Build.VERSION_CODES.M)
private void fuckMarshMallow() {
List<String> permissionsNeeded = new ArrayList<String>();
final List<String> permissionsList = new ArrayList<String>();
if (!addPermission(permissionsList, Manifest.permission.READ_EXTERNAL_STORAGE))
permissionsNeeded.add("Read SD Card");
if (!addPermission(permissionsList, Manifest.permission.RECORD_AUDIO))
permissionsNeeded.add("Record Audio");
if (!addPermission(permissionsList, Manifest.permission.MODIFY_AUDIO_SETTINGS))
permissionsNeeded.add("Equilizer");
if (!addPermission(permissionsList, Manifest.permission.VIBRATE))
permissionsNeeded.add("Vibrate");
if (permissionsList.size() > 0) {
if (permissionsNeeded.size() > 0) {
// Need Rationale
String message = "App need access to " + permissionsNeeded.get(0);
for (int i = 1; i < permissionsNeeded.size(); i++)
message = message + ", " + permissionsNeeded.get(i);
showMessageOKCancel(message,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),
REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
}
});
return;
}
requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),
REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
return;
}
Toast.makeText(SplashActivity.this, "No new Permission Required- Launching App .You are Awesome!!", Toast.LENGTH_SHORT)
.show();
displaySplashScreen();
}
private void showMessageOKCancel(String message, DialogInterface.OnClickListener okListener) {
new AlertDialog.Builder(SplashActivity.this)
.setMessage(message)
.setPositiveButton("OK", okListener)
.setNegativeButton("Cancel", null)
.create()
.show();
}
@TargetApi(Build.VERSION_CODES.M)
private boolean addPermission(List<String> permissionsList, String permission) {
if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
permissionsList.add(permission);
// Check for Rationale Option
if (!shouldShowRequestPermissionRationale(permission))
return false;
}
return true;
}
/**
* Display main content with little delay just so that user can see
* efforts I put to make this page
*/
private void displaySplashScreen() {
new Handler().postDelayed(new Runnable() {
/*
* Showing splash screen with a timer. This will be useful when you
* want to show case your app logo / company
*/
@Override
public void run() {
startActivity(new Intent(SplashActivity.this, AudioPlayerActivity.class));
finish();
}
}, 500);
}
}
ви не будете використовувати файл макета. Замість цього вкажіть фон екрана заставки як фон теми діяльності. Для цього спочатку створіть XML, який можна малювати в Res / Dravable.
Примітка: весь код нижче доступний GitHub Link
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:drawable="@color/gray"/>
<item>
<bitmap
android:gravity="center"
android:src="@mipmap/ic_launcher"/>
</item>
</layer-list>
Тут я встановив колір тла та зображення.
Далі ви встановите це як тло дії вашого сплеску в темі. Перейдіть до файлу styles.xml та додайте нову тему для вашої активності:
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
</style>
<style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
<item name="android:windowBackground">@drawable/background_splash</item>
</style>
</resources>
У новій програмі SplashTheme встановіть атрибут фону вікна для XML, який можна малювати. Налаштуйте це як тему вашої активності за допомогою сплеску в AndroidManifest.xml:
<activity
android:name=".SplashActivity"
android:theme="@style/SplashTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Нарешті, ваш клас SplashActivity повинен просто переслати вас до вашої основної діяльності:
public class SplashActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
finish();
}
}
Зверніть увагу, що ви навіть не налаштували подання для цієї SplashActivity. Погляд виходить з теми. Коли ви налаштуєте інтерфейс користувача для вашої активності в темі, він доступний негайно.
Якщо у вас був файл компонування для вашої активності, то цей файл макета буде видно користувачеві лише після повної ініціалізації вашої програми, що занадто пізно. Ви хочете, щоб сплеск відображався лише за той невеликий проміжок часу до ініціалізації програми.
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Thread t=new Thread()
{
public void run()
{
try {
sleep(2000);
finish();
Intent cv=new Intent(MainActivity.this,HomeScreen.class/*otherclass*/);
startActivity(cv);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
};
t.start();
}
Створіть активність, давайте нам активність під назвою "A", а потім створимо XML-файл під назвою myscreen.xml, який встановить зображення екрана сплеску як фон, а потім скористайтеся таймером зворотного відліку для переходу від одного Activtity до іншого. Щоб знати, як користуватися таймером підрахунку, дивіться мою відповідь на це питання TimerTask в Android?
Приклад екранізації екрана:
public class MainActivity extends Activity {
private ImageView splashImageView;
boolean splashloading = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
splashImageView = new ImageView(this);
splashImageView.setScaleType(ScaleType.FIT_XY);
splashImageView.setImageResource(R.drawable.ic_launcher);
setContentView(splashImageView);
splashloading = true;
Handler h = new Handler();
h.postDelayed(new Runnable() {
public void run() {
splashloading = false;
setContentView(R.layout.activity_main);
}
}, 3000);
}
}
Екран сплеску - це трохи непридатний об’єкт в Android: його не можна завантажувати якнайшвидше для приховування затримки запуску основної діяльності. Для його використання є дві причини: реклама та мережеві операції.
Реалізація як діалогове вікно дозволяє невідкладно переходити з екрану заставки до основного інтерфейсу діяльності.
public class SplashDialog extends Dialog {
ImageView splashscreen;
SplashLoader loader;
int splashTime = 4000;
public SplashDialog(Context context, int theme) {
super(context, theme);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
setCancelable(false);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
cancel();
}
}, splashTime);
}
}
Макет:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@color/white">
<ImageView
android:id="@+id/splashscreen"
android:layout_width="190dp"
android:layout_height="190dp"
android:background="@drawable/whistle"
android:layout_centerInParent="true" />
</RelativeLayout>
І почніть:
public class MyActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getIntent().getCategories() != null && getIntent().getCategories().contains("android.intent.category.LAUNCHER")) {
showSplashScreen();
}
}
protected Dialog splashDialog;
protected void showSplashScreen() {
splashDialog = new SplashDialog(this, R.style.SplashScreen);
splashDialog.show();
}
...
}
Інший підхід досягається за допомогою CountDownTimer
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.splashscreen);
new CountDownTimer(5000, 1000) { //5 seconds
public void onTick(long millisUntilFinished) {
mTextField.setText("seconds remaining: " + millisUntilFinished / 1000);
}
public void onFinish() {
startActivity(new Intent(SplashActivity.this, MainActivity.class));
finish();
}
}.start();
}
- Add in SplashActivity
public class SplashActivity extends Activity {
private ProgressBar progressBar;
int i=0;
Context context;
private GoogleApiClient googleApiClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
context = this;
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
startActivity(new Intent(Splash.this, LoginActivity.class));
finish();
}
}, 2000);
}
}
- Add in activity_splash.xml
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:custom="http://schemas.android.com/apk/res-auto"
android:background="@color/colorAccent"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Splash">
<ImageView
android:id="@+id/ivLogo"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@mipmap/icon_splash"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"/>
<ProgressBar
android:id="@+id/circle_progress"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="5dp"
android:max="100"
android:progressTint="@color/green"
android:visibility="visible" />
</RelativeLayout>
- Add in AndroidManifest.xml
<activity android:name="ex.com.SplashActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Насправді легкий підхід & gr8
Спочатку створіть свій сплеск за допомогою наступного веб-сайту:
https://www.norio.be/android-feature-graphic-generator/
Виберіть свій логотип та слоган, оберіть своє гарне тло. змінити розмір до 4096x4096.
Тепер завантажте цю картинку та оновіть її:
https://apetools.webprofusion.com/app/#/tools/imagegorilla
І генерувати всі необхідні екрани, всі пристрої, всі платформи.
Насолоджуйтесь!
Тут є достатньо відповідей, які допоможуть у реалізації. ця публікація мала на меті допомогти іншим на першому кроці створення екрана!
Як щодо супер-гнучкого екрана запуску, який може використовувати той самий код і визначений в AndroidManifest.xml, тому код ніколи не потрібно буде змінювати. Я зазвичай розробляю бібліотеки коду і не люблю налаштування коду, тому що він неохайний.
<activity
android:name=".SplashActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="launch_class" android:value="com.mypackage.MyFirstActivity" />
<meta-data android:name="duration" android:value="5000" />
</activity>
Тоді SpashActivity сам шукає метадані для "start_class", щоб потім зробити сам Намір. Метадані "тривалість" визначає, як довго залишається екран сплеску.
public class SplashActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.activity_splash);
ComponentName componentName = new ComponentName(this, this.getClass());
try {
Bundle bundle = null;
bundle = getPackageManager().getActivityInfo(componentName, PackageManager.GET_META_DATA).metaData;
String launch_class = bundle.getString("launch_class");
//default of 2 seconds, otherwise defined in manifest
int duration = bundle.getInt("duration", 2000);
if(launch_class != null) {
try {
final Class<?> c = Class.forName(launch_class);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
Intent intent = new Intent(SplashActivity.this, c);
startActivity(intent);
finish();
}
}, duration);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
}
}
Іноді користувач відкрити SplashActivity
і вийти відразу , але додаток по- , як і раніше йти MainActivity
після SPLASH_SCREEN_DISPLAY_LENGTH
.
Для запобігання: SplashActivity
Ви повинні перевірити SplashActivity
завершення чи ні перед тим, як перейти доMainActivity
public class SplashActivity extends Activity {
private final int SPLASH_SCREEN_DISPLAY_LENGTH = 2000;
@Override
public void onCreate(Bundle icicle) {
...
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
if (!isFinishing()) {//isFinishing(): If the activity is finishing, returns true; else returns false.
startActivity(new Intent(SplashActivity.this, MainActivity.class));
finish();
}
}, SPLASH_SCREEN_DISPLAY_LENGTH);
}
}
}
Сподіваюся, що це допоможе
Хоча є хороші відповіді, я покажу рекомендований google спосіб:
1) Спершу створіть Theme
екран для сплеску: у вас є тема, яка називається splashscreenTheme
, вашою темою запуску буде:
<style name="splashscreenTheme">
<item name="android:windowBackground">@drawable/launch_screen</item>
</style>
Примітка:
android:windowBackground
вже встановлює ваше зображення splashscreen
потрібно робити це знову в інтерфейсі.
тут також можна використовувати колір замість рисувального.
2) Встановіть тему як маніфест splashscreenActivity
<activity
android:name=".activity.splashscreenActivity"
android:screenOrientation="portrait"
android:theme="@style/splashscreenTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
3) переконайтеся, що запуск_екрана drawable
не знаходиться в drawable
папці, якщо зображення не мало.
Це призведе до швидшого запуску екрана запуску і вбереже вас від чорного екрану
Це також дозволяє уникнути зайвого перевитрати
Це найкращий пост, який я бачив на екранах заставки: http://saulmm.github.io/avoding-android-cold-starts
Саул Молінеро розбирається у двох різних варіантах екрану заставки: Користуючись перевагою фону вікна для анімації на початковому екрані та відображення користувальницького інтерфейсу заповнювача (який є популярним вибором, який Google використовує для більшості своїх додатків у наші дні).
Я посилаюсь на цю посаду кожен раз, коли мені потрібно враховувати час холодного старту та уникати відключення користувачів через довгі час запуску.
Сподіваюся, це допомагає!
У моєму випадку я не хотів створювати нову діяльність лише для того, щоб показати зображення протягом 2 секунд. Під час запуску моїх MainAvtivity
зображень завантажуються у тримачі за допомогою пікассо, я знаю, що на це потрібно близько 1 секунди, тому я вирішив зробити наступне у своїй MainActivity OnCreate
:
splashImage = (ImageView) findViewById(R.id.spllll);
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
int secondsDelayed = 1;
new Handler().postDelayed(new Runnable() {
public void run() {
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
splashImage.setVisibility(View.GONE);
}
}, secondsDelayed * 2000);
Під час запуску програми перше, що трапляється, ImageView
відображається, а статусBar видаляється, встановивши прапори вікна на весь екран. Потім я використав a Handler
для запуску протягом 2 секунд, через 2 секунди я очистив прапори на весь екран і встановив видимість ImageView
для GONE
. Легко, просто, ефективно.
Це дійсно просто в Android, ми просто використовуємо оброблювальну концепцію для реалізації екрана заставки
У свій Java-файл SplashScreenActivity вставте цей код.
У XML-файл SplashScreenActivity розмістіть будь-яке зображення за допомогою перегляду зображень.
public void LoadScreen() {
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
Intent i = new Intent(SplashScreenActivity.this, AgilanbuGameOptionsActivity.class);
startActivity(i);
}
}, 2000);
}
Ви можете додати це у своєму методі onCreate
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
// going to next activity
Intent i=new Intent(SplashScreenActivity.this,MainActivity.class);
startActivity(i);
finish();
}
},time);
І ініціалізуйте своє значення часу в мілісекундах, як вам хочеться ...
private static int time=5000;
для більш детальної інформації завантажте повний код за цим посиланням ...
У Котліні напишіть цей код: -
Handler().postDelayed({
val mainIntent = Intent(this@SplashActivity, LoginActivity::class.java)
startActivity(mainIntent)
finish()
}, 500)
Сподіваюся, це допоможе вам. Дякую ........
public class SplashActivity extends Activity {
Context ctx;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ctx = this;
setContentView(R.layout.activity_splash);
Thread thread = new Thread(){
public void run(){
try {
sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Intent in = new Intent(ctx,MainActivity.class);
startActivity(in);
finish();
}
};
thread.start();
}
}