电竞比分网-中国电竞赛事及体育赛事平台

分享

Android 用戶(hù)界面

 quasiceo 2014-04-10

Android 用戶(hù)界面---定制組件(Custom Components)

您的評(píng)價(jià):
     

基于布局類(lèi)ViewViewGroup的基本功能,Android為創(chuàng)建自己的UI界面提供了先進(jìn)和強(qiáng)大的定制化模式。首先,平臺(tái)包含了各種預(yù)置的ViewViewGroup子類(lèi)---Widgetlayout,可以使用它們來(lái)構(gòu)造自己的UI界面。

部分的可以利用的widget包括:Button、TextView、EditText、ListView、CheckBox、RadioButton、Gallery、Spinner、以及比較特殊用途的AutoCompleteTextViewImageSwitcherTextSwitcher。

其中可利用的布局是:LinearLayoutFrameLayout、RelativeLayout以及其他的布局。更多的例子請(qǐng)看“共通布局對(duì)象”。http://developer./guide/topics/ui/layout-objects.html

如果遇到了沒(méi)有預(yù)置的widgetlayout的需求,可以創(chuàng)建自己的View子類(lèi)。如果只需要對(duì)既存的widgetlayout進(jìn)行小的調(diào)整,那么只需簡(jiǎn)單的繼承widgetlayout,并且重寫(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ě)ActivityListActivity的生存周期回調(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()方法(widthMeasureSpecheightMeasureSpec參數(shù)都是代表了尺寸的整數(shù)),這兩個(gè)參數(shù)應(yīng)該作為生成組件的寬度和高度的約束要求。對(duì)于這些規(guī)格約束類(lèi)型的完整說(shuō)明可以在View類(lèi)說(shuō)明的View.onMeasureint,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)方法:

分類(lèi)

方法

說(shuō)明

Creation

Constructors

構(gòu)造器的調(diào)用有兩種類(lèi)型:1.在代碼中創(chuàng)建View對(duì)象;2.用布局文件填充View對(duì)象。第二種類(lèi)型應(yīng)該解析和應(yīng)用布局文件中的任何屬性定義。

onFinishInflate()

View對(duì)象和它的所有子對(duì)象都用XML填充完之后,調(diào)用這個(gè)方法。

Layout

onMeasure(int, int)

調(diào)用這個(gè)方法決定View對(duì)象及其所有子對(duì)象的尺寸要求。

onLayout(boolean,int,int,int,int)

當(dāng)View對(duì)象給它的所有子對(duì)象分配尺寸和位置時(shí),調(diào)用這個(gè)方法。

onSizeChanged(int,int,int,int)

當(dāng)View對(duì)象的尺寸發(fā)生改變時(shí),調(diào)用這個(gè)方法。

Drawing

onDraw(Canvas)

當(dāng)View對(duì)象渲染它的內(nèi)容時(shí),調(diào)用這個(gè)方法。

Event

onKeyDown(int,KeyEvent)

當(dāng)一個(gè)鍵的按下事件發(fā)生時(shí),調(diào)用這個(gè)方法

onKeyUp(int,KeyEvent)

當(dāng)一個(gè)鍵彈起事件發(fā)生時(shí),調(diào)用這個(gè)方法

onTrackballEvent(MotionEvent)

當(dāng)鼠標(biāo)軌跡球滾動(dòng)事件發(fā)生時(shí),調(diào)用這個(gè)方法。

onTouchEvent(MotionEvent)

當(dāng)觸屏事件發(fā)生時(shí),調(diào)用這個(gè)方法。

Focus

onFocusChanged(boolean,int,Rect)

當(dāng)View對(duì)象獲取或失去焦點(diǎn)時(shí),調(diào)用這個(gè)方法。

onWindowFocusChanged(boolean)

當(dāng)包含View對(duì)象的窗口獲得或失去焦點(diǎn)時(shí),調(diào)用這個(gè)方法。

Attaching

onAttachedToWindow()

當(dāng)View對(duì)象被綁定到一個(gè)窗口時(shí),調(diào)用這個(gè)方法。

onDetachedFromWindow()

當(dāng)View對(duì)象被從它的窗口中分離的時(shí)候,調(diào)用這個(gè)方法。

onWindowVisibilityChanged(int)

當(dāng)包含View對(duì)象的窗口的可見(jiàn)性發(fā)生改變時(shí),調(diào)用這個(gè)方法。

 

 

 

定制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)中被定義。

相關(guān)資訊  — 更多

相關(guān)文檔  — 更多

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多