多くのAndroidアプリでは、起動時に一瞬黒いまたは白い画面が表示されることがあります。この問題はユーザー体験を損なう可能性があるため、その原因と解決策について説明します。
現象の確認
いくつかの有名なアプリを例に挙げてみましょう。
- 微信: 起動時、直接スプラッシュ画面に移行し、黒や白のフラッシュはありません。
- 斗魚: 同様に、スムーズにスプラッシュ画面に遷移します。
- 知乎やB站: これらのアプリは、まず白い画面が表示されてからスプラッシュ画面に切り替わります。
この違いは、アプリのテーマ設定や実装方法によって引き起こされています。
実装方法
1. スプラッシュアクティビティの設定
AndroidManifest.xmlでスプラッシュアクティビティを定義し、全画面表示と縦向き固定を指定します。
<activity android:name=".StartupActivity"
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>
2. テーマの設定
styles.xmlに以下のテーマを追加します。背景画像を直接ウィンドウ背景として設定することで、フラッシュを防ぎます。
<style name="SplashTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowBackground">@drawable/splash_background</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowFullscreen">true</item>
</style>
ここで使用する@drawable/splash_backgroundは、PNG形式の画像ファイルです。
3. アクティビティのコード
次に、スプラッシュアクティビティのコードを作成します。ここでは、2秒後にメインアクティビティに遷移させます。
public class StartupActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 2秒後にメインアクティビティに遷移
new Handler(Looper.getMainLooper()).postDelayed(() -> {
Intent intent = new Intent(StartupActivity.this, MainActivity.class);
startActivity(intent);
finish();
}, 2000);
}
}
問題の原因
フラッシュ現象が発生するのは、システムがアクティビティのレイアウトを描画する前に一時的な背景色を使用するためです。デフォルトのテーマでは、明るいテーマ(Theme.AppCompat.Light)の場合白色、暗いテーマ(ThemeOverlay.AppCompat.Dark)の場合黒色が使用されます。
たとえば、以下のようなスタイルでは、白色のフラッシュが発生します。
<style name="DefaultLightTheme" parent="Theme.AppCompat.Light">
</style>
同様に、暗いテーマでは黒色のフラッシュが発生します。
<style name="DefaultDarkTheme" parent="ThemeOverlay.AppCompat.Dark">
</style>
解決策
フラッシュを防ぐためには、android:windowBackground属性を使ってカスタムの背景画像を設定することが効果的です。この設定により、アクティビティの描画が完了するまでの間、指定した背景が表示されます。
カスタム背景の作成
splash_background.xml(res/drawable/内)を作成し、グラデーションや画像を指定します。
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/primary_color"/>
<item>
<bitmap
android:src="@mipmap/ic_launcher"
android:gravity="center"/>
</item>
</layer-list>
注意点
- 背景画像の解像度とサイズを適切に調整しましょう。高すぎる解像度はパフォーマンスに影響を与える可能性があります。
- スプラッシュ画面は短時間で終了させるのが推奨されます。長すぎるとユーザーが「遅い」と感じることがあります。
これで、スムーズなスプラッシュ画面の実装が可能です。