J'essaie de reproduire les fonctionnalités de la dernière application YouTube sur le marché Android. Lorsque l'on regarde une vidéo, il y a deux présentations distinctes, l'une en mode portrait qui fournit des informations supplémentaires, et l'autre en mode paysage qui fournit une vue plein écran de la vidéo.
L'application YouTupe en mode portrait
L'application YouTube en mode paysage
(Désolé pour le caractère aléatoire des photos, mais ce sont les premières photos que j'ai pu trouver de l'agencement actuel)
C'est assez facile à faire normalement - il suffit de spécifier une disposition alternative dans layout-land et tout ira bien. Ce que l'application YouTube fait vraiment bien (et que j'essaie de reproduire), c'est qu'en cas de changement d'orientation, la vidéo continue d'être lue et n'a pas besoin de recommencer la mise en mémoire tampon depuis le début.
J'ai compris que le fait de surcharger onConfigurationChange() et de définir de nouveaux LayoutParameters me permet de redimensionner la vidéo sans forcer un rebuffer - cependant la vidéo se redimensionne aléatoirement à des largeurs/hauteurs différentes lorsque l'on fait tourner l'écran plusieurs fois. J'ai essayé de faire toutes sortes d'appels invalidate() sur le VideoView, j'ai essayé d'appeler RequestLayout() sur le conteneur RelativeLayout parent et j'ai essayé autant de choses différentes que possible, mais je n'arrive pas à le faire fonctionner correctement. Tout conseil serait grandement apprécié !
Voici mon code :
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
questionText.setVisibility(View.GONE);
respond.setVisibility(View.GONE);
questionVideo.setLayoutParams(new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
} else {
questionText.setVisibility(View.VISIBLE);
respond.setVisibility(View.VISIBLE);
Resources r = getResources();
int height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 150.0f, r.getDisplayMetrics());
questionVideo.setLayoutParams(new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT, height));
}
}
EDIT : J'ai découvert dans logcat une sortie intéressante qui apparaît lorsque ma vidéo est tournée et qui semble être le coupable - bien que je n'aie aucune idée de la façon de le corriger :
Sortie de Logcat lors d'un redimensionnement correct (occupe toute la fenêtre)
Remarquez le h=726
12-13 15:37:35.468 1262 1270 I ActivityManager: Config changed: { scale=1.0 imsi=310/4 loc=en_US touch=3 keys=1/1/2 nav=1/1 orien=2 layout=34 uiMode=17 seq=210}
12-13 15:37:35.561 1262 1268 I TIOverlay: Position/X0/Y76/W480/H225
12-13 15:37:35.561 1262 1268 I TIOverlay: Adjusted Position/X1/Y0/W403/H225
12-13 15:37:35.561 1262 1268 I TIOverlay: Rotation/90
12-13 15:37:35.561 1262 1268 I Overlay : v4l2_overlay_set_position:: w=480 h=224
12-13 15:37:35.561 1262 1268 I Overlay : v4l2_overlay_set_position:: w=402 h=726
12-13 15:37:35.561 1262 1268 I Overlay : dumping driver state:
12-13 15:37:35.561 1262 1268 I Overlay : output pixfmt:
12-13 15:37:35.561 1262 1268 I Overlay : w: 432
12-13 15:37:35.561 1262 1268 I Overlay : h: 240
12-13 15:37:35.561 1262 1268 I Overlay : color: 7
12-13 15:37:35.561 1262 1268 I Overlay : UYVY
12-13 15:37:35.561 1262 1268 I Overlay : v4l2_overlay window:
12-13 15:37:35.561 1262 1268 I Overlay : window l: 1
12-13 15:37:35.561 1262 1268 I Overlay : window t: 0
12-13 15:37:35.561 1262 1268 I Overlay : window w: 402
12-13 15:37:35.561 1262 1268 I Overlay : window h: 726
Sortie du logcat lors d'un redimensionnement incorrect (occupe une petite partie du plein écran)
Remarquez le h=480
12-13 15:43:00.085 1262 1270 I ActivityManager: Config changed: { scale=1.0 imsi=310/4 loc=en_US touch=3 keys=1/1/2 nav=1/1 orien=2 layout=34 uiMode=17 seq=216}
12-13 15:43:00.171 1262 1268 I TIOverlay: Position/X0/Y76/W480/H225
12-13 15:43:00.171 1262 1268 I TIOverlay: Adjusted Position/X138/Y0/W266/H225
12-13 15:43:00.171 1262 1268 I TIOverlay: Rotation/90
12-13 15:43:00.179 1262 1268 I Overlay : v4l2_overlay_set_position:: w=480 h=224
12-13 15:43:00.179 1262 1268 I Overlay : v4l2_overlay_set_position:: w=266 h=480
12-13 15:43:00.179 1262 1268 I Overlay : dumping driver state:
12-13 15:43:00.179 1262 1268 I Overlay : output pixfmt:
12-13 15:43:00.179 1262 1268 I Overlay : w: 432
12-13 15:43:00.179 1262 1268 I Overlay : h: 240
12-13 15:43:00.179 1262 1268 I Overlay : color: 7
12-13 15:43:00.179 1262 1268 I Overlay : UYVY
12-13 15:43:00.179 1262 1268 I Overlay : v4l2_overlay window:
12-13 15:43:00.179 1262 1268 I Overlay : window l: 138
12-13 15:43:00.179 1262 1268 I Overlay : window t: 0
12-13 15:43:00.179 1262 1268 I Overlay : window w: 266
12-13 15:43:00.179 1262 1268 I Overlay : window h: 480
Peut-être quelqu'un sait-il ce qu'est la "superposition" et pourquoi elle n'obtient pas la bonne valeur de hauteur ?
0 votes
Je sais que c'est une question plus ancienne, mais j'ai posté ma solution aussi pour que les gens puissent voir une approche mise à jour.
0 votes
Cette réponse fonctionne pour moi - une ligne de code, puisque j'ai déjà sous-classé VideoView stackoverflow.com/a/22101290/1458948