天天看點

Android 自定義View 三闆斧之三——重寫View來實作全新控件

 通常情況下,android實作自定義控件無非三種方式。

  Ⅰ、繼承現有控件,對其控件的功能進行拓展。

  Ⅱ、将現有控件進行組合,實作功能更加強大控件。

  Ⅲ、重寫view實作全新的控件

  本文來讨論最難的一種自定義控件形式,重寫view來實作全新的控件。

  首先,我們要明白在什麼樣的情況下,需要重寫view來實作一種全新的控件,一般當我們遇到了原生控件無法滿足我們現有的需求的時候,我們此時就可以考慮建立一個全新的view來實作我們所需要的功能。建立一個全新view實作自定義控件,無非分成這麼幾步:

  Ⅰ、在onmeasure()方法中,測量自定義控件的大小,使自定義控件能夠自适應布局各種各樣的需求。

  Ⅱ、在ondraw()方法中,利用哼哈二将(canvas與paint)來繪制要顯示的内容。

  Ⅲ、在onlayout()方法中來确定控件顯示位置。

  Ⅳ、在ontouchevent()方法處理控件的觸摸事件。

  相應的思維導圖如下:

Android 自定義View 三闆斧之三——重寫View來實作全新控件

  多說無益,我們通過幾個小案例,來講解到底如何實作自定義控件。

  一、一個帶有比例進度的環形控件

   首先看一下這個控件的示意圖:

Android 自定義View 三闆斧之三——重寫View來實作全新控件

  通過這個簡單的示意圖,我們對于項目所完成的比例,就一目了然了。通過這個簡單的示意圖,我們可以很快速的把這個圖形分成三個部分。Ⅰ、外層的環,Ⅱ、裡面的園,三、相應文字。有了這個思路以後,我們隻需要在ondraw()方法中一個個進行繪制罷了。我這裡為了簡單起見,把這個控件的寬度設定為螢幕的寬度。

  首先,還是老樣子,為自定義控件設定一些自定義屬性,便于調用者對其進行擴充,自定義屬性的設定代碼為:

  Ⅰ、textsize——對應中間文本文字的大小

  Ⅱ、text——對應中間文本

  Ⅲ、circlecolor——對應内圓的顔色

  Ⅳ、arccolor——對應外環的顔色

  Ⅴ、textcolor——對應文本的顔色

  Ⅵ、startangle——對應外環的起始角度

  Ⅶ、sweepangle——對應外環掃描角度

  緊接着,就是在自定義控件的初始化方法中來擷取這些自定義屬性:

  這裡在多說一嘴子,為了釋放更多的資源,一定要将typedarray這個對象進行資源的釋放。

  接下來,在onmeasure()方法中,初始化要繪制畫筆樣式,擷取螢幕的寬度,計算中間位置的坐标,以及指定外接矩形的寬高代碼如下:

 将我們設定的自定義屬性,設定給不同筆刷。

  做了這麼多準備以後,我們所需的就是在ondraw方法中繪制内圓、外環與文字。代碼如下:

 需要指出的是,畫環形需要在一個指定矩形區域畫取,并且要指定起始角度,掃描角度,這些變量都是自定義屬性。 

  這個自定義控件的最終的運作效果為:

Android 自定義View 三闆斧之三——重寫View來實作全新控件

  二、動态條形圖

  條形圖,應該在圖表展示系統中再普通不過的一種圖示了。靜态示意圖就像這樣:

Android 自定義View 三闆斧之三——重寫View來實作全新控件

   通過這個簡單的示意圖,我們所需要做的是,繪制一個個的矩形,然後将每一個矩形x坐标平移一定的機關,我們還看到這麼一個現象:每個條形圖的起始點不一緻,而終止點是一樣的。起始坐标用個random(随機函數)剛剛好,實作靜态條形圖就是這樣的思路:

   首先,在onmeasure()方法中計算出每個矩形寬與高,這裡為了友善起見,每個矩形預設的高為螢幕的高,每個矩形的寬這裡定義為螢幕的寬度乘以80%除以矩形的個數。然後根據寬與高來初始化筆刷(paint)。為什麼要根據寬與高來初始化筆刷了,這裡我為了使自定義view更加的逼真,我這裡使用lineargradient(線性渲染器)進行了渲染,這個對象需要使用矩形寬與高。需要指出來的是這個自定義控件是動态的,我隻需要ondraw方法不斷發生重繪,這裡為了防止控件重新整理太快,我這裡每隔300毫秒重新整理視圖。這個控件的完整源代碼如下:

  最終,運作效果如下:

Android 自定義View 三闆斧之三——重寫View來實作全新控件

  後記,通過這兩個簡單控件,相信大家對于自定義控件基本步驟有說了解,當然,要真正做好自定義控件的話,我們還需要按這個步驟一步步的來。任重而道遠。

  本人才疏學淺,懇請吐槽。

繼續閱讀