VideoView pour correspondre parent de la hauteur et de conserver les proportions
J'ai un VideoView qui est mis en place comme ceci:
<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>
Mais la VideoView correspond à la largeur du conteneur parent, et la hauteur est définie en fonction du rapport d'aspect de l'animation chargée.
Je voudrais faire tout le contraire, je veux que le VideoView à la hauteur du parent tout en gardant le ratio d'aspect intact, la vidéo est découpée sur les côtés.
J'ai réussi à étirer le VideoView pour remplir le parent, mais alors le ratio d'aspect n'est pas conservée.
L'autre chose est, je suis en ajoutant MediaController à la VideoView comme ceci:
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();
}
});
Cela fonctionne très bien, et les contrôleurs de toujours rester sur place, mais la hauteur des contrôleurs est de ne pas être pris en compte lors du calcul de l'endroit où placer la vidéo (puisque c'est centrée verticalement).
Mes deux questions sont:
- Comment puis-je faire la VideoView la hauteur de la mère, tout en conservant le ratio d'aspect?
- Comment puis-je faire la VideoView prendre en compte la hauteur de ses contrôleurs?
Grâce.
- Parlez-vous une WebView ou VideoView? Vous changer à mi-chemin vers le bas.
- Pour la première fois d'une question répondu à ma question au lieu de réponses!! Mon problème est que j'ai un espace blanc sous la vidéo en plein écran. J'ai été réglage de la
layout_height
àmatch_parent
. La solution était de le mettrewrap_content
et de donner à la mère un fond noir. Que, et d'avoir la VideoView centré verticalement dans son parent.
Vous devez vous connecter pour publier un commentaire.
Vous devriez s'étend à partir de l'intégré dans l'affichage de la vidéo.
Appel
setVideoSize
avant l'affichage de la vidéo est affichée, vous pouvez obtenir la taille de la vidéo à partir de vignette extraite de la vidéo.De sorte que, lors de l'affichage de la vidéo est
onMeasure
est appelé, à la foismVideoWidth
&mVideoHeight
sont > 0.Si vous voulez compte de la hauteur de contrôleurs, vous pouvez le faire vous-même dans le
onMeasure
méthode.L'espère, aideront.
mediaPlayer
pour héberger une vidéo à lavideoView
: vous ne pouvez pas utilisersetVideoUri
. Pour ce cas, lesetVideoSize
méthode est tout à fait bien. (btw, je suis en utilisant Xamarin (C#)).J'ai résolu ce problème avec la mise en page. Il semble qu'il a bien fonctionné quand il a été épinglé pour les coins, mais il a causé la vidéo de l'inclinaison. Pour tester j'ai changé ma relative de la disposition de fond à #990000 pour voir le rouge piquer à travers.
Concernant la question 1, je suis surpris, personne n'a évoqué la possible utilisation du lecteur multimédia du mode de mise à l'échelle.
https://developer.android.com/reference/android/media/MediaPlayer.html#setVideoScalingMode(int)
Il dispose de 2 modes. Deux d'entre eux toujours remplir la zone d'affichage. Pour l'obtenir pour remplir l'espace tout en préservant l'aspect ratio, donc le recadrage le côté le plus long, vous devez basculer sur le deuxième mode,
VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING
. Qui résout une partie du problème. L'autre partie est de changer VideoView de la mesure de comportement, tout comme certains des autres réponses démontrer. C'est la façon dont je l'ai fait, la plupart du temps hors de la paresse et ne sont pas familiers avec l'API de métadonnées que les autres, vous êtes les bienvenus pour utiliser cette méthode ou l'une des autres méthodes pour fixer la taille de la vue. La couverture de capture permet d'assurer la sécurité lorsque cette fonction est appelée avant mMediaPlayer existe, comme il peut être appelé plusieurs fois, et tombe aussi revenir à l'ancien comportement devrait le nom du champ changera jamais.Donc, en utilisant cette classe dans la mise en page, il suffit de changer le mode de mise à l'échelle sur le Lecteur où vous avez une chance. Tels que:
Rapide et efficace correctif:
Pas besoin de créer une vue personnalisée s'étendant à partir de VideoView. Il suffit d'assigner une valeur assez grande pour
android:layout_width
. Ceci permettra de définir leswidthSpecMode
de l'affichage de la vidéo àView.MeasureSpec.AT_MOST
et puis leonMeasure()
méthode de VideoView s'auto-ajuster sa largeur en gardant les proportions.Pour la première fois d'une question répondu à ma question au lieu de réponses!!
Mon problème est que j'ai un espace blanc sous la vidéo en plein écran. J'ai été réglage de la
layout_height
àmatch_parent
. La solution était de le mettre àwrap_content
et de donner à la mère un fond noir. Que, et d'avoir laVideoView
centré verticalement dans son parent.J'en ai essayé beaucoup de solutions, tandis que ma vidéo était toujours en 1000*1000 format, j'ai donc créé une solution facile pour les gens qui connaissent leur ratio d'aspect. Tout d'abord créer un VideoView dans un RelativeLayout comme ceci:
Alors avant de vous charger de la video changer la hauteur et par programme comme ceci:
Bien sûr, cela ne fonctionne qu'avec 1:1 ratio d'aspect, mais vous pouvez simplement utiliser votre ratio d'aspect pour modifier la hauteur ou la largeur.
Jobbert réponse dans Kotlin, au cas où quelqu'un en a besoin: