2011-10-28 13 views
25

Parece que no puedo encontrar un evento que escuche el estado de la reproducción. Estoy más interesado en el estado play/pause. Estoy usando MediaController que tiene un botón Play/Pause, pero tengo un botón secundario que también controla Play/Pause. Usando mi botón personalizado, que pueda play/pause, pero si play/pause usando el botón MediaControllerplay/pause, que actualmente no tienen ninguna manera de cambiar la imagen en mi botón personalizado play/pause entre jugar o hacer una pausa.Evento para el estado de reproducción de VideoView o MediaController reproducir/pausa

¿Hay algún evento que desconozca para poder trabajar durante la reproducción/pausa?

Esta es una pregunta muy similar: How to catch event when click pause/play button on MediaController

Respuesta

81

Si está utilizando el MediaController en combinación con un VideoView, debe ser relativamente fácil de extender este último y agregar su propio oyente a él.

El VideoView encargo sería entonces algo como esto en su forma más básica:

public class CustomVideoView extends VideoView { 

    private PlayPauseListener mListener; 

    public CustomVideoView(Context context) { 
     super(context); 
    } 

    public CustomVideoView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public CustomVideoView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    public void setPlayPauseListener(PlayPauseListener listener) { 
     mListener = listener; 
    } 

    @Override 
    public void pause() { 
     super.pause(); 
     if (mListener != null) { 
      mListener.onPause(); 
     } 
    } 

    @Override 
    public void start() { 
     super.start(); 
     if (mListener != null) { 
      mListener.onPlay(); 
     } 
    } 

    public static interface PlayPauseListener { 
     void onPlay(); 
     void onPause(); 
    } 

} 

uso es idéntico a utilizar un habitual VideoView, con la única diferencia de que ahora podemos conectar nuestro propio oyente lo.

// Some other code above... 
CustomVideoView cVideoView = (CustomVideoView) findViewById(R.id.custom_videoview); 
cVideoView.setPlayPauseListener(new CustomVideoView.PlayPauseListener() { 

    @Override 
    public void onPlay() { 
     System.out.println("Play!"); 
    } 

    @Override 
    public void onPause() { 
     System.out.println("Pause!"); 
    } 
}); 

cVideoView.setMediaController(new MediaController(this)); 
cVideoView.setVideoURI(...); 
// or 
cVideoView.setVideoPath(...); 
// Some other code below... 

Por último, también puede declarar que en su diseño xml y inflarlo (como se muestra arriba) - sólo asegúrese de que su uso <package_name>.CustomVideoView. Ejemplo:

<mh.so.CustomVideoView android:layout_width="wrap_content" 
    android:layout_height="wrap_content" android:id="@+id/custom_videoview" /> 
+0

Genius! Gracias señor, funcionó perfectamente. +50 a ti. No puedo esperar hasta saber java y saber otras cosas como el guión de acción. – Ronnie

+1

Me alegro de haber sido de ayuda. :) Por cierto, una llamada a 'super' generalmente se realiza junto con la anulación de un método. Al anular, básicamente estás redefiniendo el método de la clase base/super/padre. Si llama a 'super' en un método anulado, conservará su funcionalidad, que es lo que quiere hacer si su objetivo es * agregar * funcionalidad. En ocasiones, es posible que desee * reemplazar * la funcionalidad, en cuyo caso puede obtener el resultado deseado al no llamar a 'super'. –

+1

bien eso es lo que pensé y muy útil saber, gracias – Ronnie

1

usted debería ser capaz de establecer su propio MediaController.MediaPlayerControl y anular la pausa y empezar

+1

si '@ Override' los métodos de pausa de inicio()(), ¿cómo puedo hacer como un método dispatchEvent (dispatchEvent es un método de ActionScript) que puedo escuchar en mi costumbre MediaController. Además, todavía quiero todos los comportamientos regulares de pausa y comienzo, ¿uso 'super' en ese caso? Nunca realmente entendí super – Ronnie

Cuestiones relacionadas