一、onlayout布局出洞
onlayout具體實現中,主要執行在layout()方法上。分別為left,top,right,bottom。實則是確定了當前控制項的左上角和右下角,從而確定了當前控制項展示的區域。所以,對乙個view強制使用layout()方法,可以修改當前view所在的位置。在之後的屬性動畫實現中,就應用了這一特點。
達到理解整個布局過程作用,重寫viewgroup作為布局檔案,其中內部子view均採用已有控制項。從而避免較多的實現onmeasure()方法,導致整個過程的複雜。
二、初步實現
1,布局控制項viewgroup的實現
public class layoutview extends viewgroup
public layoutview(context context, attributeset attrs)
public layoutview(context context, attributeset attrs, int defstyleattr)
@override
protected void onlayout(boolean b, int left, int top, int right, int bottom)
//如果剩餘的空間不夠,則移到下一行開始位置
if (mpainterposx + width > mviewgroupwidth)
//執行childview的繪製
childview.layout(mpainterposx, mpainterposy, mpainterposx + width, mpainterposy + height);
//記錄當前已經繪製到的橫座標位置
mpainterposx += width;}}
@override
protected void onmeasure(int widthmeasurespec, int heightmeasurespec)
}
模仿linearlayout的實現,做乙個內部包含多個控制項的控制項。從左向右開始排列。當行距不夠時,切換下一行顯示。
注意點:
在類中使用tempheight變數,用於記錄當前行view的最高高度。換行以後的view只能在這個view之下,防止view之間的疊加。在換行中,要將tempheight歸零,第二行的高度不再以第一行的高度為最高值。
布局中使用:
<?xml version="1.0" encoding="utf-8"?>
展示效果:
三、內容完善
在以上的實現中,新增margin值是沒有效果的,當然不符合使用要求了!
1,修改控制項實現,新增布局layoutparams
在布局中優化布局計算,新增margin值影響。
public class layout2view extends viewgroup
public layout2view(context context, attributeset attrs)
public layout2view(context context, attributeset attrs, int defstyleattr)
@override
protected void onlayout(boolean b, int left, int top, int right, int bottom)
layout2view.layoutparams margins = (layout2view.layoutparams) (childview.getlayoutparams());
//childview占用的width = width+leftmargin+rightmargin
//childview占用的height = height+topmargin+bottommargin
//如果剩餘的空間不夠,則移到下一行開始位置
if (mpainterposx + width + margins.leftmargin + margins.rightmargin > mviewgroupwidth)
//執行childview的繪製
childview.layout(mpainterposx + margins.leftmargin, mpainterposy + margins.topmargin, mpainterposx + margins.leftmargin + width, mpainterposy + margins.topmargin + height);
mpainterposx += width + margins.leftmargin + margins.rightmargin;}}
@override
protected void onmeasure(int widthmeasurespec, int heightmeasurespec)
public static class layoutparams extends viewgroup.marginlayoutparams
}@override
public layoutparams generatelayoutparams(attributeset attrs)
}
2,使用修改
<?xml version="1.0" encoding="utf-8"?>
布局中新增margin值,展示效果如下:
原始碼傳送門
慢慢的都會成長起來的,不管經歷什麼,不管有多少傷痛,你都能習慣的展示雲淡風輕的微笑。
天塌下來,塞滿食物的嘴裡,再加一點雞腿!
自定義控制項那些事兒 二
一 引述 1 view屬性的初始化 2 view位置大小的量測 主要在onmeasure 中實現 3 view內部的布局關係展示,主要在onlayout 中實現 4 view的繪製,即是最後的展示效果 5 view互動事件的處理,實現view與目標物件的溝通。1 自定義控制項的屬性設定及對應值的獲取...
自定義布局控制項
本文介紹一種自定義控制項的方法,由控制項布局和控制項 2部分組成。效果為乙個自定義標題欄,由乙個按鈕 乙個文字 乙個按鈕組成,並定義了各子件的事件。一 title布局如下 二 如下。重寫構造器,在其中展開布局,找到子控制項繫結事件 public class titlelayout extends l...
WPF自定義控制項(四) 自定義控制項
原文 wpf自定義控制項 四 自定義控制項 在實際工作中,wpf提供的控制項並不能完全滿足不同的設計需求。這時,需要我們設計自定義控制項。這裡lz總結一些自己的思路,特性如下 下面舉例說說在專案中我們經常用到調音台音量條,寫乙個自定義控制項模擬調音台音量條。自定義控制項singnallight,實現...