2013-03-09 37 views
7

Tôi muốn có thể hiển thị nút để bắt đầu video, căn giữa trong cùng một chế độ xem video sẽ phát (với VideoView). Tôi cũng muốn nút biến mất sau khi tôi nhấp vào nó, vì tôi đang sử dụng lớp MediaController để thực hiện các hành động Tạm dừng, Tua lại, Tua nhanh khi video đã bắt đầu.Hiển thị và ẩn nút phát qua VideoView trong Android

Làm cách nào để thực hiện việc này?

Dưới đây là cách bố trí tôi có cho đến nay:

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

Tôi đã cố gắng lập trình thêm một ImageButton đến FrameLayout, nhưng điều đó dường như không làm việc.

+0

Nếu tôi hiểu được điều này một cách chính xác, bạn đang cố gắng để đặt một nút bên trong VideoView? – crazylpfan

+0

Không quá nhiều bên trong VideoView như trên đầu trang của nó. –

Trả lời

9

OK, đây là cách tôi giải quyết này. Tệp bố cục khá đơn giản. Chỉ cần thêm một ImageButton sau yếu tố 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> 

Các FrameLayout lớp xem yếu tố phần tử con của nó trên đầu trang của mỗi khác, theo thứ tự bạn xác định chúng trong cách bố trí. Vì vậy, phần tử cuối cùng được thêm vào trong bố cục được vẽ trên đầu trang. Lưu ý rằng ImageButton có thuộc tính này:

android:layout_gravity="center_vertical|center_horizontal" 

Thuộc tính này tập trung ImageButton vào FrameLayout.

Bí quyết tiếp theo là lấy ImageButton biến mất sau khi được nhấp. Sử dụng phương pháp setVisibility() trên ImageButton để làm điều này:

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

Thay vì sử dụng nút, hãy thử làm FrameLayout Clickable.

Hoặc, bạn chỉ có thể đặt một nút bên dưới FrameLayout và, trong trình xử lý sự kiện onClick, đặt chế độ hiển thị của Chế độ xem thành GONE.

EDIT: hoặc thử một cái gì đó như thế này: https://stackoverflow.com/a/7511535/826731

+0

Cảm ơn bạn đã đề xuất! Tôi đã xem xét làm cho khung có thể nhấp, nhưng tôi cần cung cấp cho người dùng một số dấu hiệu cho thấy FrameLayout có thể hành động. Vì vậy, tôi vẫn cần vẽ thứ gì đó trên đầu VideoView. Tại sao không phải là một nút? Bạn đúng về gọi setVisibility() thành View.GONE. Xem tự trả lời của tôi ở trên. –

-1

Có một tính năng ít được biết đến của FrameLayout gọi là Foreground drawable. Bạn có thể chỉ định một đối tượng có thể vẽ được sẽ được hiển thị trên đầu trang của tất cả các trẻ em FrameLayout. Vì vậy:

mFrameLayout.setForegroundDrawable(mPlayDrawable); 

sẽ thực hiện thủ thuật và bố cục của bạn sẽ hiệu quả hơn (ít lượt xem hơn).

Bạn có thể sử dụng hằng số trọng lực để gắn kết đúng drawable với

mFrameLayout.setForegroundGravity(Gravity.XXXX) 
Các vấn đề liên quan