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 语句。希望这会有所帮助。当我单击位置==1 然后位置==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 are SurfaceViews. They work by effectively popping a window through to the hardware framebuffer. But there is only one such hardware framebuffer that you are trying to show in both SurfaceViews, as well as write to with both MediaPlayers. Thus, there are numerous rendering errors that can occurs when trying to juggle multiple SurfaceViews, and such errors will not be consistent between different devices.

The simplest answer is don't do it. Isolate each VideoView into separate Activities, or reconstruct your layout so that you can share a single video view.

The next simplest answer is don't do it simultaneously. When switching between two video views, remove one (completely remove it from the View hierarchy) before activating another. Maybe use an ImageView placeholder in between to keep the UI relative consistent as the use makes such a switch.

于 2011-04-18T15:10:20.857 回答