2013-03-09 12 views
7

Chcę móc wyświetlić przycisk, aby rozpocząć wideo, wyśrodkowany w tym samym widoku, w którym wideo będzie odtwarzane (z VideoView). Chcę również, aby przycisk zniknął po kliknięciu, ponieważ używam klasy MediaController do wykonywania pauzowania, przewijania do tyłu i przyspieszania po rozpoczęciu wideo.Pokaż i ukryj przycisk odtwarzania na VideoView w Androidzie

Jak to zrobić?

Oto układ mam tak daleko:

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

Próbowałem programowo dodając ImageButton do FrameLayout, ale to nie wydają się działać.

+0

Jeśli dobrze rozumiem to poprawnie, próbujesz umieścić przycisk wewnątrz VideoView? – crazylpfan

+0

Nie tyle w VideoView, ile nad nim. –

Odpowiedz

9

OK, oto jak I rozwiązać ten. Plik układu jest całkiem prosty. Wystarczy dodać ImageButton po element 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> 

The FrameLayout warstwy widok elementu jego elementy Dziecko na szczycie siebie w kolejności je zdefiniować w układzie. Tak więc ostatni element dodany w układzie zostanie narysowany na wierzchu. Zauważ, że ImageButton ma ten atrybut:

android:layout_gravity="center_vertical|center_horizontal" 

Ten atrybut wyśrodkowuje ImageButton w FrameLayout.

Następna sztuczka polega na tym, aby element ImageButton zniknął po kliknięciu. Użyj metody setVisibility() na ImageButton to zrobić:

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

Zamiast używać przycisku, spróbuj wykonać FrameLayout Clickable.

Alternatywnie, możesz po prostu umieścić Button poniżej FrameLayout i, w procedurze obsługi zdarzenia onClick, ustawić widoczność widoku na GONE.

EDIT: albo spróbować czegoś takiego: https://stackoverflow.com/a/7511535/826731

+0

Dzięki za sugestie! Spojrzałem na możliwość kliknięcia klatki, ale musiałem dać użytkownikowi pewną wskazówkę, że FrameLayout można wykonać. Nadal potrzebowałem narysować coś na wideoView. Dlaczego nie przycisk? Masz rację odnosząc się do wywołania setVisibility() do View.GONE. Zobacz moją własną odpowiedź powyżej. –

-1

Jest mniej znanych cechą FrameLayout nazywany Planie rozciągliwej. Możesz określić, która z nich będzie renderowana na górze wszystkich dzieci w FrameLayout. A więc:

mFrameLayout.setForegroundDrawable(mPlayDrawable); 

załatwi sprawę, a Twój układ będzie bardziej wydajny (mniej wyświetleń).

Można używać stałych grawitacji prawidłowo wyrównać rozciągliwej z

mFrameLayout.setForegroundGravity(Gravity.XXXX)