自定義滾輪系列---WheelView實現的大概流程

WhelView滾輪控件的實現過程還是比較複雜,總共加起來有15個文件,很多人一看這麼多文件就懵了,不知道從哪裏下手,更不知道各個文件之間的關係,這篇文章我們將從該控件控件最主要的部分下手,當然也是最難的一部分—WheelView.class文件。

WheelView.class類文件它是繼承自View,所以說它就是一個自定義控件。平常我們自定義一些簡單的控件時,往往只要有一個類就夠了,讓它繼承自View或者ViewGroup,然後把所有的實現步驟都寫在裏面。但是如果對於一個比較複雜的控件來說,如果把所有的實現都寫在一個文件裏面,必定會出現代碼混亂、臃腫,邏輯結構不清晰等問題,所以對於實現一個複雜的控件來說是一種藝術,它不僅涉及到基本控件的使用,它還對算法,設計模式有一定的要求。

寫過自定義控件的人都知道,View定義了繪圖的基本操作,而基本操作又由三個函數完成:measure()、layout()、draw(),其內部又分別包含了onMeasure()、onLayout()、onDraw()三個子方法。關於自定義控件以及它的這三個方法的具體作用及實現在這裏就不跟大家詳細講解了。
我這裏推薦幾篇博客,希望對大家理解自定義View有幫助:
1、Android自定義控件
2、Android中View的繪製過程 onMeasure方法簡述 附有自定義View例子
3、繼承ViewGroup:重寫onMeasure方法和onLayout方法
4、onMeasure和onLayout理解

當然如果僅僅只是實現了這幾個方法,我們一般只能實現一些簡單的控件,一般是靜態的(內容不會有變化,或者變化不多的)控件,而如果我們要實現一些稍微複雜的控件,比如界面會隨着手勢的移動而變化,手勢劃過之後進行翻頁等等,這時候我們就要對手勢進行監聽了,根據手勢的方向以及手指移動的距離來動態改變滾輪的內容。我們這裏要實現的WheelView控件就是要根據手勢的滑動來更新滾輪的內容,因此我們在WheelView中還重寫了onTouchEvent()方法。在源代碼中我們可以看到,WheelView的onTouchEvent()方法是調用了WheelScroller的onTouchEvent()方法,也就是說最終的手勢處理方法是在WheelScroller方法中處理的,下面是WheelView中一些方法的調用關係:
WheelView的幾個主要回調方法

在上面的onTouchEvent()方法中,我們看到了這樣一句,scroller.onTouchEvent();scroller是WheelScroller的實例,因此最終的手勢是交給了WheelScroller的onTouchEvent()方法來處理,onTouchEvent();的具體實現過程我們暫時不詳述,大家可以去看WheelScroller的源碼,下面是WheelScroller類的類圖結構:
這裏寫圖片描述
在上面的類圖中我們看到在WheelScroller類中定義了一個內部接口,ScrollingListener,它裏面定義了四個抽象的方法,我們這裏使用接口主要有以下幾個作用:
1、封裝思想的體現;
2、一種對那些在同一個地方使用的接口進行邏輯上分組;
3、嵌套接口可以增強代碼的易讀性和可維護性;
4、提高類的可擴展性
首先我們把相關的功能集中在一個接口裏面,體現了封裝思想;當然這些功能之間都有一定的相似性,關聯性,而且他們都在同一個地方使用到了,因此也是對它們進行了邏輯上的分組;另外由於把一些功能相近的功能放在一個接口中,接口中有哪些功能,一目瞭然,增強了代碼的可讀性;最後是提高了代碼的可擴展性,因爲接口最終是要被用戶實現的,而用戶在實現接口時具有很大的自由性,因此可擴展性很高。我們的接口是在WheelScroller中定義的,也是在WheelScroller中被調用的,但是他是在WheelView中實現的。
接口的使用可謂是一門藝術,一門哲學;把接口使用好了對編程有很大的作用,希望大家有興趣可以去了解接口,下面推薦幾篇關於接口的博客:
java類中定義接口的有哪些好處
Java中的內部接口
上面只是介紹了一下WheelView實現的大概流程,我們知道最終手勢事件是交給了WheelScroller中的onTouchEvent()方法來處理的,我們現在還不清楚onTouchEvent()方法如何對事件進行處理,關於如何處理我們在這一篇博客暫時不講。但是我們知道最終肯定是要進行滾動的,所以說滾動是最終的關鍵。所以我們接下來的問題是“它如何滾動呢,而且要實現平滑地滾動?”。平滑滾動主要是用到了一些手勢以及Scroller方面的知識,有興趣的話大家可以先去了解Scroller的源碼,以及手勢相關的知識,這對理解屏幕滾動有很大的幫助。我這裏也提供一些與Scroller相關知識的比較好的博文,希望對大家有幫助:
Scroll的用法
Scroller的應用–滑屏實現
從源碼出發:ScrollView實現以慣性滑動的形式滑動到任意位置/禁止慣性滑動/監聽慣性滑動
用戶手勢檢測-GestureDetector使用詳解

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