Änderung der Android VideoView-Ausrichtung mit gepuffertem Video

Ich versuche, die im wesentlichen repliziert die Funktionalität der neuesten YouTube-app in den Android marketplace. Wenn ein video ansehen, es gibt zwei separate layouts, die man im portrait die zusätzliche info, und eine Landschaft bietet eine Vollbildansicht des Videos.

Änderung der Android VideoView-Ausrichtung mit gepuffertem Video
YouTupe-app im portrait-Modus

Änderung der Android VideoView-Ausrichtung mit gepuffertem Video
YouTube-app im landscape-Modus

(Sorry für die Zufälligkeit des Fotos, aber Sie waren die ersten Bilder die ich finden konnte, der das eigentliche layout)

Dies ist ziemlich einfach zu tun, die in der Regel - geben Sie einfach ein Alternatives layout im layout-land und alles wird gut. Die Sache, dass die YouTube-app ist wirklich gut (und was ich versuche zu replizieren, ist die Ausrichtung ändern, wird das video weiter abgespielt und nicht auf re-Puffer von Anfang an.

Habe ich herausgefunden, dass das überschreiben onConfigurationChange() und setzt neue LayoutParameters wird mir erlauben, die Größe des Videos, ohne dass ein rebuffer - aber das video wird nach dem Zufallsprinzip Skala zu unterschiedlichen breiten/Höhen bei der Drehung der Bildschirm mehrere Male. Ich habe versucht dabei alle Arten von invalidate() ruft auf der VideoView, versucht, Sie anzurufen, RequestLayout() auf dem parent-RelativeLayout container und versucht einfach so viele verschiedene Dinge, wie ich kann, aber ich kann nicht scheinen, um es richtig zu arbeiten. Jede Beratung würde sehr geschätzt werden!

Hier ist mein 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: ich habe entdeckt, dass in logcat einige interessante Ausgabe, die kommt, wenn mein video gedreht, das scheint die Täter - obwohl ich keine Ahnung habe, wie es zu lösen ist:

Logcat-Ausgabe wenn die Größe richtig (nimmt ganze Fenster)

beachten Sie die 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-Ausgabe wenn die Größe falsch (nimmt kleinen Teil der Vollbild)

beachten Sie die 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

Vielleicht jemand weiß, was 'Overlay' ist und warum es nicht immer die richtige Höhe?

InformationsquelleAutor der Frage Mark G. | 2010-12-13

Schreibe einen Kommentar