Android 2.3 アプリケーションでは、2 台のカメラをサポートしていました。1 台は内蔵カメラ、もう 1 台は Wi-Fi を使用して外部から MJPG ストリーミングされたカメラです。内蔵カメラは常にビデオを録画している必要があり、ユーザーはそれらの間でビューを切り替えることができる必要があります。そのため、各カメラには描画専用の SurfaceView がありました。FrameLayout に最後に追加された子の Z オーダーが高いため、必要なカメラ ビューをプログラムで FrameLayout に最後に追加して、表示できるようにします。プレビュー表示しないと録画できないので、内蔵カメラの追加は省略できません。
このスキームは Android 4 では機能しなくなりました。組み込みカメラのプレビューは、最初または最後に追加されたにもかかわらず、常に表示されます。ビューで 'setVisibility' メソッドを試してみたところ、ビューの 1 つが非表示 (またはなくなった) に設定されている場合、それらのビューはまったく表示されないことに気付きました。ViewGroup の「bringChildToFront」メソッドも効果がありませんでした。
それで、これを Android 4 で動作させるための回避策はありますか? そして、複数の SurfaceView を持つことは悪いと考えられていることを知っています。いくつかのコードが続きます。
フレームレイアウト:
<FrameLayout android:id="@id/data"
android:layout_width="fill_parent" android:layout_height="fill_parent"/>
レイアウトを設定するコード (Android 4 では動作しなくなりました):
private void setCorrectView() {
data.removeAllViews();
List<Recorder> others = recorders.getOthers();
for (Recorder other : others) {
addToTheView(other);
}
addToTheView(recorders.getCurrent());
}
private void addToTheView(Recorder recorder) {
View view = recorder.getView(this); // get recorder's surface view
data.addView(view);
}
XML から FrameLayouts を使用すると、同じ効果が得られます。
<FrameLayout android:layout_width="fill_parent" android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
<FrameLayout
android:id="@id/data"
android:layout_width="fill_parent" android:layout_height="fill_parent"/>
<FrameLayout
android:id="@+id/data_invisible"
android:layout_width="fill_parent" android:layout_height="fill_parent"/>
</FrameLayout>
内蔵カメラのサーフェス ビューをどこに置いても、常に表示されます。Android 4 では、内蔵カメラのプレビューが常に一番上に表示されるようになりました。