Android VideoView changement d'orientation avec tampon de la vidéo

Je suis en train de reproduire la fonctionnalité de la dernière application YouTube sur le marché Android. Lorsque vous regardez une vidéo il y a deux mises en page, un portrait, qui fournit des informations supplémentaires, et un paysage qui offre une vue plein écran de la vidéo.

Android VideoView changement d'orientation avec tampon de la vidéo

YouTupe application en mode portrait

Android VideoView changement d'orientation avec tampon de la vidéo

Application YouTube en mode paysage

(Désolé pour le caractère aléatoire des photos, mais elles ont été les premières photos que j'ai pu trouver de la disposition réelle)

C'est assez facile à faire, normalement il suffit de spécifier une autre mise en page mise en page-la terre et tout sera bon. La chose que l'application YouTube n'est vraiment bien (et ce que j'essaie de reproduire), c'est que sur le changement d'orientation, la vidéo continue à jouer et ne pas avoir à re-mémoire tampon à partir du début.

J'ai compris que primordial onConfigurationChange() et la définition de nouvelles LayoutParameters va me permettre de redimensionner la vidéo sans forcer un rebuffer - cependant la vidéo, de façon aléatoire, à l'échelle de différentes largeurs/hauteurs lors de la rotation de l'écran à plusieurs reprises. J'ai essayé de faire toutes sortes de invalidate() appelle la VideoView, essayé d'appeler RequestLayout() sur le parent RelativeLayout conteneur et juste essayer autant de choses différentes que je peux, 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: je l'ai découvert dans le logcat certains intéressant de sortie qui arrive lorsque ma vidéo est tournée qui semble être le coupable, bien que je n'ai aucune idée de comment le résoudre:

Logcat de sortie lors d'un redimensionnement correctement (prend toute la fenêtre)

avis de l'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

Logcat de sortie lors d'un redimensionnement de manière incorrecte (prend la minuscule portion de plein écran)

avis de l'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 ce que "Overlay" est et pourquoi il n'est pas obtenir la bonne hauteur de la valeur?

  • Enfin obtenu ce travail en utilisant le nouveau Fragment de l'API et un TextureView, je sais que c'est une vieille question, mais j'ai posté ma solution ainsi donc, les gens pourraient voir le jour approche.
  • Cette réponse qui fonctionne pour moi - une seule ligne de code, puisque je l'ai déjà sous-classe VideoView stackoverflow.com/a/22101290/1458948
InformationsquelleAutor Mark G. | 2010-12-13