TimePicker源碼學習-TimePicker的結構,資料結構源碼學習

來源:互聯網
上載者:User

TimePicker源碼學習-TimePicker的結構,資料結構源碼學習

  雖然自己也看過很多的Android源碼,也看過很多別人寫的源碼分析,但是總覺得寫出來的東西並不能完全展現代碼作者所寫的東西或者自己看源碼的思維過程。(無法用言語形容)

  這篇文章對常用的時間選取器TimePicker源碼的總結,我可能不會從頭一步一步的分析原始碼,僅是我看完後的總結,當然也從中學習並應用後才有的總結。

  spinner: 

 

 

一、從TimePicker.java看起  1.TimePicker繼承FrameLayout,表明TimePicker只是用於布局而不是具體的繪製,具體的繪製view肯定在另外的地方畫,然後再布局到這個FrameLayout上面(這個很關鍵!為什嗎?) 
public class TimePicker extends FrameLayout{    //......       }

  2.首先從TimePicker構造方法看起

  在這裡看到了MODE_CLOCK和MODE_SPINNER,分別是TimePicker的兩種形式(可以在布局中對timePickerMode屬性設定clockt或者spinner,本文針對api23,目前發現android4.0是只有一種模式),一種對應TimePickerClockDelegate,另外一種對應的是TimePickerSpinnerDelegate。要注意this就是TimePicker,並且TimePicker被傳進了mDelegate 的構造參數裡面去。可以看到選擇時間器最後要在mDelegate中進行繪製並布局在mDelegate 中。

public TimePicker(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {    super(context, attrs, defStyleAttr, defStyleRes);    final TypedArray a = context.obtainStyledAttributes(            attrs, R.styleable.TimePicker, defStyleAttr, defStyleRes);    final int mode = a.getInt(R.styleable.TimePicker_timePickerMode, MODE_SPINNER);    a.recycle();    switch (mode) {        case MODE_CLOCK:            mDelegate = new TimePickerClockDelegate(                    this, context, attrs, defStyleAttr, defStyleRes);            break;        case MODE_SPINNER:        default:            mDelegate = new TimePickerSpinnerDelegate(                    this, context, attrs, defStyleAttr, defStyleRes);            break;    }}

   下面我們轉移到TimePickerClockDelegate,因為TimePickerSpinnerDelegate對相應的,沒有必要兩個都分析

二、再看TimePickerClockDelegate.java,

  1.也是從構造方法看起,

  在構造方法的中用一段inflate代碼,用於對layout檔案進行展開。可以看出,layout內容展開到delegator裡面,而這個就是TimePicker!!這時我們就知道為什麼TimePicker是繼承FrameLayout的了,從上面可以看到Timepicker構造的時候已經傳進來。

//下面是TimePickerClockDelegate.java的代碼:final int layoutResourceId = a.getResourceId(R.styleable.TimePicker_internalLayout,R.layout.time_picker_material);final View mainView = inflater.inflate(layoutResourceId, delegator);mHeaderView = mainView.findViewById(R.id.time_header);

  另外我們可以對比一下TimePickerClockDelegate和TimePickerSpinnerDelegate這段代碼,發現風格有點不一樣,可能是兩個人或者同一個人在不同的時間寫的,

//下面是TimePickerSpinnerDelegate.java的:final LayoutInflater inflater = LayoutInflater.from(mContext);inflater.inflate(layoutResourceId, mDelegator, true);// hourmHourSpinner = (NumberPicker) delegator.findViewById(R.id.hour);

  2.以下我再匯總了TimePickerClockDelegate的成員變數,並形成TimePicker的類圖結構

  從中你可以看到TimePicker用到的類的關係

  3.TimePickerClockDelegate是一個組合式的自訂view

  從TimePickerClockDelegate代碼你可以看到他裡面沒有onDraw方法,說明他是一個組合式的自訂view

   

  再從類圖中看他的成員變數和timepicker中clock顯示模式可以看出,錶盤是在RadialTimePickerView裡面畫的,即  

   RadialTimePickerVIew:時鐘式的時間選取器中的錶盤,      其他TextView:顯示的小時數和分鐘數,上下午顯示等(看TimePickerCLockDelegate的成員變數就可以知道)

 

   4.所以最後也是最重要的就是錶盤RadialTimePickerVIew的繪製,他裡面的知識或者思想可以用在很多的地方。比如一個文字兩種顏色或背景色(其實就是用到了畫圖地區的補集和餘集知識)。    

 

 

  總結:本文主要講述Android中的TimePicker類的代碼結構,代碼細節沒有太細的深究,從中可以學到不少知識。

      1)比如如果一個自訂控制項比較複雜,可以把它分解,然後再組合成一個整體。

      2)為了擴充或者相容,可以採用代理的模式,由代理完成具體的實現。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.