🎨

SurfaceViewとTextureViewの違い

に公開

SurfaceViewとTextureViewの違い【Androidアプリ開発者向け】

Camera2でカスタムカメラ機能を開発する際、SurfaceViewTextureView の使い分けで困ったので記事にします。
本記事では、それぞれの特徴と使い分けについて整理します。


SurfaceViewとは

SurfaceView は、別スレッドで描画されるビューで、主に以下の用途に向いています:

  • カメラプレビュー(Camera API, Camera2 API)
  • 動画再生(MediaPlayerとの連携)
  • ゲームなど描画負荷の高い処理

特徴

  • 描画用のSurfaceはUIスレッドと分離されている(パフォーマンスが良い)
  • 半透明・回転・アニメーションに非対応
  • Viewのレイアウト制御は難しい(Z順の制御がやや制限される)

TextureViewとは

TextureView は、通常のViewの一部として扱われ、より柔軟な表現が可能です。

特徴

  • UIスレッド上で動作
  • アルファ、回転、スケーリング、アニメーションが可能
  • Viewの中に自由に組み込める(ScrollViewやConstraintLayoutにも対応)
  • APIレベル14以降で使用可能

違いのまとめ

観点 SurfaceView TextureView
描画スレッド UIスレッドとは別 UIスレッド上
アニメーション対応 ×
透明・回転・スケーリング ×
パフォーマンス 高速(特に動画やゲーム) やや劣る
使用場面 カメラ、動画、ゲーム UIと組み合わせるプレビューや録画

どちらを使うべき?

  • カメラプレビューのみなら SurfaceView
  • プレビュー上にUIを重ねたり、回転・拡大縮小が必要なら TextureView
  • 録画しながらエフェクトなどを重ねたい場合は TextureView

まとめ

用途 推奨ビュー
シンプルな高速表示(カメラ、動画) SurfaceView
UIと統合した柔軟な表示 TextureView

今回は画面いっぱいにカメラプレビューを表示したかったのでTextureViewを採用しました。

参考: 公式ドキュメント

Discussion