15

Tôi đang cố gắng thay đổi neo động của MediaController theo các thay đổi định hướng. Và sau tất cả những nỗ lực của tôi, điều này không hoạt động khi cần thiết.Thay đổi vị trí MediaController khi xoay

Có lẽ bạn có thể chỉ ra sai lầm của mình.

Trong một vài từ:

chế độ Portrait:

  1. weightSum = 1.
  2. SurfaceView trọng lượng: 0,4
  3. MediaControllerHorizontalScrollView trọng lượng: 0,6
  4. MediaController luôn luôn vis ible và không hề giấu giếm

Chế độ phong cảnh:

  1. SurfaceView trọng lượng: 0.0 (toàn màn hình)

  2. MediaControlls = View.Gone (tôi cần phải thay đổi neo của nó để SurfaceView. Và bật lên trênTouch. Nhưng làm thế nào ??)


MÃ Mã sản phẩm:

player.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/root" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:keepScreenOn="true" 
    tools:context="tenkol.design.com.imbrecords.ActivityExoPlayer" 
    android:weightSum="1" 
    android:orientation="vertical"> 

    <FrameLayout 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:id="@+id/surface_wrapper" 
     android:layout_weight="0.4"> 

     <com.google.android.exoplayer.VideoSurfaceView 
      android:id="@+id/surface_view" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_gravity="center" /> 

     <View 
      android:id="@+id/shutter" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:background="@android:color/black" /> 
    </FrameLayout> 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_weight="0.6" 
     android:orientation="vertical"> 

     <FrameLayout 
      android:id="@+id/controls_wrapper" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginBottom="2dp"> 
     </FrameLayout> 

     <HorizontalScrollView 
      android:id="@+id/myGallery" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginTop="0dp"> 

      <LinearLayout 
       android:id="@+id/channelsScrollView" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:gravity="center" 
       android:orientation="horizontal" 
       android:paddingBottom="5dp" 
       android:paddingTop="5dp" 
       /> 
     </HorizontalScrollView> 

    </LinearLayout> 

</LinearLayout> 

mã với biến đổi:

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 

    if (Global.getScreenOrientation(this) == Configuration.ORIENTATION_LANDSCAPE) { 
     //hide action bar 
     getSupportActionBar().hide(); 
     if (myGallery != null) { 
      //hide HorizontalScrollView 
      myGallery.setVisibility(View.GONE); 
     } 
     //make surface fullscreen 
     surfaceWrapper.setLayoutParams(new LinearLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT, 0f)); 
     controlsWrapper.setLayoutParams(new LinearLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT, 0f)); 
     //hide mediaController 
     mc.hide(); 
     controlsWrapper.setVisibility(View.GONE); 
    } 
    if (Global.getScreenOrientation(this) == Configuration.ORIENTATION_PORTRAIT) { 
     //and here restore everything 
     getSupportActionBar().show(); 
     if (myGallery != null) { 
      myGallery.setVisibility(View.VISIBLE); 
     } 

     surfaceWrapper.setLayoutParams(new LinearLayout.LayoutParams(FrameLayout.LayoutParams.FILL_PARENT, FrameLayout.LayoutParams.FILL_PARENT, 0.4f)); 
     controlsWrapper.setLayoutParams(new LinearLayout.LayoutParams(FrameLayout.LayoutParams.FILL_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT, 0.6f)); 
     controlsWrapper.setVisibility(View.VISIBLE); 
    } 
} 

gì tôi đã cố gắng:

1) Khi Cảnh: tạo một mediaController và ràng buộc để xem gốc (không hoạt động):

mediaController.setAnchorView(root); 
    mediaController.setMediaPlayer(player.getPlayerControl()); 
    mediaController.setEnabled(true); 
    mediaController.show(3); 

2) Khi Cảnh: thay đổi neo của trước MediaController (Nah).

mc.setAnchorView(surfaceWrapper); 
    mc.show(3); 

3) giao diện surfaceChanged (vẫn không có):

@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
    if (Global.getScreenOrientation(this) == Configuration.ORIENTATION_LANDSCAPE) { 
     mc.setAnchorView(surfaceWrapper); 
     mc.setMediaPlayer(player.getPlayerControl()); 
     mc.setVisibility(View.VISIBLE); 
     mc.show(3); 
    } 
} 

Vì vậy, làm thế nào tôi có thể thay đổi neo 's MediaController-SurfaceView động trong chế độ LANDSCAPE?

P.S. Cho biết có cần thêm mã hay không.

+1

Tôi đang đối mặt với cùng một vấn đề, bạn đã tìm ra cách thực hiện? – Prudhvi

+3

@prudhvi, Rất tiếc là không. Nhưng tôi đã giải quyết vấn đề này một cách khó khăn. Tôi đã tạo 2 'MediaControllers' hoạt động như một và thiết lập các neo khác nhau cho chúng. Và bí quyết là giấu một trong số họ khi định hướng thay đổi. Vì vậy, trong chế độ phong cảnh tôi đã kiểm soát liên kết với 'VideoSurface' và trong bộ điều khiển chế độ chân dung được neo vào' LinearLayout' với các nút và nội dung. – AnZ

+0

Bạn có đang thực hiện việc này cùng với MediaPlayer Android chuẩn không? –

Trả lời

1

Vì bạn đang ghi đè lênĐịnh cấu hìnhThay đổi, tôi cho rằng hoạt động không cho phép Android quản lý thay đổi định hướng của nó và thay vào đó chọn tự làm mọi thứ. Điều này thường không phải là một ý tưởng tuyệt vời, và bạn đang phải đối mặt với nỗi đau của quyết định đó. :-(

Nếu tôi có thể đưa ra đề xuất: hãy để Android quản lý vòng đời của hoạt động của bạn và sử dụng các bố cục khác nhau (ví dụ: layout-land/views.xml và layout-port/views.xml). để thể hiện bố cục của bạn một cách tự nhiên trong XML mà không cần phải thực hiện các thay đổi mã điên.

Bạn có thể nói: Nhưng tôi muốn ExoPlayer không phải dừng lại, chuẩn bị và khởi động lại mọi thay đổi định hướng. Có một cách để làm việc xung quanh điều này

Chỉ cần tạo một ExoPlayer đơn, chuẩn bị nó ở lần tải đầu tiên và tiếp tục sử dụng một ví dụ đó (được lưu trữ trong một tĩnh hoặc một số singleton khác) với mỗi thể hiện hoạt động mới. etach các hoạt động cũ từ nó và gắn lại một cái mới khi nó đã sẵn sàng.

Nếu ExoPlayer hoạt động tương tự như MediaPlayer, thì tất cả điều này sẽ hoạt động OK.

+0

Đó chắc chắn là một cách tiếp cận tốt để giải quyết vấn đề! Cảm ơn câu trả lời của bạn. – AnZ

Các vấn đề liên quan