媒体播放器完成后如何清除表面支架?

时间:2012-08-10 04:36:33

标签: android surfaceview

我制作了一个带有surfaceview和mediaplayer的视频播放器。 我有10个视频和10个按钮。 如果点击每个按钮,则每个视频都在播放。

这是我的代码..

//onCreate   
holder = surfaceview.getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);


//Button1
if(mp == null)mp = new MediaPlayer();

mp.setDataSource(mediaplay_path);
mp.setDisplay(holder);
mp.setScreenOnWhilePlaying(true);
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
mp.prepare();
mp.start();


//Button2
if(mp != null){
    mp.stop();
    mp.reset();
}

mp.setDataSource(mediaplay_path2);
mp.setDisplay(holder);
mp.setScreenOnWhilePlaying(true);
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
mp.prepare();
mp.start();

//Button3~Button10 is same as Button2..
一切都很好。 我的自定义视频查看工作正常。 但是当视频转到下一个视频时,上一个视频的最后一个场景会保留一段时间并转到下一个视频场景。

我认为这是因为在播放下一个视频之前,之前的表面视图应该是清晰的。 但我不知道如何清除表面视图或表面支架。

我已经搜索了这个,但只能找到如何播放视频,而不是如何清除从媒体播放器中消失的表面视图。

请帮助我~~!

5 个答案:

答案 0 :(得分:7)

花了我两个星期来解决这个问题。通过将surfaceholder设置为TRANSPARENT,Android将破坏表面。然后将其设置回OPAQUE会创建一个“清除”曲面的新曲面。注意surfacecreate和surfacedestroy事件会触发,所以如果你有代码,请注意。我将一个imageview设置为黑色,使其呈现黑色背景。可能有更好的方法。

private void playVideoA() { 
     imageViewBlack.bringToFront();
     surfaceHolder.setFormat(PixelFormat.TRANSPARENT);
     surfaceHolder.setFormat(PixelFormat.OPAQUE);
     surfaceView.bringToFront();
     mediaPlayerA.setDisplay(surfaceHolder);
     //surfaceView.setAlpha((float) 0.01);
     mediaPlayerA.start();
};
private void prepareVideoA(String url) {
     try {
        mediaPlayerA = new MediaPlayer();
        mediaPlayerA.setDataSource(url);
        mediaPlayerA.prepareAsync();
        mediaPlayerA.setOnPreparedListener(this);
        mediaPlayerA.setOnCompletionListener(this);
        mediaPlayerA.setOnBufferingUpdateListener(this);
        mediaPlayerA.setOnInfoListener(this);
    } catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SecurityException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalStateException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
};
@Override
public void onPrepared(MediaPlayer mp) {
     playVideoA()
}

答案 1 :(得分:2)

video.getHolder().setFormat(PixelFormat.TRANSPARENT);
video.getHolder().setFormat(PixelFormat.OPAQUE);
video.setVideoURI(Uri.parse(temp));
video.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
      mp.start();
   }
});

它对我有用

答案 2 :(得分:1)

可能是您可以使用removeView删除旧的自定义视频,然后添加新视图

答案 3 :(得分:1)

SurfaceHolder具有lockCanvas方法,可让您直接绘制到Surface。使用drawColor的{​​{1}}方法将其填充为黑色。

也就是说,最好删除Canvas(由smile2you建议),因为这应该完全破坏SurfaceView并释放未使用的资源。并且确保在完成播放后在Surface上调用release。持有太多视频资源会导致您的应用崩溃。

答案 4 :(得分:0)

surfaceview.setVisibility(View.GONE);