スプラッシュを実現するにあたって、編集するファイルは
- 一番最初に表示するActivity(MainActivity.java)
- アクティビティのxmlファイル(activity_main.xml)
の2つです。
まずxmlファイルの方を編集していきます。
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:animateLayoutChanges="true"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
// アクティビティに表示するコンポーネントをここに書く
</LinearLayout>
<ImageView
android:id="@+id/splash_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:contentDescription="@string/content_description_splash"
android:scaleType="fitXY"
android:src="@drawable/splash" />
</FrameLayout>
一番外側をFrameLayoutでラップして、通常の画面の上にSplash画像が重なるようにします。
android:animateLayoutChanges="true"
これは、レイアウトが変更されるときにアニメーションするかどうかを設定しています。
フェードアウトしたほうが綺麗なので、trueに設定しています。(APILevel11以上の時なので,2.xではアニメーションしません)
次に、MainActivity.javaの方を編集します。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.actiivty_main);
initSplashView();
SplashClearTask splashClearTask = new SplashClearTask();
splashClearTask.execute();
}
private void initSplashView() {
ImageView splashView = (ImageView)findViewById(R.id.splash_view);
// スプラッシュ表示中はクリックを無視する
splashView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
return;
}
});
}
private void clearSplash() {
ImageView splashView = (ImageView)findViewById(R.id.splash_view);
splashView.setVisibility(View.GONE);
}
private class SplashClearTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
try {
// 一定時間待機
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
clearSplash();
}
}
FrameLayoutでViewを重ねるだけでは、その下にあるViewをクリックできてしまうので、スプラッシュ画像が表示されている間、その下にあるコンポーネントをクリックできないようにしています。
SplashClearTaskでは、スプラッシュを一定時間表示してからスプラッシュを消すためにdoInBackgroundでThread.sleep()を使っています。
アクティビティのレイアウトの階層が1段深くなりますが、スプラッシュ用にアクティビティを使わなくてすみます。
注意するポイントとしては、アクションバーやメニューバーは表示されてしまうので、スプラッシュの前後で表示の切替が必要です。



