本篇繼續(xù)學習高級控件及獨具特色的監(jiān)聽器佳谦,目錄如下:
1. ScrollView 滾動視圖
2. ProgressBar 進度條
3. ProgressDialog 對話框形式進度條
4. SeekBar 可拖動進度條
5. DataPicker 日歷選擇器
6. DataPickerDialog 對話框形式日歷選擇器
7. TimePicker 時間選擇器
8. TimePickerDialog 對話框形式時間選擇器
1.ScrollView 滾動視圖
當展示的內容很多屏幕顯示不下時就需要用ScrollView來顯示完整的視圖。下圖對比了有無ScrollView兩種不同的情況:
可以看到當整個頁面只有一個TextView時因為內容不完整視覺上感覺很不好哪雕,如果加上ScrollView富弦,用戶就可以滑動滾動條看到后面的內容铁孵。ScrollView使用起來也很容易桃漾,只要將TextView作為它的子標簽就可以了祥山,如果不想看到滾動條葱蝗,可以設置屬性android:scrollbars="none"隱藏起來痊剖。另外,根據(jù)需要也可以使用水平滾動視圖HorizantalScrollView垒玲,替換SrollView標簽就可以了陆馁。
之后在MainActivity獲取TextView實例并set內容,運行之后就能看到之前的效果了合愈。
再介紹一個監(jiān)聽器OnTouchListener叮贩,它可以監(jiān)聽ScrollView滑行情況,比如希望用戶看完文本后繼續(xù)添加一些文本內容佛析,那么就可以在監(jiān)聽到ScrollView到達底部的事件后做出相應的動作益老,代碼見下:
有必要對上述代碼做一些解釋:從event.getAction()可以監(jiān)聽到滑塊各種狀態(tài),其中一種狀態(tài)MotionEvent.ACTION_MOVE表示滑塊在滑動的過程中寸莫。接下來在判斷文本處于最頂端還是最低端時捺萌,使用了ScrollView三個測量高度的方法:scrollView.getChildAt(0).getMeasuredHeight()表示ScrollView第一個子標簽即TextView文本內容總長度,scrollView.getHeight()表示ScrollView高度即屏幕總高度膘茎,scrollView.getScrollY()表示滾動條滑動距離桃纯。易得出當滑動距離+屏幕總高度=文本總長度時酷誓,正好到達文本最低端。調試結果如圖:
2.ProgressBar 進度條
ProgressBar通常用于展示某個耗時操作完成的進度态坦,來更好的提升用戶界面的友好性盐数。首先來學習ProgressBar幾個關鍵屬性:
max:最大顯示進度
progress:第一顯示進度
secondaryProgress:第二顯示進度
三者關系見圖:
style:進度條的類型,上圖顯示了四種常見的類型--大伞梯、中玫氢、小環(huán)形進度條以及水平進度條。其實每種類型的進度條顯示風格也是多種多樣的谜诫,以水平進度條舉例漾峡,實際上style可選值中@android:style/下系統(tǒng)還提供了更多可選風格,比如選擇第一項:
進度條就換了個風格喻旷。
ctrl點進去看這個style源碼灰殴,發(fā)現(xiàn)整個進度條風格由很多Item共同組成,比如通過第二項progressDrawable就可以實現(xiàn)自定義一個進度條樣式了掰邢。
介紹完ProgressBar幾個關鍵屬性后牺陶,再通過一個小demo學習它的幾個關鍵方法。在布局里準備三個button和一個textview辣之,用于控制進度條加減和重置以及顯示進度條具體進度數(shù)據(jù)掰伸。
接著在MainActivity獲取到所有控件的實例并給所有按鈕都設置好監(jiān)聽器。為了顯示初始進度百分比怀估,從ProgressBar三個get方法分別獲取到三個進度數(shù)值狮鸭,經(jīng)過相應的計算便可以得到了。
按鈕監(jiān)聽事件中多搀,進度的重置直接用set方法歧蕉,而進度的增加和減少就需要increment方法,參數(shù)為正數(shù)即加康铭,負數(shù)即減惯退。這里讓進度條每次變化十個百分比。
運行后點擊增加按鈕效果見圖从藤,減少和重置功能也能很好的完成:
3.ProgressDialog 對話框形式進度條
學習完ProgressBar催跪,趁熱打鐵,看看Dialog的進度條如何做到夷野。直接在上個demo布局最后再添加一個Button懊蒸,用于打開一個ProgressDialog,給它設置監(jiān)聽器后悯搔,在點擊事件里完成一個ProgressDialog的代碼見下:
用ProgressDialog的各種set方法設置了對話框頁面風格(進度條樣式骑丸、標題和圖標)、進度條屬性和一個名為“確認”的按鈕以及對應的點擊事件,且這個對話框可通過返回鍵取消通危,最后一定要有progressDialog.show()否則之前設置都功虧一簣對話框是無法彈出來的铸豁。另外再說明一個方法setIndeterminate(),當值為true表示不精確顯示進度條黄鳍,比如環(huán)形進度條就會一直轉圈推姻,而值為false表示精確顯示進度條平匈,比如此例中水平進度條下就會顯示刻度框沟。運行程序后結果如下:
當點擊確定按鈕之后,確實彈出一個查看成功的Toast增炭。
4.SeekBar 可拖動進度條
在我們調整音量或者聽歌的時候忍燥,會有這樣的進度條上面帶有滑塊允許用戶拖動以改變當前進度的大小,這就是SeekBar隙姿。因為都是進度條梅垄,SeekBar的關鍵屬性就不多說了,這里認識一個監(jiān)聽器OnSeekBarChangeListener输玷,用于監(jiān)聽SeekBar上滑塊運行狀態(tài)队丝。接下來通過一個小例子學習如何使用,先準備這樣一個布局:
在MainActiviity給SeekBar注冊監(jiān)聽器并具體實現(xiàn)三個方法欲鹏,對應滑塊三個狀態(tài)机久,其中onProgressChanged()方法會返回當前進度progress數(shù)值使之顯示在第一個文本框。
運行結果如下赔嚎,“開始拖動”一瞬間很快就進入到“正在拖動”的狀態(tài)膘盖。
5.DataPicker 日歷選擇器
當我們在備忘錄寫每日行程或設置鬧鐘的時候必不可少需要填寫日期和時間,安卓有提供相應的選擇器尤误,幫助我們快速選擇日期和時間侠畔,剩下部分就來介紹這些Picker。
DataPicker日歷選擇器可選擇年月日损晤,下圖預覽可看到就是一個很常見的日歷软棺。
既然是選擇器,那么肯定可以監(jiān)聽到用戶選擇的內容尤勋,所以每個選擇器固然有對應的監(jiān)聽器÷氲常現(xiàn)在做這樣的小demo來看監(jiān)聽器的作用,標題欄顯示當前日期和時間斥黑,每當用戶在DataPicker上選擇一個日期后揖盘,標題欄實時變化以顯示當前選擇的日期。
先利用系統(tǒng)提供的Calendar類可獲取到當前年月日時分锌奴,這里注意Calendar計算月是從0開始兽狭。初始時標題欄顯示當前時間。
DataPicker想要注冊監(jiān)聽器OnDateChangedListener,要通過它的一個方法init()并提供四個參數(shù)箕慧,前三個參數(shù)正是之前獲取的年月日服球,表示初始時日歷上所顯示的日期,注意月份的計算和Calendar相同颠焦,所以不需要加1斩熊,第四個參數(shù)是監(jiān)聽器對象。觸發(fā)事件后會返回被用戶選擇的年月日三個參數(shù)伐庭,再顯示到標題上即可粉渠。
看看運行后效果吧!
6.DataPickerDialog 對話框形式日歷選擇器
根據(jù)不同的需求圾另,還可以通過對話框的形式選擇日期霸株。方法是直接在代碼中new一個DataPickerDialog對象,再show()出來就完成了集乔。和DataPicker非常相似的去件,初始化DataPickerDialog的時候需要五個參數(shù),第一個參數(shù)是上下文扰路,然后就是監(jiān)聽器OnDateSetListener對象尤溜,之后才是年月日。
此時程序一啟動會先彈出一個對話框汗唱,用戶可直接選擇日期宫莱,確定后就可以看到剛剛選擇的日期顯示在標題上了。
7.TimePicker 時間選擇器
下面來看看可選擇時分的TimePicker 時間選擇器渡嚣,可在鐘表上先選擇小時的數(shù)值梢睛,再選擇分鐘的數(shù)值。
比DataPicker簡單的是识椰,它可以直接通過setOnTimeChangedListener()方法注冊監(jiān)聽器OnTimeChangedListener绝葡,就不需要提供其他參數(shù)了。這里同樣地在事件觸發(fā)后讓標題顯示被選擇的時分腹鹉。
運行后:
8.TimePickerDialog 對話框形式時間選擇器
最后一個TimePickerDialog藏畅,學到現(xiàn)在,是不是能很容易掌握了功咒?注冊監(jiān)聽器OnTimeSetListener過程如下:
運行: