2012-08-10 32 views
12

Yüzey görünümü ve mediaplayer ile bir video oynatıcı yaptım. 10 video ve 10 düğüme sahibim. , her bir düğmeyi tıklarsanız, her video oynatılır.Medya yürütücü bittiğinde yüzey tutucu nasıl temizlenmeli?

burada

benim kodudur ..

//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.. 

her şey yolunda. Özel video görüşüm iyi çalışıyor. ancak video bir sonrakine geçtiğinde, önceki videonun son sahnesi bir süre kalır ve bir sonraki video sahnesine döner.

Bunun nedeni, bir sonraki videonun oynatılmadan önce önceki yüzey görünümünün net olması gerektiğidir. ancak yüzey görünümünü veya yüzey tutucuyu nasıl temizleyeceğimi bilmiyorum.

Bunun için arama yaptım, ancak sadece videonun nasıl oynanacağını bulabilirim, mediaplayer'dan neşeyle belirlenen yüzey görünümünü nasıl temizleyeceğimi değil.

Lütfen bana yardım edin ~~!

cevap

1

Eğer Surface doğrudan çizmek sağlayacak lockCanvas yöntemleri vardır. Siyahla doldurmak için Canvas'un drawColor yöntemini kullanın.

Bu, SurfaceView'u (smile2you tarafından önerildiği gibi) kaldırmak için tercih edilebilir, çünkü bu, Surface'u tamamen yok etmeli ve kullanılmayan kaynakları serbest bırakmalıdır. Ve kesinlikle release'u MediaPlayer numaralı telefondan çaldıktan sonra aradığınızdan emin olun. Çok fazla video kaynağına dayanmak uygulamanızı kilitler.

+0

En iyi çözüm bu mu? Sonraki videodan önce SurfaceHolder'ı temizlemek için bir yol yok mu? –

+0

void ClearTextureView() { var cnv = _textureView.LockCanvas(); cnv.DrawColor (Android.Graphics.Color.Transparent, Android.Graphics.PorterDuff.Mode.Clear); _textureView.UnlockCanvasAndPost (cnv); } –

7

bu anlamaya iki haftamı aldı Yeni görünümü eklemek eski custome videoview kaldırmak için removeView kullanabilirsiniz olabilir. Yüzey sahibini TRANSPARENT olarak ayarlayarak, Android yüzeyi yok edecektir. Daha sonra tekrar OPAQUE değerine ayarlanması, yüzeyi "temizleyen" yeni bir yüzey oluşturur. Not surfacecreate ve surfacedestroy olayları patlayacaktır, bu yüzden kodunuz varsa dikkatli olun. Ben siyah bir arka plan vermek için siyah bir görüntü seti koydu. Bunun için belki daha iyi yollar var. SurfaceHolder

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() 
} 
+0

Neden SurfaceHolder üzerindeki lockCanvas'ı kullanmıyorsunuz ve yüzeyi siyahla doldurmuyorsunuz? – Dave

+1

'surfaceHolder.setFormat (PixelFormat.TRANSPARENT); surfaceHolder.setFormat (PixelFormat.OPAQUE);' benim için çalışıyor. Ama gerçekten ne yapıyor? –

+1

@MarceloFilho Teşekkür ederim adamım, benim için iyi çalışıyor – vuhung3990

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(); 
    } 
}); 

bana

0

surfaceview.setVisibility (View.GONE) için çalışmak;