自定義控制項那些事兒 四 布局

2021-08-11 14:12:36 字數 3125 閱讀 5353

一、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,實現...