Android自定義控制項總結

2021-08-08 22:46:31 字數 1853 閱讀 3805

android 為我們提供了豐富的ui元件,同時也提供了方便的擴充套件方法,通過繼承android的系統元件,可以方便的擴充套件現有功能,本文總結下我的自定義控制項學習歷程。

首先從最簡單的畫個圓開始,自定

義乙個控制項,顯示乙個藍色的圓形,由於不需要擴充套件功能,所以新建乙個類繼承view,控制項的繪製需要覆寫ondraw()函式來繪製view的顯示內容,重寫類的構造方法,初始化paint(相當於畫筆)

public class myview extends view 

public myview(context context, attributeset attrs, int defstyleattr)

public myview(context context, attributeset attrs)

private void init()

@override

protected void ondraw(canvas canvas)

}

在xml介面布局檔案中加入自定義的控制項,需要指明控制項的完整包名:

執行效果如下:

當改變控制項的寬高屬性時,你會發現「wrap_content」和「match_content」繪製出來的圓形是一樣的,都是按照「match_parent」的寬高來進行繪製的,實際上android在繪製view前,必須要對view進行測量,即需要告訴系統畫乙個多大的view,android系統為我們提供了三種測量模式:exactly、at_most、unspecified:

exactly:精準值模式,當控制項layout_width屬性或layout_height屬性指定為具體數值或者為match_parent(view父控制項的大小)時,使用exactly模式,例如上面藍色的圓測量的大小使用的是這種模式,使用不同數值,圓心位置也會發生變化。

at_most:最大值模式,當控制項的layout_width或layout_height屬性指定為wrap_content時,控制項大小隨著子控制項內容變化而變化,控制項的尺寸只要不超過父控制項最大尺寸即可

unspecified:不指定大小測量模式,通常在繪製自定義view時使用。

測量的過程在onmeasure()方法中進行,預設的測量模式是exactly,不重寫onmeasure()方法就只能使用exactly模式,所以我們繪製的圓形在設定寬高屬性為wrap_content時沒有變化,由於並沒有給出確切的寬高,所以exactly使用了match_parent的大小來繪製圓形,所以我們重寫onmeasure();通過判斷測量模式,給出不同的測量值,將測量的大小傳給setmeasuredimension()方法。

@override

protected void onmeasure(int widthmeasurespec, int heightmeasurespec)

private int measureheight(int measurespec)else

}return result;

}private int measurewidth(int measurespec)else

}return result;

}

現在設定我們自定義空間的大小屬性為wrap_content時,圓形控制項的大小將變為200*200,圓點中心也發生變化。

Android自定義控制項總結

android已經為我們提供了很多控制項,但是大多數控制項功能都比較單一簡單,不能滿足我們的需求,我們可以通過自定義控制項的方式來實現自己想要的功能。android實現自定義控制項的方式一般有三種,第一種是繼承現有的控制項,重寫相應的方法來擴充套件該控制項的功能 第二種是繼承view類或者viewg...

Android 自定義控制項

幹android也有一段的時間了,自定義這塊的東西覺得還是很有比較複習一下基礎的東西。自定義控制項和自定義元件基本上的使用都是在專案中基本的android控制項滿足不了需求的時候使用的。所以,如果要高出特別炫的特效,或者比較特殊的控制項排列方式,例如瀑布流,那麼就要好好學學自定義咯。首先,先簡單的介...

android自定義控制項

android自定義控制項 二 入門,繼承view 說說android 兩種為自定義元件新增屬性的使用方法和區別 自定義控制項的屬性 自定義控制項 今天花了3,4個小時看了自定義控制項,看 懂了,還沒有實踐,因為時間不夠,日後實踐。總結下 自定義控制項有3種方式 繼承已有控制項 繼承乙個容器控制項,...