VideoView per abbinare l'altezza del genitore e mantenere il rapporto di aspetto

Ho un VideoView che è configurato in questo modo:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/player" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <VideoView android:id="@+id/video" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_centerInParent="true" android:layout_centerVertical="true" /> <ProgressBar android:id="@+id/loader" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" /> </RelativeLayout> 

Ma il VideoView corrisponde alla width del contenitore padre e quindi l'altezza viene impostata in base al rapporto di aspetto del filmato caricato.
Vorrei fare il contrario, voglio che il VideoView corrisponda all'altezza del genitore pur mantenendo intatto il rapporto di aspetto, il video sarà tagliato sui lati.

  • Visualizza rapporto fisso
  • Come get il frame corrente (come bitmap) per il facedetector android in un evento Tracker?
  • Ottieni la width / altezza della vista o la width / altezza del font / altre size prima della prima visualizzazione
  • Visualizza l'iniezione di dipendenza con il pugnale 2
  • Visualizzazioni sovrapposte in Android
  • Android: problema di formato video di MediaPlayer
  • Sono riuscito a estendere il VideoView per riempire il genitore, ma il rapporto di aspetto non viene mantenuto.

    Un'altra cosa è, sto aggiungendo MediaController al VideoView come questo:

     MediaController controllers = new MediaController(this) { @Override public void hide() { if (state != State.Hidden) { this.show(); } else { super.hide(); } } }; controllers.setAnchorView(videoView); videoView.setMediaController(controllers); videoView.setOnPreparedListener(new OnPreparedListener() { @Override public void onPrepared(MediaPlayer mediaPlayer) { controllers.show(); } }); 

    Questo funziona ottimamente e i controllori rimangono sempre, ma l'altezza dei controller non viene presa in considerazione quando si calcola where posizionare il video (dal momento che è verticalmente centrato).

    Le mie due domande poi sono:

    1. Come faccio a fare il VideoView corrispondere all'altezza del genitore ma mantenere il rapporto di aspetto?
    2. Come faccio a fare il VideoView tenere conto dell'altezza dei suoi controller?

    Grazie.

  • Android VideoView non riproduce video sequenziali
  • Rotazione di un VideoView Android
  • Modifiche VideoView & Fullscreen & Orientation - Android
  • 4 Solutions collect form web for “VideoView per abbinare l'altezza del genitore e mantenere il rapporto di aspetto”

    È necessario estendersi dalla visualizzazione video incorporata.

    Chiama setVideoSize prima di visualizzare la visualizzazione video, puoi get la dimensione video dalla miniatura estratta dal video.

    Così, quando viene chiamata l' onMeasure vista video, sia mVideoWidth mVideoHeight sono> 0.

    Se vuoi spiegare l'altezza dei controller, puoi farlo da soli nel metodo onMeasure .

    La speranza aiuterà.

     public class MyVideoView extends VideoView { private int mVideoWidth; private int mVideoHeight; public MyVideoView(Context context, AttributeSet attrs) { super(context, attrs); } public MyVideoView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public MyVideoView(Context context) { super(context); } public void setVideoSize(int width, int height) { mVideoWidth = width; mVideoHeight = height; } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // Log.i("@@@", "onMeasure"); int width = getDefaultSize(mVideoWidth, widthMeasureSpec); int height = getDefaultSize(mVideoHeight, heightMeasureSpec); if (mVideoWidth > 0 && mVideoHeight > 0) { if (mVideoWidth * height > width * mVideoHeight) { // Log.i("@@@", "image too tall, correcting"); height = width * mVideoHeight / mVideoWidth; } else if (mVideoWidth * height < width * mVideoHeight) { // Log.i("@@@", "image too wide, correcting"); width = height * mVideoWidth / mVideoHeight; } else { // Log.i("@@@", "aspect ratio is correct: " + // width+"/"+height+"="+ // mVideoWidth+"/"+mVideoHeight); } } // Log.i("@@@", "setting size: " + width + 'x' + height); setMeasuredDimension(width, height); } } 
     public class MyVideoView extends VideoView { private int mVideoWidth; private int mVideoHeight; public MyVideoView(Context context, AttributeSet attrs) { super(context, attrs); } public MyVideoView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public MyVideoView(Context context) { super(context); } @Override public void setVideoURI(Uri uri) { MediaMetadataRetriever retriever = new MediaMetadataRetriever(); retriever.setDataSource(this.getContext(), uri); mVideoWidth = Integer.parseInt(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH)); mVideoHeight = Integer.parseInt(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT)); super.setVideoURI(uri); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // Log.i("@@@", "onMeasure"); int width = getDefaultSize(mVideoWidth, widthMeasureSpec); int height = getDefaultSize(mVideoHeight, heightMeasureSpec); if (mVideoWidth > 0 && mVideoHeight > 0) { if (mVideoWidth * height > width * mVideoHeight) { // Log.i("@@@", "image too tall, correcting"); height = width * mVideoHeight / mVideoWidth; } else if (mVideoWidth * height < width * mVideoHeight) { // Log.i("@@@", "image too wide, correcting"); width = height * mVideoWidth / mVideoHeight; } else { // Log.i("@@@", "aspect ratio is correct: " + // width+"/"+height+"="+ // mVideoWidth+"/"+mVideoHeight); } } // Log.i("@@@", "setting size: " + width + 'x' + height); setMeasuredDimension(width, height); } } 

    Ho risolto questo problema con il layout. Sembra che ha funzionato bene quando è stato fissato agli angoli, ma ha causato il video di inclinazione. Per testare ho cambiato il background del mio layout relativo a # 990000 per vedere il passaggio rosso.

     <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/relative_parent" android:background="#000000"> <VideoView android:layout_alignParentLeft="true" android:layout_alignParentRight="true" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerInParent="true" android:focusable="false" android:focusableInTouchMode="false" android:id="@+id/videoView" /> </RelativeLayout> 

    Spendo tempo a cercare questo su Internet non ho trovato alcuna soluzione migliore che può applicarsi alla visualizzazione video predefinita. Così ho cercato per le librerie che risolverà il mio requisito finalmente ho trovato uno 'FullscreenVideoView' ( https://github.com/rtoshiro/FullscreenVideoView ) questo ha risolto il mio requisito

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.