一、前言
這篇文章主要是對自己看過的自定義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
- onMeasure
- onLayout
- onSizeChanged
- onDraw
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事件分發
dispatchTouchEventonInterceptTouchEvent
onTouchEvent
onTouchListener
onClick
onLongClick
滑動衝突
View的滑動
Scrollerinvalidate和requestLayout的傳遞(要明白兩者之間的區別)
四、結束語
至此,文章的內容就結束了,上面主要是基於2D層面去介紹的,假如有興趣,大家還可以研究一下OpenGl、Camera等用法,讓你的自定義view效果看起來更絢麗。在這裏也給大家一些建議,千萬別一言不合就自定義,能夠用系統基礎的控件去實現的儘量用系統的,因爲系統自帶效率會更高一些(谷歌進行優化過了),而且自定義view需要耗費較長的時間,又不一定能保證有系統控件的那麼高的效率。
假如有什麼遺漏的,歡迎大家補充。