LoginSignup
12
13

More than 5 years have passed since last update.

Android 初心者向け スプラッシュの入れ方

Last updated at Posted at 2016-08-16

概要

Androidアプリを作る際に、一番最初のアニメーションみたいなのをSplashと言います。
このスプラッシュを取り入れるための方法をAndroidアプリ開発初心者向けに書きたいと思います。以下のようなものを今回はSampleとして作りました。

ファイル名

方法

スクリーンショット 2016-08-16 18.45.26.png

1.Activityの新規追加

java > .....みたいなところを右クリック
New > Activity > EmptyActivity を選択

スクリーンショット 2016-08-16 18.52.34.png

名前を好きなように変更(今回はSplashActivityに変更)

スクリーンショット 2016-08-16 18.52.44.png

するとこんな感じのができます。

スクリーンショット 2016-08-16 18.55.00.png

SplashActivityMainActivityで画面が切り替わった時の違いを見るために今回はSplashActivityの背景を青にしたいと思います。そのためactivity_splash.xmlを以下のように変更します。

activity_splash.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:background="#0000FF"
    tools:context="hiroki11x.splashsample.SplashActivity">
</RelativeLayout>

android:background="#0000FF"を追加しました。

2. SplashActivityの編集

次にSplashActivity.javaを変更します。(@kamei-hidetoshi さんから、シンプルにpostDelayedを使う場合はどうでしょうとアドバイス頂きましたので修正いたしました)

SplashActivity.java
package hiroki11x.splashsample;

import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;

public class SplashActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);
        final Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                Intent intent = new Intent(getApplicationContext(), MainActivity.class);//画面遷移のための          Intentを準備
                startActivity(intent);//実際の画面遷移を開始
                finish();//現在のActivityを削除
            }
        }, 2000);//2秒後にrun()を行う
    }

修正前は以下の通りです、少し冗長です

SplashActivity.java
package hiroki11x.splashsample;

import android.content.Intent;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import java.util.Timer;
import java.util.TimerTask;

public class SplashActivity extends AppCompatActivity {

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_splash);

       final Handler handler = new Handler();
       Timer timer = new Timer(false);
       timer.schedule(new TimerTask() {
                          @Override
                          public void run() {
                              handler.post(new Runnable() {
                                  @Override
                                  public void run() {
                                      // メイン画面に遷移して、現在のSplashActivityを終了
                                      Intent intent = new Intent(SplashActivity.this, >MainActivity.class);//画面遷移のためのIntentを準備
                                      startActivity(intent);//実際の画面遷移を開始
                                      finish();//現在のActivityを削除
                                  }
                              });
                          }
                      },
               2000);//2秒後にrun()を行う
   }
}

3. Androidmanifest.xmlの編集

最後に、このままではMainActivityが一番初めに起動するようになっているので、SplashActivityを一番最初に起動するように変更するためAndroidManifest.xmlを以下のように変更します。

[Before]

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="hiroki11x.splashsample">
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".SplashActivity"></activity>
    </application>
</manifest>

[After]

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="hiroki11x.splashsample">
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".SplashActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".MainActivity"></activity>
    </application>
</manifest>

おかしな挙動を防ぐために

@kamei-hidetoshi さんから、アドバイスをいただけましたので加筆修正させていただきます。

スプラッシュの間にバックボタンまたは、ホームボタンでアプリから離れた時に、勝手にまた起動してしまうのはユーザにとって負担になってしまう場合があります。
対応する場合には、onPauseまたはonStopでタイマーなどを切ってあげないといけないです。

そのためSplashActivity.javaを以下のように書き直すとこの問題を防ぐことができます。

SplashActivity.java
package hiroki11x.splashsample;

import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;

public class SplashActivity extends AppCompatActivity {

    final Handler mHandler = new Handler();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);
        mHandler.postDelayed(mSplashTask, 2000);
    }

    @Override
    protected void onStop() {
        super.onStop();
        mHandler.removeCallbacks(mSplashTask);
    }

    private Runnable mSplashTask = new Runnable() {
        @Override
        public void run() {
            Intent intent = new Intent(SplashActivity.this,MainActivity.class);//画面遷移のためのIntentを準備
            startActivity(intent);//実際の画面遷移を開始
            finish();//現在のActivityを削除
        }
    };
}

以上となります。

12
13
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
13