? ? ? ? 所謂流式布局指的是ViewGroup中同一行的寬度不足以容納下一個(gè)子view時(shí),進(jìn)行換行處理,而不需要考慮子view的大小幻枉,每一行的高度以其中最高者為準(zhǔn)。Talk is cheap, Show you the code诡蜓。
首先熬甫,應(yīng)當(dāng)集成ViewGroup,為了確定View的寬高,就必須重onMeasure(intwidthMeasureSpec, intheightMeasureSpec)万牺,為了確定子view的位置罗珍,必須重寫(xiě)onLayout(booleanchanged, intl, intt, intr, intb)。
關(guān)鍵代碼如下:
/**
* 如果加入當(dāng)前child脚粟,則超出最大寬度覆旱,則的到目前最大寬度給width,類加height 然后開(kāi)啟新行
*/
if(lineWidth + childWidth > sizeWidth - getPaddingLeft() - getPaddingRight()) {
width = Math.max(lineWidth,childWidth);// 取最大的
lineWidth = childWidth;// 重新開(kāi)啟新行核无,開(kāi)始記錄
// 疊加當(dāng)前高度扣唱,
height += lineHeight;
// 開(kāi)啟記錄下一行的高度
lineHeight = childHeight;
mLocationMap.put(child, newLocation(left,top + height,childWidth + left -childHorizontalSpace,height + child.getMeasuredHeight() + top));
}else{// 否則累加值lineWidth,lineHeight取最大高度
mLocationMap.put(child, newLocation(lineWidth + left,top + height,lineWidth + childWidth -childHorizontalSpace+ left,height + child.getMeasuredHeight() + top));
lineWidth += childWidth;
lineHeight = Math.max(lineHeight,childHeight);
}
這段代碼用來(lái)最終確定ViewGroup的寬高。其中mLocationMap已經(jīng)計(jì)算出了子view的位置,因此onLayout方法很簡(jiǎn)單噪沙,
protected voidonLayout(booleanchanged, intl, intt, intr, intb) {
intcount = getChildCount();
for(inti =0;i < count;i++) {
View child = getChildAt(i);
if(child.getVisibility() ==GONE)
continue;
Location location =mLocationMap.get(child);
child.layout(location.left,location.top,location.right,location.bottom);
}
}
效果如下:
源碼地址github上https://github.com/SharksLee/FlowLayout炼彪,覺(jué)得對(duì)你有幫助的話,順手給個(gè)星吧,另外動(dòng)動(dòng)你可愛(ài)的小手正歼,給個(gè)贊賞吧7怼!