2013-03-09 14 views
7

Desidero poter visualizzare un pulsante per avviare un video, centrato nella stessa vista in cui verrà riprodotto il video (con una visualizzazione video). Voglio anche che il pulsante scompaia dopo aver fatto clic su di esso, dal momento che sto usando la classe MediaController per eseguire azioni di Pausa, Riavvolgimento, Avanzamento veloce una volta che il video è stato avviato.Mostrare e nascondere un pulsante di riproduzione su una visualizzazione video su Android

Come posso fare?

Ecco il layout che ho finora:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/LinearLayout1" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical"> 

<FrameLayout 
    android:id="@+id/video_frame" 
    android:layout_width="fill_parent" 
    android:layout_height="480px" 
    android:background="#000" 
    > 

    <VideoView 
    android:id="@+id/video_view" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    /> 

</FrameLayout> 

Ho provato a livello di codice l'aggiunta di un ImageButton al FrameLayout, ma questo non sembra funzionare.

+0

Se ho capito bene, stai cercando di inserire un pulsante all'interno del VideoView? – crazylpfan

+0

Non tanto all'interno della VideoView quanto sopra. –

risposta

9

OK, ecco come ho risolto questo. Il file di layout è piuttosto semplice. Basta aggiungere un ImageButton dopo l'elemento VideoView:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/LinearLayout1" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical"> 

<FrameLayout 
    android:id="@+id/video_frame" 
    android:layout_width="fill_parent" 
    android:layout_height="480px" 
    android:background="#000" 
    > 

    <VideoView 
    android:id="@+id/video_view" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    /> 

    <ImageButton 
    android:id="@+id/play_button" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center_vertical|center_horizontal" 
    android:src="@drawable/ic_launcher" 
    /> 

</FrameLayout> 

I FrameLayout strati vista elemento suoi elementi figlio su uno sopra l'altro, nell'ordine in cui li definisce nel layout. Quindi l'ultimo elemento aggiunto nel layout viene disegnato sopra. Si noti che ImageButton ha questo attributo:

android:layout_gravity="center_vertical|center_horizontal" 

Questo attributo centra ImageButton nel FrameLayout.

Il trucco successivo è far sparire il pulsante ImageButton dopo aver fatto clic. Utilizzare il metodo setVisibility() sul ImageButton per fare questo:

// Setup a play button to start the video 
    mPlayButton = (ImageButton) findViewById(R.id.play_button); 
    mPlayButton.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      if (mPlayer.isPlaying()) { 
       resetPlayer(); 
      } else { 
       playVideo(videoUrl, mVideoView.getHolder()); 
       // show the media controls 
       mController.show(); 
       // hide button once playback starts 
       mPlayButton.setVisibility(View.GONE); 
      } 
     } 
    }); 
0

Invece di utilizzare un pulsante, provare a realizzare FrameLayout Clickable.

In alternativa, è sufficiente posizionare un pulsante sotto FrameLayout e, nel gestore eventi onClick, impostare la visibilità della vista su GONE.

EDIT: o provare qualcosa di simile: https://stackoverflow.com/a/7511535/826731

+0

Grazie per i suggerimenti! Ho fatto in modo di rendere il Frame cliccabile, ma avevo bisogno di dare all'utente qualche indicazione che il FrameLayout fosse utilizzabile. Quindi avevo ancora bisogno di disegnare qualcosa sopra la VideoView. Perché non un pulsante? Hai ragione a chiamare setVisibility() su View.GONE. Vedi la mia auto-risposta sopra. –

-1

C'è una caratteristica meno noto del FrameLayout chiamato primo piano Drawable. È possibile specificare un drawable che verrà reso nella parte superiore di tutti i bambini FrameLayout. Quindi:

mFrameLayout.setForegroundDrawable(mPlayDrawable); 

farà il trucco e il layout sarà più efficiente (meno visualizzazioni).

È possibile utilizzare le costanti gravità per allineare correttamente la drawable con

mFrameLayout.setForegroundGravity(Gravity.XXXX) 
Problemi correlati