私は自分のアプリをよりプロフェッショナルに見せたいと思ったので、スプラッシュスクリーンを作りたいと思った。
それをどのように作成してから実装するのですか。
参考文献:
古い答え:
HOW TO : シンプルスプラッシュスクリーン
この回答は、アプリの起動時にスプラッシュ画面を一定時間表示する方法を示しています。ブランドの理由例えば。あなたは3秒間スプラッシュスクリーンを表示することを選択するかもしれません。ただし、spash画面をさまざまな時間(アプリの起動時間など)表示したい場合は、Abdullah's answer https://stackoverflow.com/a/15832037/401025 を確認してください。ただし、新しいデバイスではアプリの起動が非常に高速になる可能性があるため、ユーザーにはUXの悪いフラッシュが表示されます。
最初にあなたのlayout.xml
ファイルでspashスクリーンを定義する必要があります
<?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);
}
}
それで全部です ;)
この解決法はユーザがそれ以上待たないようにすることに注意してください: スプラッシュスクリーンの遅延はアプリケーションの起動時間に依存します。
Androidアプリを開くと、デフォルトでアプリのタイトルとアイコンが上部に黒い画面が表示されますが、スタイル/テーマを使用してそれを変更できます。
まず、valuesフォルダーに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
を使う代わりに、他のテーマを親として使うことができます。
次に、App Manifest.xmlでメインアクティビティにAndroid:theme="@style/splashScreenTheme"
を追加します。
<activity
Android:name="MainActivity"
Android:label="@string/app_name"
Android:theme="@style/splashScreenTheme" >
3つ目は、onCreate()起動アクティビティでテーマを更新します。
protected void onCreate(Bundle savedInstanceState) {
// Make sure this is before calling super.onCreate
setTheme(R.style.mainAppTheme);
super.onCreate(savedInstanceState);
}
_ update _ この投稿をチェックする https://plus.google.com/+AndroidDevelopers/posts/Z1Wwainpjhd @ mat1hと@adelriosantiagoに感謝
あなたの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>
@ Abdullahの答えは正しいですが、Googleはあなたの活動のテーマを変えずにこれを適切に実装する方法に関する詳細な説明を投稿しました:
https://plus.google.com/+AndroidDevelopers/posts/Z1Wwainpjhd
Google MapsやYouTubeのようなアプリも同じ方法を使い始めました。
上記の答えはとても良いですが、他に何か追加したいと思います。私はAndroidに不慣れです、私は開発中にこれらの問題に出会いました。これが私のような人に役立つことを願っています。
スプラッシュスクリーンは私のアプリの入り口なので、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();
}
}
}
ハッピーコーディング!
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>
スプラッシュスクリーンは、デフォルトでは自動的にあなたのアプリケーションをよりプロフェッショナルに見せるわけではありません。専門的に設計されたスプラッシュスクリーンはあなたのアプリケーションをよりプロフェッショナルに見せる可能性があります、しかしあなたがそれを書く方法を知らないならばあなたのアプリケーションの残りが実際にどれほどプロフェッショナルになるか。
スプラッシュスクリーンを使用する唯一の理由(言い訳)は、大量の計算を行っているか、GPS/WiFiが起動する前にGPS/WiFiが起動するのを待っているためです。これらの計算の結果やGPS/WiFi(など)へのアクセスがないと、あなたのアプリケーションは水中では死んでいるので、スプラッシュスクリーンが必要であると感じます。 ).
そのようなスプラッシュスクリーンはあなたのフルスクリーンアプリケーションのように見えて、それが既に初期化されているという印象を与えるべきです、そして長い計算が完了した後に最終的な詳細が記入されます。その場合の チャンス 、またはそれがプログラムを設計できる唯一の方法である は非常に小さい です。
(待機時間が不確かな場合)しばらく時間がかかるものに依存するようにプログラムを設計するよりも、ユーザー(および残りのOS)が待機している間に他のことをできるようにするほうがよいでしょう。
GPS/WiFiが起動していることを示すアイコンがすでに携帯電話にあります。スプラッシュスクリーンが使用する時間またはスペースは、事前計算のロードまたは実際の計算の実行に費やされる可能性があります。あなたが作り出す問題と考慮すべきことについては、下記の最初のリンクを参照してください。
これらの計算またはGPS/WiFiを絶対に待たなければならない場合は、単にアプリケーションを起動させ、計算を待つ必要があるというポップアップが表示されるようにするのが最善です(テキスト「初期化」メッセージで結構です)。 GPS/WiFiを待つことが期待されています(他のプログラムで有効にされていない場合)ので、待ち時間を発表する必要はありません。
スプラッシュスクリーンがあなたのプログラムISを実際に起動して起動した時、あなたがしていることはあなたのプログラムの使用を遅らせることだけです。
プログラムを起動するたびにスプラッシュスクリーンを表示したほうがよいでしょう。WEそれが専門的に書かれているとは思われないでしょう。スプラッシュスクリーンをフルスクリーンにして実際のプログラムのスクリーンを複製すること(実際には初期化されていないときに初期化されると思います)(プログラムをよりプロフェッショナルに見せる)あなたの目的は達成できます。
なぜそれをしないのですか: http://cyrilmottier.com/2012/05/03/splash-screens-are-evil-dont-use-them/ /
そのやり方: https://encrypted.google.com/search?q=Android+splash+screen+source
だからそれをしないのにはもっともな理由がありますが、あなたの状況がどうにかしてこれらの例から外れることが確実ならば、それを行うための手段は上に与えられています。それが本当にあなたのアプリケーションをよりプロフェッショナルに見せるか、あなたがこれをするために与えた唯一の理由を破ったことを確かめてください。
これはYouTubeのチャンネルのように、長いグラフィックイントロ(およびアウトトロ)ですべてのビデオを開始したり、過去1週間の間に何が起こったのかを説明したり説明したりする必要があると感じます。ショーを見せるだけ! (ただプログラムを実行してください)。
何よりも答えは本当にとても良いです。ただし、メモリリークの問題があります。この問題は、Androidコミュニティでは "Leaking an Activity" として知られています。今それは正確にはどういう意味ですか?
向きの変更など設定の変更が発生すると、Androidはアクティビティを破棄して再作成します。通常、ガベージコレクタは古いActivityインスタンスの割り当てられたメモリをクリアするだけで、すべて問題ありません。
"アクティビティの漏洩" は、アクティビティインスタンスを存続していたオブジェクトからbeing (strong) referenced
であるため、ガベージコレクタが古いアクティビティインスタンスの割り当てられたメモリをクリアできない状況を表します。すべてのAndroidアプリには、特定の量のメモリが割り当てられています。 Garbage Collectorが未使用のメモリを解放できない場合、アプリのパフォーマンスは徐々に低下し、やがてOutOfMemory
エラーでクラッシュします。
アプリがメモリをリークしているかどうかを判断する方法は?最速の方法は、Android Studioで[メモリ]タブを開き、向きを変更するときに割り当てられたメモリに注意を払うことです。割り当てられたメモリが増え続け、減少しない場合は、メモリリークが発生しています。
まず、レイアウトリソースの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;
}
}
詳細はこちらをご覧ください link
Abdullahの答えは素晴らしいです。しかし、私は私の答えと一緒にそれにいくつかの詳細を追加したいと思います。
スプラッシュスクリーンの実装
スプラッシュスクリーンを正しい方法で実装することは、想像以上に少し異なります。表示されるスプラッシュビューは、スプラッシュアクティビティでレイアウトファイルを膨らませる前であっても、すぐに準備ができている必要があります。
だからあなたはレイアウトファイルを使わないでしょう。代わりに、スプラッシュスクリーンの背景をアクティビティのテーマの背景として指定してください。これを行うには、まずres/drawableでXMLドロウアブルを作成します。
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();
}
}
それが正しい方法です。私はこれらの参考文献を答えに使った。
これは完全なコードです。
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>
乾杯。
Android Marshmallow 、その他のSplashスクリーンの生産的使用はあなたのアプリのスプラッシュスクリーンで 必要なAndroid Permissions
を要求する です。
ほとんどのアプリが許可要求をこのように処理するようです。
ダイアログはUIXを悪くし、メインフローを壊して実行時間を決めさせます。ほとんどのユーザーは、あなたのアプリがSDカードに何かを書きたいと思っても気にしないかもしれません。彼らの何人かは私達が平易な英語でそれを翻訳するまで私達が伝えようとしていることを理解さえしないかもしれません。
一度に許可を要求すると、すべての操作の前の「if else」の数が減り、コードが雑然とした感じになります。
これは、Android OS 23以降を実行しているデバイスに対するスプラッシュアクティビティのアクセス許可を要求する方法の例です。
すべての権限が付与されている場合OR既に付与されているORアプリが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);
}
}
スプラッシュスクリーンはレイアウトファイルからロードされるべきではありません、それをロードするときまだいくらかの遅れがあるかもしれません。
最良の方法は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>
4の5秒間のスプラッシュスクリーンでの停止は、あまり意味がありません。バックグラウンドで何かをロードする場合はOkです。それ以外の場合は、このアプローチに従ってスプラッシュスクリーンを実装します。-スプラッシュスクリーンを正しい方法で実装することは、想像とは少し異なります。表示されるスプラッシュビューは、スプラッシュアクティビティでレイアウトファイルをインフレートする前であっても、すぐに準備する必要があります。
したがって、レイアウトファイルは使用しません。代わりに、スプラッシュスクリーンの背景をアクティビティのテーマの背景として指定します。これを行うには、最初にres/drawableで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ファイルに移動して、スプラッシュアクティビティの新しいテーマを追加します。
<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
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();
}
レイアウトファイルは使用しません。代わりに、スプラッシュスクリーンの背景をアクティビティのテーマの背景として指定してください。これを行うには、まずres/drawableでXMLドロウアブルを作成します。
注:以下のコードはすべて利用可能です 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にはビューを設定していないことに注意してください。見解はテーマから来ています。テーマでスプラッシュアクティビティのUIを設定すると、すぐに利用可能になります。
スプラッシュアクティビティ用のレイアウトファイルがある場合、そのレイアウトファイルは、アプリケーションが完全に初期化された後になって初めてユーザーに表示されます。スプラッシュは、アプリが初期化される前のわずかな時間でのみ表示されるようにします。
スプラッシュスクリーンは、Androidでは少し使用できないオブジェクトです。メインアクティビティの起動遅延を隠すために、できるだけ早くロードすることはできません。それを使用する2つの理由があります:広告とネットワーク操作。
ダイアログとしての実装は、スプラッシュスクリーンからアクティビティのメインUIまで遅滞なくジャンプします。
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();
}
...
}
アクティビティを作成し、アクティビティを 'A'にしてから、myscreen.xmlというxmlファイルを作成し、スプラッシュスクリーン画像を背景に設定してから、カウントダウンタイマーを使用してあるアクティビティから別のアクティビティに移動します。カウントダウンタイマーの使い方を知るためには、この質問の回答を参照してください。 AndroidのTimerTask?
スプラッシュスクリーンの例:
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);
}
}
- 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>
ユーザーがSplashActivity
を開いてすぐに終了することもありますが、アプリはSPLASH_SCREEN_DISPLAY_LENGTH
の後でMainActivity
に移動します。
それを防ぐため: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);
}
}
}
この助けを願っています
良い答えがありますが、私はグーグル推奨方法を紹介します。
1)最初にスプラッシュスクリーン用のTheme
を作成します。splashscreenTheme
というテーマがあります。ランチャーテーマは次のようになります。
<style name="splashscreenTheme">
<item name="Android:windowBackground">@drawable/launch_screen</item>
</style>
注意:
Android:windowBackground
は既にあなたのスプラッシュスクリーン画像を設定します
これをUIで再度実行する必要があります。
あなたはドロアブルの代わりにここで色を使うこともできます。
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)画像が小さくない場合は、launch_screen drawable
がdrawable
フォルダにないことを確認してください。
起動画面の起動が早くなり、黒い画面からあなたを救います。
それはまた余分な超過引き出しを避けます
本当に簡単&gr8アプローチ:
まず、次のWebサイトでスプラッシュを作ります。
https://www.norio.be/Android-feature-graphic-generator/ /
あなたのロゴとスローガンを選んでください、あなたの美しい背景を選んでください。 4096 x 4096にサイズ変更します。
今その写真をダウンロードして、それをuplodate:
https://apetools.webprofusion.com/app/#/tools/imagegorilla
そして、必要なすべてのスプラッシュスクリーン、すべてのデバイス、すべてのプラットフォームを生成します。
楽しい!
実装に役立つ十分な答えがここにあります。この記事は、スプラッシュスクリーンを作成する最初のステップで他の人を助けるためのものです。
これは私がスプラッシュスクリーンで見た中で最高の投稿です: http://saulmm.github.io/avoding-Android-cold-starts
SaúlMolineroは、スプラッシュスクリーンに2つの異なる選択肢を用意しています。ウィンドウの背景を利用して初期スクリーンにアニメーション化することと、プレースホルダUIを表示することです。
コールドスタート時間を考慮し、長い起動時間によるユーザードロップオフを回避する必要があるたびに、この記事を参照してください。
お役に立てれば!
同じコードを使用でき、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自身が "launch_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();
}
}
}
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();
}
あなたの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;
詳細については、このリンクから完全なコードをダウンロードしてください...
単純なコード、それは動作します:) 単純なスプラッシュ
int secondsDelayed = 1;
new Handler().postDelayed(new Runnable() {
public void run() {
startActivity(new Intent(LoginSuccessFull.this, LoginActivity.class));
finish();
}
}, secondsDelayed * 1500);
私の場合は、2秒間画像を表示するためだけに新しいアクティビティを作成したくありませんでした。 MainAvtivity
を起動すると、picassoを使用してイメージがホルダーにロードされます。ロードには約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
が表示され、statusBarがウィンドウフラグを全画面に設定することによって削除されることです。それからHandler
を使用して2秒間実行し、2秒後にフルスクリーンフラグをクリアしてImageView
の可視性をGONE
に設定しました。簡単、簡単、効果的。
Androidでは本当にシンプルで、スプラッシュスクリーンを実装するためにハンドラの概念を使用しています。
SplashScreenActivity Javaファイルに このコードを貼り付けてください。
SplashScreenActivity xmlファイルに 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);
}
Kotlinで次のコードを記述します。
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();
}
}
私はスレッドを使ってAndroidのFlashスクリーンを作りました。
import Android.content.Intent;
import Android.os.Bundle;
import Android.support.annotation.Nullable;
import Android.support.v7.app.AppCompatActivity;
public class HomeScreen extends AppCompatActivity{
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.screen_home);
Thread thread = new Thread(){
public void run(){
try {
Thread.sleep(3 * 1000);
Intent i = new Intent(HomeScreen.this, MainActivity.class);
startActivity(i);
} catch (InterruptedException e) {
}
}
};
thread.start();
}
}