2016-08-16 183 views
6

我有一個內部佈局和一個SurfaceTexture與視頻流的對話框。當我收到widthheight從視頻,我調整我的佈局是這樣的:佈局寬度和高度被忽略

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); 
      } 
     }); 
    } 

現在我有一個全屏按鈕應該佈局調整到整個屏幕。但是當我按下它時,佈局仍保留在屏幕的一小部分區域。

當我檢查日誌時,size.xsize.y的適當值是否存在(屏幕邊界),但佈局沒有正確調整大小。

innerlayout被添加到名爲「VideoPlayer」的customView。我將錄像機背景的顏色設置爲紅色,所以當我切換到全屏時,整個屏幕會變成紅色,除了中間的視頻流。這意味着底層視圖正在適當調整大小,但innerLayout不是由於某種原因。

有趣的是,我在視頻渲染上創建了另一個佈局,創建了一個「閃光效果」以在拍攝快照時模擬相機閃光燈。當該閃光效果被觸發時,則視頻被調整到整個屏幕。

所以這是我的佈局樹:

VideoPlayerView (CustomView, not VideoView) 
    innerLayout (RelativeLayout) 
     videoSurfaceTexture (SurfaceTextureView) 
     flashLayout (RelativeLayout) 

我還設置這個調試:

@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)); 
      } 

和內佈局的值是合適的值(與整個屏幕的)當我按全屏時,但佈局沒有調整大小。我可以告訴它佈局沒有被調整大小,因爲我將它的背景顏色更改爲綠色並添加了一些填充,我可以在屏幕的中心看到它佔用很小的空間。

看起來好像不知道該視圖沒有被佈局更改更新。

我在這裏沒有什麼想法了。我試過invalidate(),postInvalidate()forceLayout(),但那些不起作用。

+0

用正確的'LayoutParams'類(直接父容器)嘗試,而不是'ViewGroup.LayoutParams' ... – Shaishav

+0

@Shaishav試過了,沒有用:( –

+0

做你嘗試它,而沒有視頻流?!! –

回答

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. 

這樣做。 - (所有的想法)

編輯

我不想加解釋,因爲它是所有的想法,我需要驗證其能否正常工作

但我的代碼的解釋是LayoutParam小號是Parent用於佈局子項的內容,因此它僅適用於佈局脈衝或時間。 更改layoutParams對象使得View對象,其他因素之前需要一個骯髒的View是奠定了得到滿足,所以這就是爲什麼值的變化,但View沒有改變。

你可以也剛剛呼籲特定ViewParentView.invalidate()View.requestLayout(),它也將解決你的問題,要求View.invalidate()並不會爲你瞬間做。例如

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();  

第一種方法解決你的問題是因爲View被刪除,並添加這就要求一個鋪出要處理

:)你也應該剛剛接受了它,並讓的原因賞金時間已過:)

+0

你很可能是正確的(現在不能測試它),這將解決它,但是有沒有一個原因,爲什麼我的身高和寬度被忽略? –

+0

所以它怎麼去?@GabrielSanmartin – Elltz

1

使用打氣筒一樣

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

更多的檢查Layout params of loaded view are ignored

+0

也檢查這個http://stackoverflow.com/questions/5026926/why-does-layoutinflater-ignore-the-layout-width-and-layout-height-layout-paramet –

+0

我不膨脹我的意見,我創建它們編程。 –

+0

兄弟檢查這個http://stackoverflow.com/questions/4434027/android-videoview-orientation-change-with-buffered-video 你會知道如何使用武力寬度和高度 –

4

你錯過的forceLayout()一個重要組成部分:

此方法不調用requestLayout()forceLayout()對父母。

所以讓家長做一個佈局,以及:

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

沒有改進:( –