android中自定義view需要了解哪些內容

一、前言

這篇文章主要是對自己看過的自定義view的一些知識進行一些彙總,不會對一些api的細節進行講解,所以篇幅不會太長,主要是幫助大家對自定義view進行了解,以及學習自定義view需要從哪些地方入手。

二、預備

1.爲什麼要自定義view

1)現有的view滿足不了我們的需求,界面的一些元素需要我們自己去繪製。

2)現有的view可以滿足我們的需求,自定義view只是爲了抽象,爲這個自定義view提供若干方法,可以將我們的一些內部邏輯封裝到裏面,方便調用,說簡單點就是提高代碼的複用率。

2.自定義view的好處

1)我們可以實現一些系統控件無法實現的絢麗效果,爲應用增色。

2)將一些比較通用的交互效果提取成自定義view,方便複用,減少不必要的重複勞動。

3)將控件的一些內部邏輯封裝到自定義view中,也能夠便於應用解耦,我們在使用的時候不必關心它的內部實現。

三、正題

1.自定義view分類

其實簡單的來分的話,自定義view我們可以分成兩大種:組合控件和完全自定義控件。再細分一下,我們還可以分成四種:直接繼承view,直接繼承viewgroup,繼承特定view,繼承特定viewgroup。當然分類的標準並不統一,進行分類只是幫助我們在進行自定義的時候更加明確自己的方向,所以不用糾結到底該怎麼去分類。

2.自定義view基礎

要想隨心所欲的去自定義view,我們首先需要了解一些基礎知識:

1)view的位置參數,即top、left、right、bottom,當然你必須也要知道view是按什麼標準來定義座標系的。

2)MotionEvent和TouchSlop

3)VelocityTracker、GestureDetector和Scroller

4)Configuration和ViewConfiguration(提供了一些標磚常量)

5)ViewDragHelper(實現一些拖拽效果)

6)View、SurfaceView、TextureView的區別

3.自定義view的流程

爲了讓大家可以更加形象的瞭解,先貼一張圖:



我們可以按照這個圖大致的走一下這個流程
  • Constructors
         我們一般會在這裏面進行一些參數的初始化,比如自定義屬性,paint的一些屬性設置等等。
  • onMeasure
         測量View及其子View的寬高屬性,這裏是屬性,而不僅僅是寬高的值。我們要清楚什麼時候我們需要去重寫onMeasure方法:一般是自定義的view是直接繼承view或者繼承自viewgroup。
  • onLayout
        確定View及其子View的佈局位置,也就是View及其子View在父容器中的座標位置。只有在自定義ViewGroup的時候需要重寫。
  • onSizeChanged
         View的大小發生改變時,將調用此函數,一個View的大小在繪製過程中可能發生改變,比如父View
  • onDraw
         View的內容繪製部分,也是實現自定義view最重要的一部分,你想實現什麼樣的效果,你就可以在系統提供給我們的canvas上面畫就行了。

4.自定義view的精髓

上面我也說道了onDraw是自定義view最重要的一部分,在這裏你可以自由發揮你的創造力和想象力,這時你就需要了解一些細節了。

     Canvas常用方法

          繪製圖形(點、線、矩形、橢圓、圓等)

         繪製文本(文本的居中問題,需要Paint知識)

         畫布的基本變化(平移、縮放、旋轉、傾斜)

         畫布的裁剪

         畫布的保存

     Paint常用方法

         顏色

         類型(填充、描邊)

         字體大小

         寬度

         對齊方式

         文字位置屬性測量

         文字寬度測量

         筆鋒

      Path常用方法

         添加路徑

         移動起點

         貝塞爾(二階、三階)

         邏輯運算

         重置路徑

         PathEffect

         Matrix

         PathMeasure

5.自定義view的拓展

如果上面的內容你都已經掌握了,那麼你應該是可以繪製出豐富多彩的自定義view了。但是這還不夠,這就好比一幅畫,雖已具形態,但是還差點睛之筆讓它活起來。我們給自定義view duang~duang~duang添加特效自然離不開動畫,這裏強烈推薦的是屬性動畫,不要問我爲什麼-_-。

    屬性動畫需要掌握的,標星的是重點!!!

      ObjectAnimator

      ValueAnimator

      AnimatorSet

      AnimatorListener和AnimatorListenerAdapter

      ※插值器(Interpolator)

      ※估值器(TypeEvaluator)

好了,現在我的自定義view也已經動起來了,是不是就大功告成了啊。NO,還不夠,我們還需要交互啊。so,看下面

     View事件分發

          dispatchTouchEvent
          onInterceptTouchEvent
          onTouchEvent
          onTouchListener
          onClick
          onLongClick
          滑動衝突

   View的滑動

          Scroller
          invalidate和requestLayout的傳遞(要明白兩者之間的區別)
      

四、結束語

至此,文章的內容就結束了,上面主要是基於2D層面去介紹的,假如有興趣,大家還可以研究一下OpenGl、Camera等用法,讓你的自定義view效果看起來更絢麗。在這裏也給大家一些建議,千萬別一言不合就自定義,能夠用系統基礎的控件去實現的儘量用系統的,因爲系統自帶效率會更高一些(谷歌進行優化過了),而且自定義view需要耗費較長的時間,又不一定能保證有系統控件的那麼高的效率。

假如有什麼遺漏的,歡迎大家補充。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章