Ich habe einen Dialog mit einem Layout innerhalb und eine SurfaceTexture
mit einem Video-Stream. Als ich die width
und height
aus dem Video erhalten, die Größe ich mein Layout wie folgt aus:Layout Breite und Höhe wird ignoriert
private void resizeView(final VideoFormatInfo info) {
final Size size = calculateSize(info.getWidth(), info.getHeight());
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
final ViewGroup.LayoutParams layoutParams = mInnerLayout.getLayoutParams();
layoutParams.width = size.x;
layoutParams.height = size.y;
Log.i(TAG, String.format("run: setting innerlayout bounds to %d,%d", size.x, size.y));
mInnerLayout.setLayoutParams(layoutParams);
}
});
}
Jetzt habe ich eine Vollbild-Taste, die das Layout auf den gesamten Bildschirm, um die Größe soll. Aber wenn ich es drücke, bleibt das Layout in einem kleinen Bereich des Bildschirms.
Wenn ich das Protokoll überprüfen, ist der richtige Wert auf size.x
und size.y
ist da (die Grenzen des Bildschirms), aber das Layout ist nicht richtig in der Größe geändert.
Das innere Layout wird einer benutzerdefinierten Ansicht namens "VideoPlayer" hinzugefügt. Ich stelle die Farbe des Videoplayer-Hintergrunds auf rot ein, wenn ich also auf Vollbild umschalte, wird der ganze Bildschirm rot, mit Ausnahme des Videostreams in der Mitte. Dies bedeutet, dass die zugrunde liegende Ansicht richtig skaliert wird, aber das innere Layout nicht aus irgendeinem Grund ist.
Lustig ist, ich habe ein anderes Layout über das Video rendern, das einen "Flash-Effekt" erzeugt, um einen Kamerablitz bei der Aufnahme eines Schnappschusses zu simulieren. Wenn dieser Flash-Effekt ausgelöst wird, wird die Größe des Videos auf den gesamten Bildschirm angepasst.
Das ist also mein Layout Baum:
VideoPlayerView (CustomView, not VideoView)
innerLayout (RelativeLayout)
videoSurfaceTexture (SurfaceTextureView)
flashLayout (RelativeLayout)
Ich habe dies auch für das Debugging:
@Override
public void onSurfaceTextureSizeChanged(final SurfaceTexture surfaceTexture, final int width, final int height) {
Log.d(TAG, "onSurfaceTextureSizeChanged size=" + width + "x" + height + ", st=" + surfaceTexture);
Log.i(TAG, String.format("innerlayout bounds are %d,%d", mInnerLayout.getLayoutParams().width, mInnerLayout.getLayoutParams().height));
}
und die Werte auf dem inneren Layout sind die richtigen Werte (die des ganzen Bildschirm) wenn ich Fullscreen drücke, aber das Layout wird nicht verändert. Ich kann sagen, dass das Layout nicht in der Größe geändert wird, weil ich die Hintergrundfarbe auf grün änderte und etwas Polsterung hinzufügte, und ich kann es in der Mitte des Bildschirms sehen, indem ich einen kleinen Platz einnehme.
Es sieht so aus, als ob die Ansicht nicht mit den Layoutänderungen aktualisiert wird.
Mir gehen hier die Ideen aus. Ich versuchte invalidate()
, postInvalidate()
und forceLayout()
, aber diese funktionieren nicht.
Versuchen mit der richtigen 'LayoutParams' Klasse (immediate Container parent) statt' ViewGroup.LayoutParams' ... – Shaishav
@Shaishav dass nun versucht, ohne Erfolg :( –
haben Sie versucht es während Es gibt kein Video-Streaming? !! –