另外再說乙個控制項,先看效果圖:
使用**如下:
private void init()
}
很簡單,flowlayout繼承viewgroup,用addview將view新增進去就行,有興趣的童鞋可以寫乙個adapter方便使用,老規矩,本人一向喜歡直入主題,看原始碼實現:
public flowlayout(context context, attributeset attrs)
public flowlayout(context context)
可見構造方法沒有改變。
@override
protected void onmeasure(int widthmeasurespec, int heightmeasurespec)
// 測量每乙個孩子
measurechild(child, widthmeasurespec, heightmeasurespec);
// 記錄孩子到行中
if (mcurrentline == null)
if (mcurrentline.canadd(child)) else
} // 行的高度的累加
int heightsize = getpaddingtop() + getpaddingbottom();
for (int i = 0; i < mlines.size(); i++)
} // setmeasureddimension:設定自己寬度和高度
setmeasureddimension(widthsize, heightsize);
}
自定義view中的三方法之一,onmeasure中先是計算出了自身的寬度,再通知子view測量,這是為了得到子view的具體大小,在通過行容器判斷能否新增,如果不能新建一行,最後計算出自身的寬高設定。
@override
protected void onlayout(boolean changed, int l, int t, int r, int b)
} }
自定義view中的三方法之一,onlayout用於計算view放置的位置,left值交由line內部計算,這裡主要計算每個line的top。
line是flowlayout內部的封裝類,用來記錄描述 layout中的行的資訊,它只有乙個構造方法。
// 構造
public line(int maxwidth, int space)
mmaxwidth代表最大寬度,mspace代表間隙。
/** 布局 */
public void layout(int pleft, int ptop)
// 多餘的高度
int extraheight = mheight - height;
// 指定左邊距
int l = pleft;
// 指定上邊距
int t = (int) (ptop + extraheight / 2f + .5f);
// 右邊據
int r = l + width;
// 下邊據
int b = t + height;
// 設定控制項大小
view.layout(l, t, r, b);
// 左值計算
pleft += width + mspace;}}
這裡的主要方法就是這個onlayout,計算行內view所要安置的位置,具體的都寫了注釋,不多講。
最後同樣附上demo以供參考。
Android端流式布局
public class searchflowlayout extends viewgroup public searchflowlayout context context,attributeset attrs public searchflowlayout context context,att...
android 實現流式布局FlowLayout
import android.content.context import android.util.attributeset import android.util.log import android.view.view import android.view.viewgroup author ...
布局管理 流式布局
2007 11 16 14 18 使用流式布局管理器時,gui元件將按照新增入容器的順序自左而右排列在一行上,如果一行空間不足,則另起一行。預設情況下,元件是劇中排列的。可以通過改變面板的預設布局管理器來改變元件在每一行上的排列位置。語句示例如下 flowlayout fl new flowlayo...