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> 

はまた、私はまた、表面ビューが置かれた場所(あなたもVideoViewerの上に別のビューを定義し、その表示を切り替えることができ制御するsetZOrderOnTopを使用することができました道):

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

代わりに私もsetBackgroundResourceと同じことを達成するためにsetBackgoundColorを使用することができます。

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

私はこれを行う、次の再生はまだ前のものの最後のフレームを示しています。それがなぜ起こるかについてのアイデアは何ですか? – slhck

+0

実際のビデオフレームは、VideoViewの「下」のサーフェスに描画されます。 VideoViewで背景を設定すると、フレームは非表示になりますが、消去はされません。背景がクリアされると、古いフレームはまだそこにあります。 – William

12

私にとっては、を表示して非表示にしたのは、setVisibilityです。

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

私のために働いてくれてありがとう –

関連する問題