.NET MAUI スプラッシュスクリーンのBaseSizeが効かない原因と解決策|Android 12対応・SVG編集でサイズを変える方法

Android 向けの .NET MAUI で「<MauiSplashScreen BaseSize="..."> を変えてもロゴの見た目が変わらない」という相談はとても多いテーマです。本記事では、BaseSize の正体(ビルド時のヒントにすぎない)と、Android 12 以降の起動画面が OS によって強制レイアウトされる仕組みを、図解・コード例・具体的な SVG 編集手順まで踏み込んで解説します。最後に“確実にサイズを変える”ための実務的レシピもまとめます。

目次

.NET MAUI スプラッシュスクリーンの BaseSize が効かない問題:結論から

  • BaseSize はズームではない:MAUI のビルド時にアセット生成へ「この画像の基準は W×H(密度 1.0 相当)」と伝えるメタ情報であり、実行時の描画サイズは変えられません。
  • Android 12+ は OS が自動スケーリング:新スプラッシュ API により、ロゴは中央配置+システム既定のボックスにフィットするようOS 側で拡大・縮小されます。
  • 見た目を変える最短の実務解:SVG を直接編集(viewBox/transform/余白追加)し、Clean → Rebuild で再生成させる。これが最も再現性が高く、チーム共有もしやすい。

質問の整理

  • 対象:Android 用 .NET MAUI アプリ
  • 設定:MauiSplashScreen に splash.svg を指定。BaseSize="520,800" などを変更してもロゴの見た目(大きさ)が変わらない。
  • 疑問:BaseSize の本来の役割は? 大きさを変えるにはどうすれば?

BaseSize の正体と内部動作(ビルド時ヒント)

MAUI はビルド時に Resizetizer(アセット生成タスク)を使って、各プラットフォーム用の画像/ベクター資産を作ります。<MauiSplashScreen BaseSize="W,H"> は、「このソース画像は密度 1.0(mdpi/1x)相当で W×H px」という基準密度を示すヒントです。これに基づき、次のような派生アセットが生成されます。

プラットフォーム生成される代表的な資産BaseSize の使われ方
Android(<12)drawable-dpi(mdpi/hdpi/xhdpi/…)の PNG または VectorDrawablemdpi=BaseSize として他密度へ倍率展開(1.5x, 2x, 3x など)
Android(12+)スプラッシュ API 用のロゴ drawable(OS が使用)生成までは同じ。実行時の最終スケールは OS が決定
iOS1x/2x/3x 画像セット1x=BaseSize として倍率展開

ポイントは、BaseSize は「アセットの基準サイズ」であり、「起動時にどう見えるか」は別の話だということ。Android では特に 12 以降、最終的な大きさはOS のスプラッシュ描画ルールに委ねられます。

Android 12 以降のスプラッシュの仕組み:OS が主導

Android 12(API 31)から、アプリ起動時のスプラッシュはシステム UI の一部として描画され、アプリ側が自由にレイアウトする余地は大きく制限されました。OS は以下の要件に従ってロゴを自動配置します。

  • 画面中央にロゴ(animatedIcon/static drawable)を配置
  • 定義済みのボックス(マスク)に収まるよう等比スケーリング
  • 背景色はテーマ/指定色、ブランディング画像は別枠(任意)

このため、BaseSize の数値を変えても「見た目のスケール」は基本的に変わりません。変わるのは「ビルド成果物の解像度」だけで、OS の最終スケール計算に対して影響は限定的です。

「じゃあどうやってサイズを変えるの?」3つの実務パターン

パターン A:SVG を直接スケーリング(推奨)

最もシンプルでチームに共有しやすいのが、SVG 内でロゴ自体を拡大・縮小する方法です。viewBox と transform を使えば、見た目サイズを意図通りに調整できます。

  1. SVG をエディタで開く(Figma/Illustrator/Inkscape かテキストエディタ)
  2. viewBox を把握:<svg viewBox="0 0 520 800"> のように「座標系の幅×高さ」を確認
  3. ロゴのルート要素を <g> でラップし、transform="scale(0.85)" などで等比縮小
  4. 縮小で中央からズレる場合は translate を併用(例:transform="translate(39,60) scale(0.85)")
  5. 「小さく見せたい」なら透明の余白(背景に fill="none" の矩形を追加)で囲うのも効果的
  6. 保存 → Clean → Rebuild

例:

&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; viewBox=&quot;0 0 520 800&quot;&gt;
  &lt;rect width=&quot;520&quot; height=&quot;800&quot; fill=&quot;none&quot;/&gt;  &lt;!-- 透明の余白 --&gt;
  &lt;g transform=&quot;translate(26,40) scale(0.9)&quot;&gt;
    &lt;!-- ロゴのパス群 --&gt;
    &lt;path d=&quot;M...Z&quot; fill=&quot;#ffffff&quot; /&gt;
  &lt;/g&gt;
&lt;/svg&gt;

メリット:Android 12+/旧 Android/iOS すべてで一貫した見た目に近づけられる/ソース管理しやすい。
注意:stroke の太さが縮小で相対的に太く(または細く)見えることがあるので、vector-effect="non-scaling-stroke" の有無や stroke-width の再調整を検討。

パターン B:パディング(余白)を意図的に増やす

ロゴの周囲に透明の余白を足すと、OS の「等比フィット」時に相対的に小さく見えます。ロゴを小さく見せたいときに有効です。上の例の <rect fill="none"> はまさにこのテクニックです。逆に大きく見せたいなら、余白を削る(ロゴのパスを viewBox いっぱいまで広げる)と効果的です。

パターン C(Android 上級者向け):drawable の <inset> を使う

Android のスプラッシュは drawable(アイコン)を受け取り、OS がそれをボックスに当てはめます。drawable 側を <inset> で包むと、アイコンに「装飾的な余白」を持たせられ、見た目のスケールを微調整できます。

例(Resources/drawable/my_splash_logo.xml):

&lt;inset xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
       android:insetLeft=&quot;24dp&quot;
       android:insetTop=&quot;24dp&quot;
       android:insetRight=&quot;24dp&quot;
       android:insetBottom=&quot;24dp&quot;&gt;
  &lt;vector
      android:width=&quot;520dp&quot;
      android:height=&quot;800dp&quot;
      android:viewportWidth=&quot;520&quot;
      android:viewportHeight=&quot;800&quot;&gt;
    &lt;path android:fillColor=&quot;#FFFFFFFF&quot; android:pathData=&quot;M...Z&quot;/&gt;
  &lt;/vector&gt;
&lt;/inset&gt;

そして styles.xml(v31 以上)で、MAUI が設定するデフォルトの windowSplashScreenAnimatedIcon を @drawable/my_splash_logo に差し替えます。
※プロジェクトの生成物や MAUI 既定テーマと競合しないよう、ファイル名とターゲット(values-v31)の使い分けに注意。ビルド後は obj/…/res/ に期待通り反映されているか確認しましょう。

BaseSize をいじっても変わらないのは正常動作

BaseSize を 520×800 から 260×400 にしても、生成される mdpi の基準が変わるだけで OS の最終スケールは同じです。以下のイメージで理解すると納得しやすいでしょう。

段階処理主体何をしているかBaseSize の影響
ビルドMAUI/Resizetizer各密度向けアセット生成(mdpi/hdpi/…)ある(mdpi の基準ピクセルが変わる)
起動時(Android 12+)OS(システム UI)中央配置・既定ボックスへ等比スケーリングなし(見た目のサイズは OS が決める)

実務レシピ:SVG を使ったサイズ調整の手順(完全版)

  1. 現在のソースを把握
    • Resources/Splash/splash.svg の viewBox と width/height を確認。width/height は未指定または 100% 推奨。
    • ロゴの原点(0,0)と中心が viewBox のどこにあるかを把握。
  2. スケール戦略を決める
    • 小さく見せたい:scale(0.85) などで縮小、または透明余白を足す。
    • 大きく見せたい:scale(1.1) などで拡大、または余白を減らす(ロゴを viewBox いっぱいに)
  3. 中心合わせ
    • 縮小すると位置がズレやすいので translate を併用して中央に戻す。
    • 中心座標は viewBox の半分(例:520×800 → 中心 260,400)。
  4. 塗りと線を調整
    • 線(stroke)を使うロゴは縮小で相対的に細/太に見えます。stroke-width を調整、または vector-effect="non-scaling-stroke" を検討。
    • 複雑なフィルター(ブラー、マスク)はビルドで落ちることがあるため、できるだけパスに焼き込む(アウトライン化)。
  5. 保存 → Clean → Rebuild
    • MAUI のアセット生成は インクリメンタルビルド が効くため、必ず Clean を挟むと確実です。
    • 出力確認:obj/Debug/net8.0-android/res/drawable-* に新しい生成物が並んでいるかを見る。
  6. 実機で確認
    • Android 12 以上(Pixel 系)と 11 以下(古めの端末/エミュレータ)で差を比較。
    • 画面比率やカットアウト(ノッチ)でも体感が変わるため、複数端末で見るのが安全。

コード例:XAML と SVG の最小構成

プロジェクトファイル(.csproj)の例:

&lt;ItemGroup&gt;
  &lt;MauiSplashScreen Include=&quot;Resources\Splash\splash.svg&quot;
                    Color=&quot;#121212&quot;
                    BaseSize=&quot;520,800&quot; /&gt;
&lt;/ItemGroup&gt;

縮小をかけた splash.svg(抜粋):

&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; viewBox=&quot;0 0 520 800&quot;&gt;
  &lt;!-- 透明余白で安全マージンを確保 --&gt;
  &lt;rect width=&quot;520&quot; height=&quot;800&quot; fill=&quot;none&quot;/&gt;
  &lt;!-- ロゴ本体を 90% に縮小して中央寄せ --&gt;
  &lt;g transform=&quot;translate(26,40) scale(0.9)&quot;&gt;
    &lt;path d=&quot;M...Z&quot; fill=&quot;#FFFFFF&quot; /&gt;
  &lt;/g&gt;
&lt;/svg&gt;

ビジュアルを安定させるためのヒント集

  • 単色化:スプラッシュのロゴはほとんどのブランドで単色または 2 色以内が無難。コントラスト比を上げるとあらゆる端末で映えます。
  • 角丸や細線の最小値:極細の線は縮小で消える/ガタつくことがあります。最小 2~3 px(mdpi 換算)を目安に。
  • 余白の黄金律:ロゴの外接矩形に対して上下左右 10~20% 程度の透明余白を確保すると、OS の自動スケールでも安定します。
  • 背景色:MauiSplashScreen の Color は「起動画面の背景」。ブランドカラーを正確に使い、ダーク/ライトに依存しない色を選ぶと安全です。

よくある落とし穴と対処

症状原因対処
BaseSize を変えても大きさが同じBaseSize はビルド時ヒント。実行時のスケールは OS が決めるSVG を編集(scale / 余白追加)。Clean → Rebuild
端末によって見え方が違う画面比率・解像度・Android バージョン差複数端末で検証/余白を多めに取る
線が太く(または細く)見える等比縮小で stroke が相対変化stroke-width の再調整 or non-scaling-stroke
ビルド後も変化しない生成キャッシュが残っているClean/bin・obj 削除→再ビルド、生成物を obj/.../res/ で確認
Android 12 だけやけに大きい/小さいOS のスプラッシュ API による統一スケールSVG で見た目を固定、または <inset> で調整

前提知識:ベクター(SVG)推奨の理由

  • 劣化しない:高解像度端末でもエッジが崩れない。
  • 1 ソースで全密度対応:PNG を密度別に量産する運用コストが不要。
  • ビルド時間と APK サイズ:PNG 多数より小さく、更新差分も取りやすい。

PNG/JPG を使う場合は、各密度(mdpi/hdpi/…)に対して適切な画素サイズを出し分けないと、OS のスケーリングでぼやけやすくなります。スプラッシュに限っては SVG 一択と考えて問題ありません。

「BaseSize の本来の役割」を正しく使う

BaseSize は、「ソースの基準ピクセル」を Resizetizer に教える設定です。例えば BaseSize=520×800 なら mdpi を 520×800 px とみなし、hdpi=780×1200、xhdpi=1040×1600… といった倍率展開が行われます。これは主に ビルド成果物の解像度に効きますが、Android 12+ では最終の見た目サイズを直接コントロールしません。従って「BaseSize を調整して見た目をコントロールする」という設計は、現在の Android 環境では成立しにくいのです。

Android 11 以下もサポートするプロジェクトでの考え方

Android 11 以下ではアプリ側のテーマやレイアウトで起動画面を構成するため、端末依存で「やや大きく」出ることがあります。SVG の余白をやや多めに取り、12+ でも 11 以下でも自然に見える折衷案に寄せるのが実務的です。ブランドガイドラインが厳密な場合は、12+/11 以下で SVG を分ける(ビルド条件で切替)という戦略も可能です。

検証チェックリスト

  • Pixel(12+)と Galaxy/Xperia(多サイズ)で確認
  • ライト/ダークで背景コントラストを再確認
  • 横向き起動(ゲームなど)でのセンタリング
  • 低性能端末でのブラー/アンチエイリアスの出方
  • CI ビルドで bin/obj をキャッシュしていないか(生成物が古い可能性)

トラブル対応:それでもサイズが合わないとき

  1. 生成物の突き合わせ:obj/Debug/net8.0-android/res/ 以下の drawable-* に想定のロゴが入っているか。
  2. テーマ差し替えの影響:独自 styles.xml で windowSplashScreenAnimatedIcon を別 drawable にしていないか。
  3. SVG の互換性:フィルター/マスク/グラデーションメッシュは避け、パスに焼く。
  4. キャッシュのクリア:IDE を再起動し、bin/obj を削除してからビルド。

サンプル:実案件での調整ダイアリー(擬似例)

要求:「ロゴが大きく見えすぎる。ベースは 520×800、余白をもう少し持たせたい。」

  1. 初回:scale(0.9) で縮小。中心ズレが発生 → translate(26,40) で補正。
  2. 2 回目:曲線の細線がかすれる → stroke-width を +0.5 px、アンチエイリアス前提で微調整。
  3. 3 回目:Android 11 端末で相対的に大きい → 透明余白を上下 5% 追加。
  4. 最終:ブランドレビュー通過。iOS でも同じ SVG を使い回し、コスト削減。

Q&A(よくある質問)

Q:BaseSize を大きくすれば、大きく表示されますか?
A:いいえ。BaseSize はビルド時の基準で、Android 12+ の見た目は OS が決めます。大きさを変えるには SVG を編集してください。

Q:BaseSize はいくつにするのが正解?
A:ロゴの元デザインに近い値(mdpi 相当)で問題ありません。最終見た目は SVG 側で担保する方が安定します。

Q:PNG にすればコントロールしやすい?
A:いいえ。PNG にしても OS の最終スケールは同じですし、密度別の量産・画質低下のリスクが増えます。SVG を推奨します。

Q:Android 12+ だけ別サイズにしたい。
A:ビルド条件で drawable を切り替えるか、values-v31 のスタイルを分岐させる設計が必要です。まずは SVG の余白やスケールで全体最適を目指すのが簡単です。

最小チェックリスト(この順に実行)

  1. SVG を編集(scale/viewBox/余白)して意図のサイズに。
  2. プロジェクトを Clean → Rebuild。
  3. obj/.../res/ の生成物を目視確認。
  4. Android 12+/11 以下の端末で見比べ。
  5. 必要なら <inset> や values-v31 のスタイルで最終微調整。

まとめ

  • BaseSize は「基準サイズの宣言」でありズームではない。実行時の見た目は変わらない。
  • Android 12+ は OS がロゴを強制レイアウト。アプリ側が任意のピクセルで支配することはできない。
  • 見た目の大きさを変える最短手段は SVG を編集。viewBox、transform、透明余白の 3 点で制御し、Clean → Rebuild で反映。
  • PNG より SVG を優先し、複数端末での検証と生成物の確認を習慣化する。

付録:BaseSize と密度倍率の目安(参考)

密度(Android)倍率BaseSize が 520×800 の場合
mdpi1.0x520×800
hdpi1.5x780×1200
xhdpi2.0x1040×1600
xxhdpi3.0x1560×2400
xxxhdpi4.0x2080×3200

この表はあくまで生成時の解像度目安であり、実行時の見た目スケールは OS が決める点を忘れないでください。

付録:チェック用テンプレート SVG

サイズ調整の検証に使える単純なテンプレート(中央円+テキスト)。scale/translate の効果が視覚的に確認しやすい構成です。

&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; viewBox=&quot;0 0 520 800&quot;&gt;
  &lt;rect width=&quot;520&quot; height=&quot;800&quot; fill=&quot;none&quot;/&gt;
  &lt;g transform=&quot;translate(52,80) scale(0.8)&quot;&gt;
    &lt;circle cx=&quot;208&quot; cy=&quot;288&quot; r=&quot;160&quot; fill=&quot;#FFFFFF&quot;/&gt;
    &lt;text x=&quot;208&quot; y=&quot;300&quot; font-family=&quot;Arial, sans-serif&quot; font-size=&quot;72&quot;
          text-anchor=&quot;middle&quot; fill=&quot;#121212&quot;&gt;MAUI&lt;/text&gt;
  &lt;/g&gt;
&lt;/svg&gt;

最後に:チーム共有のコツ

  • デザインと開発の共通言語を作る:「Android 12+ は OS スケール」を前提ルールとして周知。
  • SVG ガイド:許可するエフェクト/最小線幅/余白率/色数などの規定を README に明文化。
  • PR にビルド成果物のサムネイルを添付:検証工数を圧縮。

要点の再掲:
BaseSize は「ソース画像の基準サイズ」を Resizetizer に伝えるだけで、実行時の表示サイズは OS が決定します。見た目の大きさを変えたい場合は、SVG を直接編集してスケールや余白を調整し、Clean → Rebuild で新しいアセットを生成させましょう。これが .NET MAUI のスプラッシュスクリーンを最短距離で思い通りに整える方法です。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次