[Android]動画の拡大縮小

SurfaceViewで表示した動画を再生中に拡大縮小する方法について。
ここでも似たような話が出ているが、再生中に変えるという話ならsetFixedSizeは使えない。
setFixedSizeは動的にサイズ変更するためのメソッドではないので。
ドキュメントより
Make the surface a fixed size. It will never change from this size.
再生中に拡大縮小するには、SurfaceView自体に手を加える必要がある。

HT-03A(Android 1.6)とWebStation(Android 1.5互換)で確認
方法
1. onPreparedでSurfaceHolder.setFixedSizeを呼ぶ
2. SurfaceViewをLinearLayoutにaddView
3. LinearLayout.setGravity(Gravity.TOP);
4. 変更したいサイズでSurfaceView.setLayoutParams(new LinearLayout.LayoutParams(Width, Height));
5. LinearLayoutに再描画用のViewを追加。例:LinearLayout_SurfaceView.addView(TmpLinearLayout, 0, new LinearLayout.LayoutParams(1, 1));
6. サイズ変更のたびにTmpLinearLayoutの追加と削除を交互に行う

サイズ変更だけなら4. だけでいいと普通は思うが、それだと動画の拡大縮小が画面に反映されない。
そのために強制的に拡大縮小の変更を画面に反映させるために、LinearLayoutにSurfaceViewを入れて重力を上に設定、その状態で上に大きさのあるViewを突っ込むとLinearLayoutを再描画せざるを得なくなる。
というかなり強引な方法でSurfaceViewの拡大縮小を画面に反映させている。
1. についてはWebStationだとsetFixedSizeを実行しないと画面の描画がおかしくなり拡大縮小ももちろん反映されないので、その対策。
ちなみにHT-03AだとSurfaceViewの親のLinearLayout.setLayoutParamsを呼ぶだけでSurfaceViewの拡大縮小ができたので、画面の描画関係は機種依存があるのかもしれない。

最終更新:2010年04月10日 07:04