2

私の活動レイアウトを以下に示します。基本的に、左側にリストビューメニューがあり、ユーザーがクリックしたメニュー項目に応じて切り替える2つのビデオビューがあります。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout   
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_system_status"
    android:title="@string/system_status"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal">

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical"
        android:layout_weight="4">
        <ListView
        android:id="@+id/list_video_feed"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        </ListView>
    </LinearLayout>

    <LinearLayout
        android:id="@+id/linear_layout_live_video"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical"
        android:layout_weight="1">

        <VideoView 
        android:id="@+id/video_view" 
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_gravity="center"
        />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/linear_layout_video_gallery"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical"
        android:layout_weight="1">

        <Gallery 
        android:id="@+id/gallery"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        />

        <VideoView 
        android:id="@+id/archived_video_view" 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        />

    </LinearLayout>

</LinearLayout>

私のコードでは、ギャラリーなしでビューからビデオを再生したい場合は、もう一方を非表示にします。

linearLayoutVideoGallery.setVisibility(GONE);
linearLayoutLiveVideo.setVisibility(VISIBLE);
playVideo();

問題は、archived_video_viewが一番上に留まり、ギャラリーだけが非表示になることです。任意のヒント?追加情報が必要な場合はお知らせください。ありがとう!

編集:これは、onCreate()内のメニュー項目を選択するための私のifステートメントです。うまくいけば、これが役立つでしょう。position==1をクリックしてからpostion==2をクリックすると、ギャラリーは表示されなくなりますが、archived_video_viewは一時停止されたままなので、ギャラリーがあったvideo_viewの一番上のスライバーしか表示されません。

          lv.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
                if (position==1) { //video gallery list item has been pressed
                    vvLive.stopPlayback();
                    linearLayoutLiveVideo.setVisibility(GONE);
                    linearLayoutVideoGallery.setVisibility(VISIBLE);
                    playArchivedVideo();

                }

                else if (position == 2) { //live video list item has been pressed
                    vvArchive.stopPlayback();
                    linearLayoutVideoGallery.setVisibility(GONE);
                    linearLayoutLiveVideo.setVisibility(VISIBLE);
                    playLiveVideo();
                }
            }
          });
4

1 に答える 1

4

VideoViewsはSurfaceViewsです。これらは、ウィンドウをハードウェアフレームバッファに効果的にポップすることで機能します。ただし、両方のSurfaceViewに表示し、両方のMediaPlayerで書き込みを行おうとしているハードウェアフレームバッファは1つだけです。したがって、複数のSurfaceViewをジャグリングしようとすると発生する可能性のあるレンダリングエラーが多数あり、そのようなエラーは異なるデバイス間で一貫していません。

最も簡単な答えはそれをしないことです。各VideoViewを個別のアクティビティに分離するか、レイアウトを再構築して、単一のビデオビューを共有できるようにします。

次の最も簡単な答えは、同時にそれをしないことです。2つのビデオビューを切り替えるときは、もう1つをアクティブにする前に、一方を削除します(ビュー階層から完全に削除します)。おそらく、その間にImageViewプレースホルダーを使用して、使用によってそのような切り替えが行われるときにUIの相対的な一貫性を維持します。

于 2011-04-18T15:10:20.857 に答える