2011-10-28 9 views
25

Non riesco a trovare un evento che sia in ascolto per lo stato di riproduzione. Sono principalmente interessato allo stato play/pause. Sto usando MediaController che ha un pulsante Play/Pause, ma ho un pulsante secondario che controlla anche Play/Pause. Usando il mio pulsante personalizzato, posso play/pause, ma se I play/pause utilizza il pulsante MediaControllerplay/pause, al momento non ho modo di cambiare l'immagine sul mio pulsante personalizzato play/pause per riprodurre o mettere in pausa.Evento per lo stato di riproduzione VideoView o MediaController riproduzione/pausa

C'è un evento che non conosco, quindi posso lavorare un po 'durante la riproduzione/pausa?

Questa è una domanda molto simile: How to catch event when click pause/play button on MediaController

risposta

81

Se si sta utilizzando il MediaController in combinazione con un VideoView, dovrebbe essere relativamente facile estendere quest'ultimo e aggiungere il proprio listener ad esso.

Il VideoView personalizzato sarebbe quindi simile a questo nella sua forma più elementare:

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

} 

utilizzo è identico ad usare un normale VideoView, con l'unica differenza è che ora possiamo collegare il nostro ascoltatore ad esso.

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

Infine, si può anche dichiarare che nel layout xml e gonfiare (come indicato sopra) - basta assicurarsi che il proprio utilizzo <package_name>.CustomVideoView. Esempio:

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

Genius! Grazie signore, ha funzionato perfettamente. +50 per te. Non vedo l'ora di conoscere java e conosco altre cose come lo script di azione. – Ronnie

+1

Felice di essere stato di aiuto. :) A proposito, una chiamata a 'super' viene di solito eseguita in concomitanza con l'override di un metodo. Sovrascrivendo stai fondamentalmente ridefinendo il metodo della classe base/super/genitore. Se chiami 'super' in un metodo sovrascritto, manterrai la sua funzionalità, che è ciò che vuoi fare se il tuo obiettivo è di * aggiungere * la funzionalità. A volte potresti voler * sostituire * la funzionalità, nel qual caso potresti ottenere il risultato desiderato non chiamando 'super'. –

+1

ok questo è quello che pensavo e molto utile sapere, grazie – Ronnie

1

si dovrebbe essere in grado di impostare il proprio MediaController.MediaPlayerControl e sovrascrivere pausa e iniziare

+1

se I '@ Override' metodi di pausa() start(), come posso fare come un metodo dispatchEvent (dispatchEvent è un metodo ActionScript) che posso ascoltare sul mio costume MediaController. Inoltre, voglio ancora tutti i comportamenti regolari di pausa e avvio, devo usare 'super' in questo caso? Mai veramente capito super – Ronnie

Problemi correlati