2016-08-16 3 views
6

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.

+0

Versuchen mit der richtigen 'LayoutParams' Klasse (immediate Container parent) statt' ViewGroup.LayoutParams' ... – Shaishav

+0

@Shaishav dass nun versucht, ohne Erfolg :( –

+0

haben Sie versucht es während Es gibt kein Video-Streaming? !! –

Antwort

2
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)); 
ViewGroup parent = ((ViewGroup)mInnerLayout.getParent()); 
parent.removeView(mInnerLayout); 
mInnerLayout.setLayoutParams(layoutParams); 
parent.addView(mInnerLayout);//you might need to get the index so you slot it in there. 

Dies tun.- (alle Gedanken)

EDIT

i did not möchte Erklärung hinzugefügt werden, da es alle Gedanken waren und ich brauchte zu überprüfen, ob es

arbeitet Aber die Erklärung für meinen Code LayoutParam s sind das, was die Parent verwendet, um ihre Kinder zu gestalten, daher ist es nur in dem Auslegepuls oder der Zeit nützlich. die layoutParams Objekt ändern macht das View Objekt schmutzig, andere Faktoren Notwendigkeit vor View ein schmutziges erfüllt werden soll, gelegt aus, damit ist, warum die Werte ändern, aber die View nicht geändert wird.

Sie auch genannt für Sie View.invalidate() und View.requestLayout() an diesem View oder Parent und es wird auch Ihr Problem lösen, ruft View.invalidate() allein nicht sofort tun, nur haben könnte. zB

layoutParams.width = size.x; 
layoutParams.height = size.y; 
Log.i(TAG, String.format("run: setting innerlayout bounds to %d,%d", size.x, size.y)); 
//re-setting the layout params is also not neccessary 
mInnerLayout.invalidate(); 
mInnerLayout.requestLayout();  

Der Grund der erste Ansatz Ihr Problem löst, weil die View entfernen, und hinzugefügt, die für eine Anrufe Aufbahrung zu

verarbeitet werden :) auch Sie sollten nur sie angenommen haben und lassen Sie die Bounty Periode abgelaufen :)

+0

Sie sind am wahrscheinlichsten Recht (kann es jetzt nicht testen), dass dies es lösen wird, gibt es einen Grund, warum meine Höhe und Breite ignoriert werden? –

+0

so wie es ging? @GabrielSanmartin – Elltz

1

Verwendung Inflator wie

View view = inflater.inflate(R.layout.item /* resource id */, 
 
             MyView.this /* parent */, 
 
             false /*attachToRoot*/);

für mehr Kontrolle Layout params of loaded view are ignored

+0

überprüfen Sie auch diese http://stackoverflow.com/questions/5026926/why-does-layoutinflator-ignore-the-layout-width-and-layout-height-layout-paramet –

+0

Ich blast nicht meine Ansichten, ich erstelle sie programmgesteuert . –

+0

bro diese http://stackoverflow.com/questions/4434027/android-videoview-orientation-change-with-buffered-video Sie werden wissen, wie Kraft Breite und Höhe verwenden –

4

Sie ein wichtiger Teil der forceLayout() verpasst:

Diese Methode ruft nicht requestLayout() oder forceLayout() auf dem Elternteil.

So machen die Eltern ein Layout auch tun:

mInnerLayout.setLayoutParams(layoutParams); 
mInnerLayout.forceLayout(); 
mInnerLayout.getParent().requestLayout(); 
+0

Keine Verbesserung :( –