自帶的View滿足不了設(shè)計的要求,就需要自定義View控件螺句。1.首先要實現(xiàn)一個繼承自View的類煤痕。2.添加類的構(gòu)造方法梧宫,override父類的方法接谨,如onDraw,onMeasure等塘匣。3.如果自定義的View有自己的屬性脓豪,需要在values下建立attrs.xml文件,在其中定義屬性忌卤,同時代碼也要做修改扫夜。
構(gòu)造方法:
public MyView(Context context,AttributeSet attrs){
? ? ? ? ? ? ?super(context, attrs);
}
在xml文件(main.xml)中也需要進行如下操作:
<com.example.xhelloworld.NewView
? ? ? ?android:layout_width="wrap_content"
? ? ? ?android:layout_height="wrap_content"/>
至少在xml文件中寫上上面的內(nèi)容。其中com.example.xhelloworld.NewView 這句是需要顯示的控件所代表的類驰徊。com.example.xhelloworld是類的包名笤闯,NewView是類名。
完成上面的兩步之后就可以在代碼中實例化這個布局文件了棍厂。
自定義屬性設(shè)置(如果有自定義的屬性)
1.在values目錄下建立attrs.xml文件颗味,添加屬性內(nèi)容
2.在布局文件中添加新的命名空間xmlns,然后可以使用命名空間給自定義的空間設(shè)置屬性
3.設(shè)置完屬性之后牺弹,當(dāng)然還要對其進行處理浦马。在自定義View類中的構(gòu)造方法中進行處理
就是說张漂,我們這樣一個控件MyView晶默,需要2個自定義屬性textColor 和textSize
何謂命名空間? xmlns = xml name space.?
對于自定義View我們要加一個命名空間航攒,不能以android:開頭磺陡,所以我們隨便命名一個,名字沒有特別的考究漠畜,本例中我們用my仅政。 格式如上面的代碼所示,注意后面的這個包名是“我們當(dāng)前應(yīng)用的包名”盆驹,而不是自定義View所在的包名圆丹。
我們可以看到,下面有兩條以android:開頭的屬性躯喇,說明這兩個屬性是android命名空間下的辫封。然后兩條以my:開頭的屬性,說明這是我們自定義屬性命名空間下的廉丽。命名空間就是這個作用倦微,定義了命名空間才能使用這個空間下的屬性。查看源文件就知道正压,其實諸如android命名空間下的組件的屬性欣福,比如LinearLayout的width,其實就是 <attr name =" width"焦履,format= "float"/>
背后的事:View類的構(gòu)造方法:
·public view(Context context) ? ? ? ? ? ? ? ? ? ? ? ? ? ?//當(dāng)在代碼中創(chuàng)建對象時會被調(diào)用
·public?View?(Contextcontext,AttributeSetattrs) ? ? //這個方法是通過xml文件來創(chuàng)建一個view對象的時候調(diào)用雏逾。很顯然xml文件一般是布局文件,就是現(xiàn)實控件的時候調(diào)用郑临,而布局文件中免不了會有屬性的設(shè)置栖博,如android:layout_width等,對這些屬性的設(shè)置對應(yīng)的處理代碼也在這個方法中完成厢洞。