android中-自定義View對象(二)熱度 2 | 上一篇文 章我們了解android.view.View的原理而且制作了一個功能簡單的效果:點擊屏幕隨機在點擊的位置生成一個半徑是1-10的圓圈。我們是使用 一個自定義View對象完成的,但是它對View所做的修改有限,只是修改了onDraw和onTouchEvent兩個方法,這樣不能涵蓋整個自定義 View所能完成的功能。所以這里我們再補充下自定義View相關(guān)的一些內(nèi)容。 在SDK文檔中描述了View創(chuàng)建的幾個主要過程:
上面的列表很詳細(xì)的將View視圖從被創(chuàng)建(Creation)、構(gòu)建布局(layout)、執(zhí)行繪圖(drawing)、事件處理(Event Processing)、焦點處理(Focus)和被加載到Activity容器(Attaching)的 幾個過程所執(zhí)行的生命周期方法都列出來了。我們可以很清晰的看到它的整個處理過程,當(dāng)你需要自定義一個View的時候,你可以根據(jù)你自定義的View所要 完成的功能選擇性的重寫上面的幾個方法。以上一篇的畫實心圓為例,我們重寫了它的被創(chuàng)建、執(zhí)行繪圖和事件處理三個方法。 下面我們編寫一個自定義View對象,讓其可以通過xml文件配置一些自定義屬性,可手動設(shè)置大小,并在繪圖時添加一些自定義的圖形。 首先我們編寫一個類,繼承android.view.View對象,重寫里面的構(gòu)造方法(在構(gòu)造方法里獲取從xml布局文件中設(shè)置的自定義屬性并執(zhí)行初始化)、onMeasure方法(實現(xiàn)可以在xml配置文件中定義大小)和onDraw方法(繪制視圖內(nèi)容,同時在視圖對象的中間添加一條橫線),CustomLabelView.java:
上面代碼的一個難點是在于如何測量文字所占的尺寸,文字占用的寬度比較容易計算,但是高度就比較復(fù)雜,因為各個字體使用的間距不一樣。我們在所有三 個構(gòu)造方法中執(zhí)行初始化代碼,初始化代碼其實沒做什么,只是定義了一個畫筆對象,它的顏色是白色的,文字大小是16。這邊有三個構(gòu)造方法,它們分別對應(yīng)的 功能是不一樣的: CustomLabelView(Context) :這個構(gòu)造方法是當(dāng)程序中動態(tài)創(chuàng)建CustomLabelView這個對象時調(diào)用的。 CustomLabelView(Context,AttributeSet):這個構(gòu)造方法是當(dāng)你使用xml布局文件加載視圖對象時系統(tǒng)會調(diào)用的構(gòu)造方法,所以你可以在這個構(gòu)造方法里通過AttributeSet這個參數(shù)獲得在xml中對這個視圖對象定義的全部xml屬性。 CustomLabelView(Context,AttributeSet,int):這個構(gòu)造方法用得比較少,詳細(xì)用法我也不是很清楚。 我們在第二個構(gòu)造方法中獲取自定義的屬性,然后對View對象配置這些屬性,在這個步驟前記得要先定義這些可配置的屬性,否則就會報錯,具體是定義在res\values\attrs.xml文件中:
這樣你就可以在代碼中引 用:R.styleable.CustomLabelView,R.styleable.CustomLabelView_text和 R.styleable.CustomLabelView_backgroundColor屬性了。然后我們重寫了onMeasure方法,在里面做了一 些根據(jù)xml的配置測量View內(nèi)部內(nèi)容所占的尺寸的測量工作,最后調(diào)用setMeasureDimension通知系統(tǒng)測量的最終結(jié)果。 然后重寫onDraw方法,在這里我們添加了一個自己定義的步驟:在視圖所占區(qū)域的中間畫一條線,最后打出視圖中的內(nèi)容。 布局xml文件,res\layout\custom_view.xml:
在布局文件中我們創(chuàng)建一個LinearLayout容器,按照縱向排列放了3個自定義的視圖對象,這邊使用自定義視圖對象的方式是將xml的節(jié)點名 字換成你自定義View的類全路徑(包名+類名),然后就可以在節(jié)點的屬性中配置View的屬性。因為上面我們有用到自定義的屬性,所以需要自己創(chuàng)建一個 xml名稱空間,這個名稱空間的規(guī)范是:
其中xxx就是下面要引用到的名稱空間,yyy一定要是項目的包名(剛創(chuàng)建Android項目時填入的包名,也可以查看 AndroidMenifest.xml文件中menifest根節(jié)點中的package屬性,就是這個屬性值)。因為我項目的包名 是:com.android777.demo.uicontroller,所以我的xml名稱空間設(shè)置為:
然后我在自定義的View節(jié)點中,使用這個名稱空間配置在res\values\attrs.xml中定義的text和 backgroundColor屬性。這樣整個自定義View步驟就完成了,最后只需要一個Activity來查看效 果,CustomLabelViewActivity.java:
|
|
|