2013/03/27

Androidでスプラッシュ画面を表示する

何番煎じかわかりませんが、Androidでスプラッシュを表示する方法です。

スプラッシュを実現するにあたって、編集するファイルは

  • 一番最初に表示するActivity(MainActivity.java)
  • アクティビティのxmlファイル(activity_main.xml)

の2つです。

まずxmlファイルの方を編集していきます。
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:animateLayoutChanges="true"  
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="match_parent" >  
  6.   
  7.     <LinearLayout  
  8.         android:layout_width="match_parent"  
  9.         android:layout_height="match_parent"  
  10.         android:orientation="vertical" >  
  11.   
  12.         // アクティビティに表示するコンポーネントをここに書く  
  13.           
  14.     </LinearLayout>  
  15.   
  16.     <ImageView  
  17.         android:id="@+id/splash_view"  
  18.         android:layout_width="match_parent"  
  19.         android:layout_height="match_parent"  
  20.         android:contentDescription="@string/content_description_splash"  
  21.         android:scaleType="fitXY"  
  22.         android:src="@drawable/splash" />  
  23.   
  24. </FrameLayout>  

一番外側をFrameLayoutでラップして、通常の画面の上にSplash画像が重なるようにします。

  1. android:animateLayoutChanges="true"  

これは、レイアウトが変更されるときにアニメーションするかどうかを設定しています。
フェードアウトしたほうが綺麗なので、trueに設定しています。(APILevel11以上の時なので,2.xではアニメーションしません)

次に、MainActivity.javaの方を編集します。
  1. @Override  
  2. protected void onCreate(Bundle savedInstanceState) {  
  3.     super.onCreate(savedInstanceState);  
  4.     setContentView(R.layout.actiivty_main);  
  5.       
  6.     initSplashView();  
  7.       
  8.     SplashClearTask splashClearTask = new SplashClearTask();  
  9.     splashClearTask.execute();  
  10. }  
  11.   
  12. private void initSplashView() {  
  13.     ImageView splashView = (ImageView)findViewById(R.id.splash_view);  
  14.     // スプラッシュ表示中はクリックを無視する  
  15.     splashView.setOnClickListener(new View.OnClickListener() {  
  16.           
  17.         @Override  
  18.         public void onClick(View v) {  
  19.             return;  
  20.         }  
  21.     });  
  22. }  
  23.   
  24. private void clearSplash() {  
  25.     ImageView splashView = (ImageView)findViewById(R.id.splash_view);  
  26.     splashView.setVisibility(View.GONE);  
  27. }  
  28.   
  29. private class SplashClearTask extends AsyncTask<Void, Void, Void> {  
  30.   
  31.     @Override  
  32.     protected Void doInBackground(Void... params) {  
  33.         try {  
  34.             // 一定時間待機  
  35.             Thread.sleep(3000);  
  36.         } catch (InterruptedException e) {  
  37.             e.printStackTrace();  
  38.         }  
  39.         return null;  
  40.     }  
  41.   
  42.     @Override  
  43.     protected void onPostExecute(Void result) {  
  44.         clearSplash();  
  45.     }  
  46. }  

ポイントは、スプラッシュ表示中のクリックを無効化している部分と、SplashClearTaskの部分です。

FrameLayoutでViewを重ねるだけでは、その下にあるViewをクリックできてしまうので、スプラッシュ画像が表示されている間、その下にあるコンポーネントをクリックできないようにしています。

SplashClearTaskでは、スプラッシュを一定時間表示してからスプラッシュを消すためにdoInBackgroundでThread.sleep()を使っています。

アクティビティのレイアウトの階層が1段深くなりますが、スプラッシュ用にアクティビティを使わなくてすみます。

注意するポイントとしては、アクションバーやメニューバーは表示されてしまうので、スプラッシュの前後で表示の切替が必要です。

0 件のコメント:

コメントを投稿