2017-02-26 62 views
0

我正在創建一個自定義視圖,該視圖的範圍爲LinearLayout。我在線性佈局中添加了一些形狀,目前它們之間具有固定的空間值。我通過定義LayoutParams並設置邊距來在這些形狀之間創建空間。如何知道小部件寬度是否設置爲wrap_content

我想要做的是將它們跨越整個屏幕的一個相等的空間,以便它們填充它,但只有當視圖的寬度設置爲match_parentfill_parent時。如果它設置爲wrap_content那麼應該設置原始的空間固定值。

我試着這樣做:

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 
{ 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
    int parentWidth = MeasureSpec.getSize(widthMeasureSpec); 
    spaceBetweenShapesPixels = (parentWidth - shapeWidth * numberOfShapes)/numberOfShapess; 
} 

但是,這種方法好像是叫兩次 - 一次父的寬度和高度,之後用於View的本身時,它的視圖本身,空間得到0值。

那麼,如何才使這個邏輯:

if(width is wrap_content) 
{ 
    space = 10; 
} 
else 
{ 
    space = (parentWidth - shapeWidth * numberOfShapes)/numberOfShapess; 
} 

回答

0

您應該使用WidthModeHeightModeonMeasure()方法。下面是一個樣本,從我的項目之一

@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
int widthMode = MeasureSpec.getMode(widthMeasureSpec); 
int heightMode = MeasureSpec.getMode(heightMeasureSpec); 
int measuredWidth = 0, measuredHeight = 0; 

if (widthMode == MeasureSpec.EXACTLY || widthMode == MeasureSpec.AT_MOST) { 
    measuredWidth = MeasureSpec.getSize(widthMeasureSpec); 
} 

if (heightMode == MeasureSpec.EXACTLY) { 
    measuredHeight = MeasureSpec.getSize(heightMeasureSpec); 
} else if (heightMode == MeasureSpec.AT_MOST) { 
    double height = MeasureSpec.getSize(heightMeasureSpec) * 0.8; 
    measuredHeight = (int) height;// + paddingTop + paddingBottom; 
} 
} 

MeasureSpec.EXACTLY - 這一觀點應該是完全如此多的像素,無論它實際上想有多大是。

MeasureSpec.AT_MOST - 如果視圖尺寸較小,視圖可以是這個尺寸或更小。

MeasureSpec.UNSPECIFIED - 視圖可以是任何大小,以顯示它需要顯示的內容。

請參閱此瞭解更多詳情https://stackoverflow.com/a/16022982/2809326

+0

我不明白它是如何做適合於我,我的問題寫道,僞代碼模板。基於模式的條件是什麼意味着用戶已將寬度設置爲wrap_content? –

相關問題