1

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 では、内蔵カメラのプレビューが常に一番上に表示されるようになりました。

4

1 に答える 1

0

自分に答える。これを機能させるために、カメラを起動する前にビューの可視性を View.VISIBLE に設定し、後で View.INVISIBLE に設定しましこのリンクが役立つ場合があります。

于 2012-11-10T18:26:52.977 に答える