小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

構建自定義組件

 My鏡像站 2012-02-10

Android中,你的應用程序程序與View類組件有著一種固定的聯系,例如按鈕(Button)、 文本框(TextView), 可編輯文本框(EditText), 列表框(ListView), 復選框(CheckBox), 單選框(RadioButton), 滾動條(Gallery), 微調器(Spinner), 等等,還有一些比較先進的有著特殊用途的View組件,例如 AutoCompleteTextView,ImageSwitcher和 TextSwitcher。除此之外,種類繁多的像 線性布局(LinearLayout), 框架布局(FrameLayout), 這樣的布局組件(Layout)也被認為是View組件,他們是從View類派生過來的。

你的應用程序就是這些控制組件和布局組件以某種方式結合顯示在屏幕上,一般來說這些組件對你來說基本夠用,但是你也應該知道你是可以通過類繼承創(chuàng)建 屬于自己的組件,一般可以繼承像View、Layouts(布局組件)這樣的組件,甚至可以是一些比較高級的控制類組件。下面我們說一下為什么要繼承:

  • 你可以為實現某種功能創(chuàng)建一個完全自定義風格的組件,例如用二維的圖形創(chuàng)建控制組件實現聲音的控制,就像電子控制一樣。
  • 你可以把幾種組件結合形成一個新的組件,你的組件可能同時包含ComboBox(一個能輸入的文本列表)和dual-pane selector control(左右兩個List窗口,你可以分配窗口每一項的從屬關系)等等。
  • 你可以創(chuàng)建自己的布局組件(Layout)。SDK中的布局組件已經提供了一系列的選項讓你打造屬于自己的應用程序,但是高級的開發(fā)人員會發(fā)現根據現有的Layout組件開發(fā)新的Layout組件是很有必要的,甚至是完全從底層開發(fā)新的組件。
  • 你可以覆蓋一個現有組件的顯示或功能。例如,改變EditText(可編輯文本)組件在屏幕上的顯示方式(可以參考Notepad的例子,里面教你如何創(chuàng)建一個下劃線的顯示頁面)。
  • 你可以捕獲像按鍵按下這樣的事件,以一些通用的方法來處理這些事件(一個游戲的例子)

基本方法(The Basic Approach )
完全自定義組件(Fully Customized Components )
定制組件的例子(Customized Component Example )
組件的混合(或者控制類的混合) (Compound Components (or Compound Controls) )
修改現有組件(Tweaking an Existing Component )

基本方法(The Basic Approach )
下面的一些步驟都比較概括,教你如何創(chuàng)建自己的組件:

   1. 讓你的類(Class)繼承一個現有的View 類或View的子類。
   2. 重載父類的一些方法:需要重載的父類方法一般以‘on’開頭,如onDraw(), onMeasure()和 onKeyDown()等等。
          * 這個在Activity 或則 ListActivity 派生中同樣適用,你需要重載一些生命周期函數和一些其他功能性的HOOK函數。
   3. 使用你的繼承類:一旦你的繼承類創(chuàng)建完成,你可以在基類能夠使用的地方使用你的繼承類,但完成功能就是你自己編寫的了。

完全自定義組件(Fully Customized Components)

完全自定義組件的方法可以創(chuàng)建一些用于顯示的圖形組件(graphical components),也許是一個像電壓表的圖形計量器,或者想卡拉OK里面顯示歌詞的小球隨著音樂滾動。無論那種方式,你也不能單純的利用組件的結合完成,無論你怎么結合這些現有的組件。

幸運的是,你可以以你自己的要求輕松地創(chuàng)建完全屬于自己的組件,你會發(fā)現不夠用的只是你的想象力、屏幕的尺寸和處理器的性能(記住你的應用程序最后只會在那些性能低于桌面電腦的平臺上面運行)。

下面簡單介紹如何打造完全自定義的組件:

   1. 最為通用的VIEW類的父類毫無疑問是View類,因此,最開始你要創(chuàng)建一個基于此類的一個子類。
   2. 你可以寫一個構造函數從XML文件中提取屬性和參數,當然你也可以自己定義這些屬性和參數(也許是圖形計量器的顏色和尺寸,或者是指針的寬度和幅度等等)
   3. 你可能有必要寫自己的事件監(jiān)聽器,屬性的訪問和修改函數和一些組件本身的功能上的代碼。
   4. 如果你希望組件能夠顯示什么東西,你很有可能會重載 onMeasure() 函數,因而你就不得不重載 onDraw() 函數。當兩個函數都用默認的,那么 onDraw() 函數將不會做任何事情,并且默認的 onMeasure() 函數自動的設置了一個100x100 —的尺寸,這個尺寸可能并不是你想要的。
   5. 其他有必要重載的on... 系列函數都需要重新寫一次。

onDraw()和onMeasure()

onDraw()函數將會傳給你一個 Canvas 對象,通過它你可以在二維圖形上做任何事情,包括其他的一些標準和通用的組件、文本的格式,任何你可以想到的東西都可以通過它實現。

注意: 這里不包括三維圖形如果你想使用三維的圖形,你應該把你的父類由View改為SurfaceView類,并且用一個單獨的線程。可以參考GLSurfaceViewActivity 的例子。

onMeasure() 函數有點棘手,因為這個函數是體現組件和容器交互的關鍵部分,onMeasure()應該重載,讓它能夠有效而準確的表現它所包含部分的測量值。這就有點 復雜了,因為我們不但要考慮父類的限制(通過onMeasure()傳過來的),同時我們應該知道一旦測量寬度和高度出來后,就要立即調用 setMeasuredDimension() 方法。

概括的來講,執(zhí)行onMeasure()函數分為一下幾個階段:

   1. 重載的onMeasure()方法會被調用,高度和寬度參數同時也會涉及到(widthMeasureSpec 和heighMeasureSpec兩個參數都是整數類型),同時你應該考慮你產品的尺寸限制。這里詳細的內容可以參考 View.onMeasure(int, int) (這個連接內容詳細的解釋了整個measurement操作)。
   2. 你的組件要通過onMeasure()計算得到必要的measurement長度和寬度從而來顯示你的組件,它應該與規(guī)格保持一致,盡管它可以實現一些規(guī) 格以外的功能(在這個例子里,父類能夠選擇做什么,包括剪切、滑動、提交異?;蛘哂貌煌膮涤忠淮握{用onMeasure()函數)。
   3. 一旦高度和寬度計算出來之后,必須調用setMeasuredDimension(int width, int height),否則就會導致異常。

一個自定義組件的例子(A Customized Component Example)

在 API Demos 中的CustomView提供了以一個自定義組件的例子,這個自定義組件在 LabelView 類中定義。

LabelView例子涉及到了自定義組件的方方面面:

    * 首先讓自定義組件從View類中派生出來。
    * 編寫帶參數的構造函數(參數可以來源于XML文件)。這里面的一些處理都已經在View父類中完成,但是任然有些Labelview使用的自定義組件特有的新的參數需要處理。
    * 一些標準的Public函數,例如setText(), setTextSize(), setTextColor()
    * 重載onMeasure()方法來確定組件的尺寸(注意:在LabelView中是通過一個私有函數measureWidth()來實現的)
    * 重載onDraw()函數把Lable顯示在提供的canvas上。

在例子中,你可以通過custom_view_1.xml看到自定義組件LabelView的用法。在XML文件中特別要注意的是android: 和app:兩個參數的混合運用,app:參數表示應用程序中被認為是LabelView組件的個體,這些也會作為資源在R類中定義。

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發(fā)現有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多