Saya ingin membuat aplikasi saya terlihat lebih profesional, jadi saya memutuskan untuk membuat splash screen.
Bagaimana saya membuatnya dan kemudian mengimplementasikannya?
Saya ingin membuat aplikasi saya terlihat lebih profesional, jadi saya memutuskan untuk membuat splash screen.
Bagaimana saya membuatnya dan kemudian mengimplementasikannya?
Jawaban:
Bacaan lebih lanjut:
Jawaban lama:
CARA : Layar splash sederhana
Jawaban ini menunjukkan kepada Anda bagaimana menampilkan layar splash untuk waktu yang tetap ketika aplikasi Anda mulai karena alasan merek. Misalnya Anda mungkin memilih untuk menampilkan layar splash selama 3 detik. Namun jika Anda ingin menampilkan layar spash untuk jumlah waktu yang bervariasi (mis. Waktu startup aplikasi), Anda harus memeriksa jawaban Abdullah https://stackoverflow.com/a/15832037/401025 . Namun perlu diketahui bahwa startup aplikasi mungkin sangat cepat pada perangkat baru sehingga pengguna hanya akan melihat flash yang UX buruk.
Pertama, Anda perlu menentukan layar spash di layout.xml
file Anda
<?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>
Dan aktivitas Anda:
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);
}
}
Itu saja ;)
SPLASH_DISPLAY_LENGTH
waktu. Anda harus melakukan ini sebagai gantinya: bignerdranch.com/blog/splash-screens-the-right-way
Catatan solusi ini tidak akan membiarkan pengguna menunggu lebih lama: penundaan layar splash tergantung pada waktu mulai aplikasi.
Ketika Anda membuka aplikasi Android apa pun yang Anda dapatkan secara default layar hitam apa saja dengan judul dan ikon aplikasi di atas, Anda dapat mengubahnya dengan menggunakan gaya / tema.
Pertama, buat style.xml di folder values dan tambahkan style ke dalamnya.
<style name="splashScreenTheme" parent="@android:style/Theme.DeviceDefault.Light.NoActionBar">
<item name="android:windowBackground">@drawable/splash_screen</item>
</style>
Alih-alih menggunakan @android:style/Theme.DeviceDefault.Light.NoActionBar
Anda dapat menggunakan tema lain sebagai orangtua.
Kedua, di aplikasi Anda Manifest.xml tambahkan android:theme="@style/splashScreenTheme"
ke aktivitas utama Anda.
<activity
android:name="MainActivity"
android:label="@string/app_name"
android:theme="@style/splashScreenTheme" >
Ketiga, Perbarui tema Anda di aktivitas peluncuran onCreate () Anda.
protected void onCreate(Bundle savedInstanceState) {
// Make sure this is before calling super.onCreate
setTheme(R.style.mainAppTheme);
super.onCreate(savedInstanceState);
}
PEMBARUAN Lihat pos ini .
Terima kasih kepada @ mat1h dan @adelriosantiago
<item name="android:background">
akan menimpa windowBackground
. Dan tanpa android:background
ditentukan, latar belakang saya di setiap fragmen akan transparan mengungkapkan aktivitas di balik konten latar depan.
Splash.java Anda mungkin terlihat seperti ini:
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);
}
}
ubah ActivityB.class
ke aktivitas apa pun yang ingin Anda mulai setelah layar splash
periksa file manifes Anda dan akan terlihat seperti
<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>
Jawaban di atas sangat bagus, tetapi saya ingin menambahkan sesuatu yang lain. Saya baru mengenal Android, saya menemui masalah ini selama pengembangan saya. Semoga ini bisa membantu orang seperti saya.
Layar Splash adalah titik masuk aplikasi saya, jadi tambahkan baris berikut di 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>
Layar splash seharusnya hanya muncul sekali dalam siklus hidup aplikasi, saya menggunakan variabel boolean untuk merekam keadaan layar splash, dan hanya menampilkannya pada pertama kali.
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();
}
}
}
selamat coding!
android:noHistory="true"
di AndroidManifest.xml
untuk mencegah pengguna dari akan kembali ke splash screen menggunakan tombol kembali.
Jawaban Abdullah sangat bagus. Tetapi saya ingin menambahkan lebih banyak detail dengan jawaban saya.
Menerapkan Layar Splash
Mengimplementasikan splash screen dengan cara yang benar sedikit berbeda dari yang Anda bayangkan. Tampilan splash yang Anda lihat harus siap segera, bahkan sebelum Anda dapat mengembang file tata letak dalam aktivitas splash Anda.
Jadi Anda tidak akan menggunakan file layout. Alih-alih, tentukan latar belakang layar splash Anda sebagai latar belakang tema aktivitas. Untuk melakukan ini, pertama buat XML drawable di res / drawable.
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>
Itu hanya daftar layer dengan logo dalam warna latar belakang tengah dengannya.
Sekarang buka styles.xml dan tambahkan gaya ini
<style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
<item name="android:windowBackground">@drawable/background_splash</item>
</style>
Tema ini harus actionbar dan dengan latar belakang yang baru saja kita buat di atas.
Dan dalam manifes Anda perlu mengatur SplashTheme ke aktivitas yang ingin Anda gunakan sebagai splash.
<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>
Kemudian di dalam kode aktivitas Anda navigasikan pengguna ke layar tertentu setelah splash menggunakan niat.
public class SplashActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
finish();
}
}
Itu cara yang tepat untuk dilakukan. Saya menggunakan referensi ini untuk menjawab.
YouTube
hal ini. Tapi saya pikir ukuran bitmap akan menjadi masalah karena Anda tidak dapat mengubah ukurannya menggunakan layer-list
.
Buat sebuah 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
akan seperti ini
<?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, secara default, tidak secara otomatis membuat Aplikasi Anda terlihat lebih profesional. Layar Splash yang dirancang secara profesional memiliki kemungkinan membuat Aplikasi Anda terlihat lebih profesional, tetapi jika Anda tidak tahu cara menulisnya, seberapa profesionalkah sisa Aplikasi Anda yang sebenarnya.
Satu-satunya alasan (alasan) untuk memiliki Layar Splash adalah karena Anda melakukan Perhitungan dalam jumlah besar atau sedang menunggu GPS / WiFi untuk memulai karena Aplikasi Anda bergantung pada itu sebelum mulai. Tanpa hasil Perhitungan atau akses ke GPS / WiFi (dll.) Aplikasi Anda mati dalam air, sehingga Anda merasa Anda memerlukan Splash Screen, dan HARUS memblokir tampilan Layar untuk Program yang sedang berjalan lainnya (termasuk Latar Belakang) ).
Seperti Layar Splash seharusnya terlihat seperti Aplikasi Layar Penuh Anda untuk memberi kesan bahwa itu telah diinisialisasi, maka setelah perhitungan panjang selesai rincian final bisa diisi (Gambar di-tweak). The kesempatan itu menjadi kasus atau bahwa itu adalah satu-satunya cara Program dapat dirancang perkasa kecil .
Akan lebih baik untuk memungkinkan Pengguna (dan seluruh OS) untuk melakukan sesuatu yang lain sementara mereka menunggu daripada merancang Program Anda untuk bergantung pada sesuatu yang akan memakan waktu cukup lama (ketika durasi menunggu tidak pasti).
Sudah ada Ikon di Ponsel Anda yang mengatakan bahwa GPS / WiFi mulai. Waktu atau ruang yang digunakan oleh Layar Splash dapat dihabiskan untuk memuat pra-perhitungan atau benar-benar melakukan Perhitungan. Lihat Tautan pertama di bawah ini untuk masalah yang Anda buat dan apa yang harus dipertimbangkan.
Jika Anda benar-benar harus menunggu Perhitungan atau GPS / WiFi ini, sebaiknya biarkan Aplikasi dimulai dan pop-up yang mengatakan bahwa perlu menunggu Perhitungan (Pesan "Inisialisasi" TEKSUAL baik-baik saja). Tunggu untuk GPS / WiFi diharapkan (jika mereka belum diaktifkan di Program lain) sehingga mengumumkan waktu tunggu mereka tidak perlu.
Ingatlah bahwa ketika Layar Splash memulai Program Anda sudah benar-benar berjalan, yang Anda lakukan hanyalah menunda penggunaan Program Anda dan memonopoli CPU / GPU untuk melakukan sesuatu yang sebagian besar merasa tidak perlu.
Sebaiknya kita benar-benar ingin menunggu dan melihat Layar Splash Anda setiap kali kami memulai Program Anda atau KAMI tidak akan merasa itu ditulis secara profesional. Membuat Layar Splash FULL Screen dan duplikat dari Layar Program yang sebenarnya (jadi kami pikir itu diinisialisasi padahal sebenarnya belum) MUNGKIN mencapai tujuan Anda (membuat Program Anda terlihat lebih profesional) tetapi saya tidak akan bertaruh banyak untuk itu.
Mengapa tidak melakukannya: http://cyrilmottier.com/2012/05/03/splash-screens-are-evil-dont-use-them/
Bagaimana melakukannya: https://encrypted.google.com/search?q=Android+splash+screen+source
Jadi ada alasan bagus untuk tidak melakukannya tetapi JIKA Anda yakin bahwa bagaimanapun keadaan Anda berada di luar contoh-contoh itu maka sarana untuk melakukannya diberikan di atas. Pastikan itu benar-benar membuat Aplikasi Anda terlihat lebih profesional atau Anda telah mengalahkan satu-satunya alasan yang Anda berikan untuk melakukan ini.
Ini seperti Saluran YouTube yang memulai setiap Video dengan Intro Grafis yang panjang (dan Outro) atau merasa perlu untuk menceritakan Lelucon atau menjelaskan apa yang terjadi selama seminggu terakhir (ketika itu bukan Saluran Komedi atau LifeStyles). Tunjukkan saja acaranya! (Jalankan saja Program).
Di atas semua jawaban benar-benar sangat baik. Tapi ada masalah kebocoran memori. Masalah ini sering dikenal di komunitas Android sebagai "Membocorkan Aktivitas" . Sekarang apa sebenarnya artinya?
Ketika perubahan konfigurasi terjadi, seperti perubahan orientasi, Android menghancurkan Activity dan membuatnya kembali. Biasanya, Pengumpul Sampah hanya akan menghapus memori yang dialokasikan dari instance Activity lama dan kita semua baik-baik saja.
"Membocorkan Aktivitas" mengacu pada situasi di mana Pengumpul Sampah tidak dapat menghapus memori yang dialokasikan dari instance Aktivitas lama karena being (strong) referenced
berasal dari objek yang menjalankan instance Activity. Setiap aplikasi Android memiliki jumlah memori tertentu yang dialokasikan untuk itu. Ketika Pengumpul Sampah tidak dapat membebaskan memori yang tidak digunakan, kinerja aplikasi akan berkurang secara bertahap dan akhirnya rusak karena OutOfMemory
kesalahan.
Bagaimana cara menentukan apakah aplikasi bocor memori atau tidak? Cara tercepat adalah membuka tab Memori di Android Studio dan memperhatikan memori yang dialokasikan saat Anda mengubah orientasi. Jika memori yang dialokasikan terus meningkat dan tidak pernah berkurang maka Anda memiliki kebocoran memori.
1. Memori bocor ketika pengguna mengubah orientasi.
Pertama, Anda perlu menentukan layar splash di splashscreen.xml
file sumber daya tata letak Anda
Kode Sampel untuk aktivitas layar splash.
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;
}
}
Untuk informasi lebih lanjut silakan kunjungi tautan ini
Berhenti pada layar Splash untuk 4's 5 tidak perlu terlalu masuk akal. Tidak apa-apa jika Anda memuat sesuatu di latar belakang lain ikuti pendekatan ini untuk menerapkan splash screen: - Menerapkan splash screen dengan cara yang benar sedikit berbeda dari yang Anda bayangkan. Tampilan splash yang Anda lihat harus siap segera, bahkan sebelum Anda dapat mengembang file tata letak dalam aktivitas splash Anda.
Jadi Anda tidak akan menggunakan file layout. Alih-alih, tentukan latar belakang layar splash Anda sebagai latar belakang tema aktivitas. Untuk melakukan ini, pertama, buat XML drawable di res / drawable.
<?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>
Di sini, saya telah mengatur warna latar belakang dan gambar.
Selanjutnya, Anda akan mengatur ini sebagai latar belakang aktivitas splash Anda dalam tema. Navigasikan ke file styles.xml Anda dan tambahkan tema baru untuk aktivitas splash Anda:
<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>
Di SplashTheme baru Anda, atur atribut latar belakang jendela ke XML Anda yang dapat digambar. Konfigurasikan ini sebagai tema aktivitas splash Anda di AndroidManifest.xml Anda:
<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>
Akhirnya, kelas SplashActivity seharusnya hanya meneruskan Anda ke aktivitas utama Anda:
public class SplashActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
finish();
}
}
Lebih detail baca ini: 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
Ini kode lengkapnya di sini
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);
}}
Di drawables buat bg_splash.xml ini
<?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>
Di styles.xml buat tema khusus
<style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
<item name="android:windowBackground">@drawable/bg_splash</item>
</style>
dan akhirnya di AndroidManifest.xml tentukan tema untuk aktivitas Anda
<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>
Bersulang.
drawable
Layar splash tidak boleh dimuat dari file tata letak, mungkin masih ada jeda saat memuatnya.
Cara terbaik adalah membuat Tema hanya untuk SplashScreenActivity Anda dan atur the android:windowBackground
ke sumber daya yang dapat ditarik.
https://www.bignerdranch.com/blog/splash-screens-the-right-way/
Pendeknya:
Nyatakan SplashScreenActivity Anda di manifes:
<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>
Di SplashScreenActivity.java Anda:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = new Intent(this, MainActivity_.class);
startActivity(intent);
finish();
}
Selanjutnya buat sumber daya untuk jendela latar belakang tema Anda:
<style name="SplashTheme" parent="Theme.Bumpfie.Base">
<item name="android:windowBackground">@drawable/splash</item>
</style>
File splash.xml yang dapat digambar:
<?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>
Setelah Android Marshmallow , penggunaan Splash screen Produktif lainnya yang saya pikirkan adalah permintaan yang diperlukanAndroid Permissions
di layar splash aplikasi Anda.
sepertinya sebagian besar aplikasi menangani permintaan izin dengan cara ini.
Dialog membuat UIX buruk dan mereka memutuskan aliran utama dan membuat Anda memutuskan runtime dan kebenarannya adalah sebagian besar pengguna bahkan mungkin tidak peduli jika aplikasi Anda ingin menulis sesuatu pada kartu SD. Beberapa dari mereka bahkan mungkin tidak mengerti apa yang ingin kami sampaikan sampai kami menerjemahkannya dalam bahasa Inggris.
Meminta izin sekaligus membuat jumlah "jika lain" lebih sedikit sebelum setiap operasi dan membuat kode Anda terlihat berantakan.
Ini adalah contoh bagaimana Anda dapat meminta izin dalam aktivitas splash Anda untuk perangkat yang menjalankan Android OS 23+.
Jika semua izin diberikan ATAU sudah diberikan ATAU aplikasi berjalan pada Pre Marshmallow LALU pergi dan tampilkan konten utama dengan sedikit jeda setengah detik sehingga pengguna dapat menghargai upaya yang kami lakukan dalam membaca pertanyaan ini dan berusaha memberikan yang terbaik.
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);
}
}
Anda tidak akan menggunakan file tata letak. Alih-alih, tentukan latar belakang layar splash Anda sebagai latar belakang tema aktivitas. Untuk melakukan ini, pertama buat XML drawable di res / drawable.
Catatan: semua kode di bawah ini tersedia Tautan GitHub
<?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>
Di sini, saya telah mengatur warna latar belakang dan gambar.
Selanjutnya, Anda akan mengatur ini sebagai latar belakang aktivitas splash Anda dalam tema. Navigasikan ke file styles.xml Anda dan tambahkan tema baru untuk aktivitas splash Anda:
<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>
Di SplashTheme baru Anda, atur atribut latar belakang jendela ke XML Anda yang dapat digambar. Konfigurasikan ini sebagai tema aktivitas splash Anda di AndroidManifest.xml Anda:
<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>
Terakhir, kelas SplashActivity Anda hanya perlu meneruskan aktivitas utama Anda:
public class SplashActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
finish();
}
}
Perhatikan bahwa Anda bahkan tidak mengatur tampilan untuk SplashActivity ini. Tampilannya berasal dari tema. Ketika Anda mengatur UI untuk aktivitas splash Anda di tema, itu tersedia segera.
Jika Anda memang memiliki file tata letak untuk aktivitas splash Anda, file tata letak itu hanya akan terlihat oleh pengguna setelah aplikasi Anda sepenuhnya diinisialisasi, yang sudah terlambat. Anda ingin splash hanya ditampilkan dalam waktu yang sedikit sebelum aplikasi diinisialisasi.
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();
}
Buat Aktivitas, beri kami Aktivitas bernama 'A', lalu buat file xml bernama myscreen.xml, dengan menetapkan gambar layar splash sebagai latar belakang, lalu gunakan penghitung waktu mundur untuk bernavigasi dari satu Aktivitas ke Aktivitas lainnya. Untuk mengetahui cara menggunakan penghitung waktu mundur, lihat jawaban saya di pertanyaan ini TimerTask di Android?
Contoh layar splash:
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);
}
}
Layar splash adalah objek yang tidak dapat digunakan di Android: layar tidak dapat dimuat sesegera mungkin untuk menyembunyikan penundaan dimulainya aktivitas utama. Ada dua alasan untuk menggunakannya: iklan dan operasi jaringan.
Implementasi sebagai dialog membuat lompatan tanpa penundaan dari splash screen ke UI aktivitas utama.
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);
}
}
Tata letak:
<?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>
Dan mulai:
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();
}
...
}
Pendekatan lain dicapai dengan menggunakan 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>
Sangat mudah & pendekatan gr8:
Pertama buat splash Anda dengan situs web berikut:
https://www.norio.be/android-feature-graphic-generator/
Pilih logo dan slogan Anda, pilih latar belakang Anda yang cantik. ubah ukurannya menjadi 4096x4096.
Sekarang unduh gambar itu dan uplodate ke:
https://apetools.webprofusion.com/app/#/tools/imagegorilla
Dan hasilkan semua layar splash yang dibutuhkan, semua perangkat, semua platform.
Nikmati!
Ada cukup banyak jawaban di sini yang akan membantu implementasi. posting ini dimaksudkan untuk membantu orang lain dengan langkah pertama membuat layar splash!
Bagaimana dengan layar peluncuran super fleksibel yang dapat menggunakan kode yang sama dan ditentukan di AndroidManifest.xml, sehingga kode tidak perlu diubah. Saya biasanya mengembangkan pustaka kode dan tidak suka mengkustomisasi kode karena ceroboh.
<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>
Kemudian SpashActivity sendiri mencari meta-data untuk "launch_class" untuk kemudian membuat Intent itu sendiri. "Durasi" data meta menentukan berapa lama layar splash tetap.
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();
}
}
}
Kadang-kadang pengguna membuka SplashActivity
dan berhenti segera tetapi aplikasi masih MainActivity
mengejar SPLASH_SCREEN_DISPLAY_LENGTH
.
Untuk mencegahnya: SplashActivity
Anda harus memeriksa apakah SplashActivity
sudah selesai atau belum sebelum pindah keMainActivity
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);
}
}
}
Semoga bantuan ini
Meskipun ada jawaban yang bagus, saya akan menunjukkan cara yang disarankan google:
1) Pertama buat Theme
layar splash: Anda memiliki tema yang disebut splashscreenTheme
, tema peluncur Anda akan:
<style name="splashscreenTheme">
<item name="android:windowBackground">@drawable/launch_screen</item>
</style>
catatan:
android:windowBackground
sudah menetapkan gambar splashscreen Anda tidak
perlu melakukan ini di UI lagi.
Anda juga bisa menggunakan warna di sini alih-alih yang bisa digambar.
2) Atur tema untuk memanifestasikan 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) pastikan Anda launch_screen drawable
tidak ada dalam drawable
folder jika gambar Anda tidak kecil.
Ini akan menghasilkan lebih cepat memulai layar mulai dan menyelamatkan Anda dari layar hitam
Ini juga menghindari penarikan berlebih
Ini adalah pos terbaik yang pernah saya lihat di layar splash: http://saulmm.github.io/avoding-android-cold-starts
Saúl Molinero menggunakan dua opsi berbeda untuk splash screen: Manfaatkan latar belakang jendela untuk menghidupkan layar awal Anda dan menampilkan UI placeholder (yang merupakan pilihan populer yang digunakan Google untuk sebagian besar aplikasi mereka hari ini).
Saya merujuk posting ini setiap kali saya perlu mempertimbangkan waktu mulai dingin dan menghindari dropoff pengguna karena waktu startup yang lama.
Semoga ini membantu!
Dalam kasus saya, saya tidak ingin membuat Aktivitas baru hanya untuk menampilkan gambar selama 2 detik. Saat memulai MainAvtivity
, gambar dimuat ke pemegang menggunakan picasso, saya tahu ini membutuhkan waktu sekitar 1 detik untuk memuat jadi saya memutuskan untuk melakukan hal berikut di dalam MainActivity saya 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);
Ketika memulai aplikasi, hal pertama yang terjadi adalah ImageView
ditampilkan dan statusBar dihapus dengan mengatur bendera jendela ke layar penuh. Lalu saya menggunakan a Handler
untuk menjalankan selama 2 detik, setelah 2 detik saya menghapus bendera layar penuh dan mengatur visibilitas ImageView
ke GONE
. Mudah, sederhana, efektif.
Sangat sederhana di android kami hanya menggunakan konsep handler untuk mengimplementasikan splash screen
Di file java SplashScreenActivity Anda rekatkan kode ini.
Dalam file xml SplashScreenActivity Anda, letakkan gambar apa pun menggunakan imageview.
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);
}
Anda dapat menambahkan ini di Metode onCreate Anda
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);
Dan inisialisasi nilai waktu Anda dalam milidetik seperti yang Anda inginkan ...
private static int time=5000;
untuk lebih detail unduh kode lengkap dari tautan ini ...
Di Kotlin tulis kode ini: -
Handler().postDelayed({
val mainIntent = Intent(this@SplashActivity, LoginActivity::class.java)
startActivity(mainIntent)
finish()
}, 500)
Semoga ini bisa membantu Anda. Terima kasih ........
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();
}
}