Android 用戶(hù)界面---定制組件(Custom Components)
基于布局類(lèi)View和ViewGroup的基本功能,Android為創(chuàng)建自己的UI界面提供了先進(jìn)和強(qiáng)大的定制化模式。首先,平臺(tái)包含了各種預(yù)置的View和ViewGroup子類(lèi)---Widget和layout,可以使用它們來(lái)構(gòu)造自己的UI界面。 部分的可以利用的widget包括:Button、TextView、EditText、ListView、CheckBox、RadioButton、Gallery、Spinner、以及比較特殊用途的AutoCompleteTextView、ImageSwitcher和TextSwitcher。 其中可利用的布局是:LinearLayout、FrameLayout、RelativeLayout以及其他的布局。更多的例子請(qǐng)看“共通布局對(duì)象”。http://developer./guide/topics/ui/layout-objects.html 如果遇到了沒(méi)有預(yù)置的widget或layout的需求,可以創(chuàng)建自己的View子類(lèi)。如果只需要對(duì)既存的widget或layout進(jìn)行小的調(diào)整,那么只需簡(jiǎn)單的繼承widget或layout,并且重寫(xiě)它們的方法。 創(chuàng)建自己的View子類(lèi),以便能夠精準(zhǔn)的控制屏幕元素的外觀和功能。以下是用定制View對(duì)象來(lái)實(shí)現(xiàn)這種控制想法的一些例子: 1. 創(chuàng)建一個(gè)完全的定制化渲染的View類(lèi)型,如用類(lèi)似模擬電子控制的2D圖形來(lái)渲染的音量控制按鈕。 2. 把一組View組件組合成一個(gè)新的單一組件,制作一些像ComboBox(一個(gè)下拉列表和文本輸入域的組合)、雙面板選擇器(左右兩個(gè)列表面板,右邊的列表面板中的項(xiàng)目與左邊列表面板中的一個(gè)項(xiàng)目相關(guān)聯(lián))等組件。 3. 重寫(xiě)一個(gè)EditText組件在屏幕上的渲染的方法。 4. 捕獲一些像按鍵一樣的事件,并在某些定制的方法中處理它們(如游戲)。 基本方法 以下是創(chuàng)建自定義View組件需要要了解基本概要: 1. 自定義的View類(lèi)要繼承一個(gè)既存的View類(lèi)或其子類(lèi); 2. 在子類(lèi)重寫(xiě)父類(lèi)的一些方法。要覆寫(xiě)的父類(lèi)方法是用‘on’開(kāi)頭的,例如,onDraw()、onMeasure()和onKeyDown()等,這有點(diǎn)類(lèi)似于重寫(xiě)Activity或ListActivity的生存周期回調(diào)的on…事件。 3. 使用新的擴(kuò)展類(lèi),一旦完成,新擴(kuò)展的類(lèi)就能被用于替換基本的View對(duì)象。 提示:擴(kuò)展類(lèi)能夠作為使用它們的Acticity的內(nèi)部類(lèi)來(lái)定義。這樣對(duì)控制對(duì)它們的訪問(wèn)是有益的,當(dāng)然可以創(chuàng)建一個(gè)新的公共的View類(lèi),這樣就可以在應(yīng)用程序范圍內(nèi)來(lái)使用。 完全定制化的組件 完全定制化的組件能夠用于創(chuàng)建你所期望的顯示效果的圖形化組件。可以是看上去像舊的模擬儀表的圖形化VU儀表,或者是一個(gè)長(zhǎng)的歌詞視圖,有一個(gè)跳動(dòng)的球沿著歌詞移動(dòng),以便跟著這卡拉OK機(jī)歌唱,這兩種情況,無(wú)論如何組織內(nèi)置的組件都無(wú)法滿(mǎn)足要求。 幸運(yùn)的是,能夠使用任意自己喜歡的方法來(lái)創(chuàng)建組件的外觀和行為,唯一的限制就是你的想象力、屏幕的尺寸和可利用的處理能力(因?yàn)閼?yīng)用程序最終可能運(yùn)行在比桌面工作站處理能力要弱的設(shè)備上)。 以下是創(chuàng)建完全定制組件的步驟: 1. 毋庸置疑,能夠擴(kuò)展的最通用的視圖是View類(lèi),因此通常是繼承這個(gè)View類(lèi)來(lái)創(chuàng)建自己的新的組件; 2. 提供一個(gè)能夠從XML中獲取屬性和參數(shù)的構(gòu)造器,并且也能夠使用自己屬性和參數(shù)(如VU儀表的顏色和范圍,指針的寬度和阻尼等); 3. 創(chuàng)建組件中可能的事件監(jiān)聽(tīng)器、屬性訪問(wèn)器和修飾符以及盡可能準(zhǔn)確的行為等; 4. 覆寫(xiě)onMeasure()回調(diào)方法,如果想要組件顯示一些東西,也要覆寫(xiě)onDraw()回調(diào)。雖然它們都有默認(rèn)的行為,onDraw()回調(diào)默認(rèn)什么也不做,onMeasure()方法默認(rèn)的要設(shè)置組件的尺寸為100x100; 5. 覆寫(xiě)其他的需要on…方法。 擴(kuò)展onDraw()和onMeasure() onDraw()方法會(huì)把能夠?qū)崿F(xiàn)的任何想要的東西放到一個(gè)Canvas對(duì)象上,如2D圖形、標(biāo)準(zhǔn)或定制的組件、樣式化的文本、或其他任何能夠想到的東西。 注意:View類(lèi)不能使用3D圖形。如果要使用3D圖形,必須繼承SurfaceView類(lèi),而不是View類(lèi),并且要在一個(gè)獨(dú)立的線(xiàn)程中描畫(huà)。 onMeasure()方法有點(diǎn)復(fù)雜,它是組件和它的容器之間的渲染約束的關(guān)鍵部分。覆寫(xiě)onMeasure(),以便準(zhǔn)確高效的報(bào)告組件被包含部分的尺寸。由于來(lái)自父容器限制的要求,使得尺寸的測(cè)量有些復(fù)雜,并且組件的尺寸一旦被計(jì)算完成,就要調(diào)用setMeasureDimension()方法來(lái)保存測(cè)量的寬度和高度。如果在onMeasure()方法中調(diào)用setMeasureDimension()方法失敗,這個(gè)結(jié)果在測(cè)量時(shí)將是一個(gè)異常的值。 在上層看,實(shí)現(xiàn)onMeasure()方法的步驟如下: 1. 要用父容器的寬度和高度的計(jì)量規(guī)格來(lái)調(diào)用被覆寫(xiě)的onMensure()方法(widthMeasureSpec和heightMeasureSpec參數(shù)都是代表了尺寸的整數(shù)),這兩個(gè)參數(shù)應(yīng)該作為生成組件的寬度和高度的約束要求。對(duì)于這些規(guī)格約束類(lèi)型的完整說(shuō)明可以在View類(lèi)說(shuō)明的View.onMeasure(int,int)方法中找到。 2. 組件的onMeasure()方法應(yīng)該計(jì)算用于渲染組件所需的尺寸(寬度和高度)。組件應(yīng)該盡量保留在被傳入的規(guī)格范圍內(nèi),盡管它能夠選擇超出規(guī)格范圍(在這種情況下,父容器能夠選擇做的事情包括:裁剪、滾動(dòng)、拋出異常、或者要求onMeasure()方法用不同的尺寸規(guī)格再試)。 3. 一旦組件的寬度和高度被計(jì)算完成,就必須調(diào)用setMeasuredDimension(int width, int height)方法來(lái)保存計(jì)算結(jié)果。不這樣做就會(huì)拋出一個(gè)異常。 下表是framework調(diào)用View類(lèi)的其他標(biāo)準(zhǔn)方法:
定制View的例子 在API Demos中提供了一個(gè)定制的View對(duì)象的例子:CustomView。這個(gè)定制的View定義在LabelView類(lèi)中。 LabelView示例展示了很多定制組件的不同特征: 1. 繼承View類(lèi)的完全定制化的組件; 2. 參數(shù)化的帶有View填充參數(shù)(在XML中定義的參數(shù))方式構(gòu)造View對(duì)象。有一些填充參數(shù)使用通過(guò)這個(gè)View的父類(lèi)傳遞過(guò)來(lái)的,還有一些用于labelView對(duì)象而定義的定制的屬性; 3. 你所期望看到的標(biāo)準(zhǔn)的公共類(lèi)型的方法,如setText()、setTextSize()、setTextColor()等等; 4. 一個(gè)重寫(xiě)的onMeasure()方法,它決定和設(shè)置了組件的渲染尺寸。(注意:在LabelView類(lèi)中,實(shí)際的工作是由一個(gè)私有的measureWidth()方法來(lái)做的。) 5. 一個(gè)重寫(xiě)的onDraw()方法,它在提供的Canvas上描畫(huà)標(biāo)簽。 從這個(gè)示例的custom_view_1.xml中,能夠看到一些LabelView定制View的用法。實(shí)際上,可以看到android:命名空間參數(shù)和定制的app:命名空間的組合。這些app:參數(shù)是LabelView類(lèi)所承認(rèn)的并用于工作的一些定制化的屬性,并且這些參數(shù)在示例的R資源定義類(lèi)的styleable內(nèi)部類(lèi)中被定義。 |
|
|
來(lái)自: quasiceo > 《待分類(lèi)1》