2013-04-02 71 views
21

我正在使用VideoView組件來播放視頻。手動調用stopPlayback()後,我似乎無法清除VideoView顯示。我想重置VideoView,以便原始背景可見。Android VideoView在stopPlayback後清除顯示()

  1. 在VideoView組件中播放視頻。
  2. 選擇要播放的新視頻。
  3. VideoView卡在第一個視頻的最後一幀,直到下一個視頻開始。如果下一個視頻出現錯誤,則來自第一個視頻的靜態圖片仍會停留在此處。
  4. 如果我讓視頻播放到完成狀態,顯示將被清除。

我正在使用的代碼:基於所述VideoView.java源上

private VideoView videoViewer = null; 

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
... 
    if (videoViewer != null) { 
    videoViewer.setOnPreparedListener(new OnPreparedListener()); 
    } 
... 
} 

public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    if (videoViewer != null) { 
    videoViewer.stopPlayback(); 
    videoViewer.setVideoURI(Uri.parse("http://my_vido_url/playlist.m3u8")); 
    } 
} 

private class OnPreparedListener implements MediaPlayer.OnPreparedListener { 
    @Override 
    public void onPrepared(MediaPlayer mp) { 
    videoViewer.start(); 
    } 
} 

筆記,stopPlayback()採用對底層的MediaPlayer以下動作:

public void stopPlayback() { 
    if (mMediaPlayer != null) { 
    mMediaPlayer.stop(); 
    mMediaPlayer.release(); 
    mMediaPlayer = null; 
    } 
} 

回答

9

的我解決的解決方案,除非有人可以提供更好的解決方案,而是使用setBackgroundResource,這看起來很奇怪,因爲它似乎改變了前景資源。

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
... 
    videoViewer.setBackgroundResource(R.drawable.viewer_background); 
... 
} 

public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    if (videoViewer != null) { 
    videoViewer.stopPlayback(); 
    // Set the background back to the drawable resource to clear the current video when switching to a new one. 
    videoViewer.setBackgroundResource(R.drawable.viewer_background); 
    videoViewer.setVideoURI(Uri.parse("http://my_vido_url/playlist.m3u8")); 
    } 
} 

private class OnPreparedListener implements MediaPlayer.OnPreparedListener { 
    @Override 
    public void onPrepared(MediaPlayer mp) { 
    videoViewer.start(); 
    // Clear the background resource when the video is prepared to play. 
    videoViewer.setBackgroundResource(0); 
    } 
} 

我引用的繪製是一個簡單的layer-list使用自定義藍色背景和中心的標誌形象。

繪製\ viewer_background.xml:

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item> 
    <shape android:shape="rectangle"> 
     <solid android:color="@color/custom_blue" /> 
    </shape> 
    </item> 
    <item> 
    <bitmap android:src="@drawable/img_logo" 
     android:gravity="center" /> 
    </item> 
</layer-list> 

或者我也可以用setZOrderOnTop控制在表面視圖放置(你也可以定義在視頻查看的頂部另外的看法,切換能見度路):

videoViewer.setZOrderOnTop(false); 
videoViewer.setZOrderOnTop(true); 

或者我還可以使用setBackgoundColor來完成同樣的事情setBackgroundResource

videoViewer.setBackgroundColor(getResources().getColor(R.color.custom_blue)); 
videoViewer.setBackgroundColor(Color.TRANSPARENT); 
+0

當我這樣做,下一個回放仍然顯示前一幀的最後一幀。任何想法爲什麼會發生? – slhck

+0

實際的視頻幀被繪製在VideoView的「下面」表面上。在VideoView上設置背景會隱藏框架,但不會將其刪除。清除背景時,舊框架仍然存在。 – William

12

對我來說,有效的只是隱藏然後使用setVisibility顯示VideoView

public void clearCurrentFrame() { 
    videoView.setVisibility(GONE); 
    videoView.setVisibility(VISIBLE); 
} 

這是因爲我希望VideoView變得透明,不是純色。將背景設置爲透明不起作用 - 視頻幀仍然顯示。

+0

我剛收到一位來自匿名用戶的建議編輯,他說要將'videoView.stopPlayback();'作爲最後一行代碼。我無法驗證這是否有必要,但視頻需要停止才能正常工作。只是想留在這裏,以防止任何人:) – William

1

嗯,我沒有從這個線程解決方案的工作,所以我嘗試別的東西以下是爲我工作的解決方案,

new Handler().postDelayed(new Runnable() { 

    @Override 
    public void run() { 
     mVideoViewPlayList.setVisibility(View.GONE); 
     mVideoViewPlayList.setVisibility(View.VISIBLE); 
     mVideoViewPlayList.setVideoURI(Uri.parse(path)); 
    } 
}, 500); 
+0

沒有冒犯。我真的很想知道這些線的目的是什麼。 mVideoViewPlayList.setVisibility(View.GONE); mVideoViewPlayList.setVisibility(View.VISIBLE); –

+2

@PsyCoder在一些設備中,mVideoViewPlayList.setVideoURI(Uri.parse(path))纔會生效,直到可見性至少改變一次! –

+0

謝謝你的解釋。它可能會節省我的時間有一天:) –

0

恰好這個代碼:

videoView.setVideoURI(null); 
+0

請在您的答案中添加更多細節! –

+2

java.lang.NullPointerException:uriString 當我setUrl爲null時,它會壓縮我的應用程序。 –

+0

對我表示感謝 –

相關問題