public class FlowLayout extends ViewGroup {
private int mHorizonalSpace=8;
private int mVerticalSpace=8;
/** 當(dāng)前的流式布局不確定有幾行,可能有多行也可能沒有行.**/
private List<Line> mLines=new ArrayList<Line>();
private int mContainerWidth;
private int mContainerHeight;
/***
行對象
*/
private class Line
{
private int lineWidth=0;
private int lineHeight=0;
/**存放行的元素 **/
private List<View> views=new ArrayList<View>();
public int getLineWidth() {
return lineWidth;
}
public int getLineHeight() {
return lineHeight;
}
public List<View> getViews() {
return views;
}
// 還需要支持往行里面添加元素
public void addChild(View view) {
// 如果當(dāng)前行不存在這個元素的話就把元素添加進來
if (!views.contains(view)) {
// 測量
view.measure(0, 0);
if (views.size() ==0) {
// 當(dāng)前只有一個元素的,寬與高就由它決定
lineWidth += view.getMeasuredWidth() + mHorizonalSpace;
lineHeight = view.getHeight();
} else {
// 有不同高度的元素
lineWidth += view.getMeasuredWidth() + mHorizonalSpace;
lineHeight = Math.max(lineHeight, view.getMeasuredHeight());
}
views.add(view);
}
}
}
public FlowLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}
/**.xml 畫頁面, 所見即所得 */
public FlowLayout(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
/**.java new FlowLayout(context) 動態(tài)輸出*/
public FlowLayout(Context context) {
super(context);
init(context);
}
/*** 方法
@param context
*/
private void init(Context context) {
//setBackgroundColor(Color.BLUE);
}
/*** 方法 一懈贺。測量
@param widthMeasureSpec
@param heightMeasureSpec
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
mLines.clear();
// 一弄抬。容器它是占滿屏幕
mContainerWidth = MeasureSpec.getSize(widthMeasureSpec) - getPaddingLeft() - getPaddingRight();
// 二。高度是由行數(shù)決定茬故, 所以針對所有控件進行測量寬高,分行就可以算出行數(shù)了.
int childCount = getChildCount();
Line currLine = null;
for (int i = 0; i < childCount; i++) {
// 獲取每個元素
View child = getChildAt(i);
// 測寬高
child.measure(0, 0);
int cHeight = child.getMeasuredHeight();
int cWidth = child.getMeasuredWidth();
//為第一個元素創(chuàng)建行
if (mLines.size() == 0) {
// 新建一行
currLine = new Line();
mLines.add(currLine);
}
//如果未滿一行往里添加
int remainWidth = mContainerWidth - currLine.getLineWidth();
if (remainWidth >=cWidth) {
currLine.addChild(child);
} else {//存放空間不夠再新建一行
currLine = new Line();
mLines.add(currLine);
currLine.addChild(child);
}
}
//累加高度
mContainerHeight = 0;
for (int i = 0; i < mLines.size(); i++) {
if (i != (mLines.size() - 1)) {
mContainerHeight += mLines.get(i).getLineHeight() + mVerticalSpace;
} else {
mContainerHeight += mLines.get(i).getLineHeight();
}
}
// 使用包裹內(nèi)容的方式式把每一個元素計算出容器的寬與高,設(shè)置給當(dāng)前容器
setMeasuredDimension(mContainerWidth, mContainerHeight);
}
/*** 方法 二。擺放 left top bottom right
@param changed
@param l
@param t
@param r
@param b
*/
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
int lineLeft=0;
int lineTop=0;
for(int i=0;i<mLines.size();i++)
{
Line line = mLines.get(i);
int eachViewSpace=(mContainerWidth-line.getLineWidth())/line.getViews().size();
//容器空間
if(i>0)
{
//第二行開始top要累加
lineTop+=mLines.get(i-1).getLineHeight()+mVerticalSpace;
}
//對每一行中的元素進行擺放
List<View> views = line.getViews();
lineLeft=0;
for(int index=0;index<views.size();index++)
{
//把里面的每一個
View lineChild = views.get(index);
if (index > 0) {
// 本行中的第二個元素
lineLeft = views.get(index - 1).getRight() + mHorizonalSpace;
}
int cWidth = lineChild.getMeasuredWidth();
int cHeight = lineChild.getMeasuredHeight();
int mode=MeasureSpec.EXACTLY;//80+10 andoid_layoutWidth="90dp"
//創(chuàng)建measure使用數(shù)值的方式 MODE+SIZE
int measureWidth=MeasureSpec.makeMeasureSpec(cWidth+eachViewSpace, mode);
lineChild.measure(measureWidth, 0);//0代表使用包裹獲取寬高
//擺放
int cLeft=lineLeft;
int cTop=lineTop;
int cRight=cLeft+cWidth+eachViewSpace;
int cBottom=cTop+cHeight;
lineChild.layout(cLeft, cTop, cRight, cBottom);
}
}
}
/*** 方法 三。畫圖,一般不去重寫
@param canvas
*/
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
}
}
流式布局FlowLayout
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來摊趾,“玉大人币狠,你說我怎么就攤上這事±悖” “怎么了漩绵?”我有些...
- 文/不壞的土叔 我叫張陵,是天一觀的道長肛炮。 經(jīng)常有香客問我止吐,道長,這世上最難降的妖魔是什么侨糟? 我笑而不...
- 正文 為了忘掉前任碍扔,我火速辦了婚禮,結(jié)果婚禮上粟害,老公的妹妹穿的比我還像新娘蕴忆。我一直安慰自己,他們只是感情好悲幅,可當(dāng)我...
- 文/花漫 我一把揭開白布套鹅。 她就那樣靜靜地躺著,像睡著了一般汰具。 火紅的嫁衣襯著肌膚如雪卓鹿。 梳的紋絲不亂的頭發(fā)上,一...
- 文/蒼蘭香墨 我猛地睜開眼巷挥,長吁一口氣:“原來是場噩夢啊……” “哼桩卵!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起倍宾,我...
- 正文 年R本政府宣布哈雏,位于F島的核電站楞件,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏裳瘪。R本人自食惡果不足惜土浸,卻給世界環(huán)境...
- 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望彭羹。 院中可真熱鬧黄伊,春花似錦、人聲如沸派殷。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽毡惜。三九已至拓轻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間经伙,已是汗流浹背扶叉。 一陣腳步聲響...
推薦閱讀更多精彩內(nèi)容
- 1.介紹 流式布局的應(yīng)用還是很廣泛的,比如搜索熱詞宗挥、關(guān)鍵詞標(biāo)簽等乌庶,GitHub上已經(jīng)有很多這樣的布局了,但是還是想...
- 一、靜態(tài)布局(Static Layout)即傳統(tǒng)Web設(shè)計内列,網(wǎng)頁上的所有元素的尺寸一律使用px作為單位撵术。1、布局特...
- 本文所使用的FlowLayout來自于鴻洋大神的框架。正好現(xiàn)在在做項目需要用到交排。自己試著用了下划滋,具體可以看效果圖鴻...
- 今天是今日有所思第123天。 今天埃篓,聽“得到”知識新聞板塊处坪,說起萬維鋼與熊逸就精英之辯,于是回頭認真讀了此篇架专。 熊...
- 愿景: 1.2016年胶征,有兩項會計考試塞椎,中級會計師和三門專業(yè)階段注冊會計師,不為別的睛低,只是想好好證明自己案狠。 2.從...