Android:空白にSpacerを使うべきかpaddingを使うべきか

Android 開発に入門して半年以上が経つ。

画面実装で避けては通れないコンポーネント間の間隔について、Spacer を使うべきか、padding を使うべきか時々悩むことがある。というのは、自分の手で実装する場合は割と手癖的に padding ベースで書くことが多い気がするだが(SiwftUIでもそうしていたので)、Claude に書かせていると惜しげもなく Spacer を挿入してくるので、どちらが適切なのだろう?と疑問に思ったのだった。

もちろん、Spacer / padding の判断は要所要所で行って良いはずだ。代表的な例で言えば、画面幅によって可変する間隔は迷いなく Spacer で表現するだろう。とはいえ、どういうケースでどうするべきか、網羅的には言語化できていなかった。

Android 開発でのデファクトがどうなっているのか、”Jetpack Compose Spacer vs padding” のようなキーワードで検索してみたところ、いくつか興味深い情報を見つけたので、ここで何か結論を出すつもりはないが個人的にメモしてみる。


  • Space Hoisting: Should I use the padding Modifier or the Spacer composable?
    • お馴染み “State Hoisting” の概念をもじって “Space Hoisting” という考え方を紹介している。間隔のレイアウトを子ではなく親に委ねるというもの(子は自身の周囲に空間を持たず、親側で SpacerModifier.padding(...) で空間をレイアウトする)
    • その上で、Spacer の有効性を説明している
      • 空白の表現を意図的に伝えられる
      • コンポーネントのカプセル化を保てる
      • 対象がタップ可能の場合、当たり判定や ripple effect への影響を考えるとよりシンプル
      • コンポーネントのサイズ計算に影響しない

ごもっともである。

いっぽう、両者でレイアウト処理のパフォーマンスに違いがありそう(感覚的に、要素数の増える Spacer の方が遅い気がする)だと感じていたのだが、実際に検証している Stack Overflow の投稿を見つけた。

android – Compose Spacer vs view padding performance – Stack Overflow

極端な事例では Spacer のレイアウトコストが顕にはなったが、結論ケースバイケースで、どちらかを一辺倒に選択する根拠にはならないことが分かった。


他の投稿を読んでも共通してケースバイケースに捉えている。あるとすれば、対象要素がコントロールの場合は、タップ(Android では特に ripple effect を含め)どのように作用させたいかで考えれば良さそう。

STORES さんのように、どういったケースでどちらを使うか、ルール化しておくと AI に書かせてもブレないので、これを参考にチームでも検討したいと思った。