![《Android實戰(zhàn)基礎(chǔ)教程》課件第八章_第1頁](http://file4.renrendoc.com/view14/M01/37/36/wKhkGWdf856ASXuOAACeYdWMOXc970.jpg)
![《Android實戰(zhàn)基礎(chǔ)教程》課件第八章_第2頁](http://file4.renrendoc.com/view14/M01/37/36/wKhkGWdf856ASXuOAACeYdWMOXc9702.jpg)
![《Android實戰(zhàn)基礎(chǔ)教程》課件第八章_第3頁](http://file4.renrendoc.com/view14/M01/37/36/wKhkGWdf856ASXuOAACeYdWMOXc9703.jpg)
![《Android實戰(zhàn)基礎(chǔ)教程》課件第八章_第4頁](http://file4.renrendoc.com/view14/M01/37/36/wKhkGWdf856ASXuOAACeYdWMOXc9704.jpg)
![《Android實戰(zhàn)基礎(chǔ)教程》課件第八章_第5頁](http://file4.renrendoc.com/view14/M01/37/36/wKhkGWdf856ASXuOAACeYdWMOXc9705.jpg)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
目錄8.1View基礎(chǔ)8.2View的滑動8.3View的事件分發(fā)機制
八、View事件分析八、View事件分析
View是Android所有控件的基類,不管是簡單的Button和TextView,還是復(fù)雜的RelativeLayout和ListView,它們的共同基類都是View。View是界面層的控件的父類,是控件的總稱。除了View,還有ViewGroup。從名字來看,ViewGroup就是控件組,ViewGroup內(nèi)部包含了許多控件,它是控件的容器。在Android設(shè)計中,ViewGroup也繼承了View,這意味著View本身可以是單個控件也可以是控件組,通過這種關(guān)系就形成了View樹的結(jié)構(gòu)。8.1View基礎(chǔ)8.1.1View是什么八、View事件分析View的位置主要由各頂點決定:Top,Left,Right和Bottom。
這些坐標(biāo)都是相對于View的父容器來說的,是一種相對坐標(biāo)。則寬高為:Width?=?right?-?leftHeight?=?bottom?-?top
?Left=getLeft();
?Rigt=getRight();
?Top=getTop();
?Bottom=getBottom();8.1.2View的位置參數(shù)八、View事件分析1.MotionEvent
在手指觸摸屏幕后所產(chǎn)生的一系列事件中,典型的事件類型有如下幾種:
?Action_Down:手指剛接觸屏幕;
?Action_Move:手指在屏幕上移動;
?Action_Up:手指從屏幕上松開的一瞬間;
在正常情況下,一次手指觸摸屏幕的行為會觸發(fā)一系列點擊事件,考慮如下幾種情況:
點擊屏幕后立刻松開,事件序列為Down-Up;
點擊屏幕滑動一會再松開,事件序列為Down-Move…Move-Up。8.1.3MotionEvent和TouchSlop八、View事件分析2.TouchSlopTouchSlop是系統(tǒng)所能識別的被認為是滑動的最小距離,換句話說,當(dāng)手指在屏幕上滑動時,如果兩次滑動之間的距離小于這個常量,那么系統(tǒng)認為這是滑動操作。這是一個常量,與設(shè)備有關(guān),在不同的設(shè)備上這個值可能是不同的,通過如下方式即可獲取這個常量:ViewConfiguration.get(getContext()).getScaledTouchSlop()??梢岳眠@個常量做過濾,比如當(dāng)兩次滑動事件的距離小于這個值,未達到滑動距離的臨界值時,就可以認為不是滑動,這樣做可以有更好的用戶體驗。八、View事件分析
為了實現(xiàn)View的滑動,View提供了專門的方法來實現(xiàn)這個功能,那就是scrollTo()和scrollBy()。8.2View的滑動8.2.1使用scrollTo()/scrollBy八、View事件分析
從源碼可以看出,scrollBy實際上調(diào)用scrollTo方法,它是基于當(dāng)前位置的相對滑動,而scrollTo則是實現(xiàn)了基于所傳參數(shù)的絕對滑動。通過源碼可以知道,這種方式的滑動主要是通過改變mScrollX和mScrollY來實現(xiàn)的。八、View事件分析案例:在布局文件中定義兩個按鈕,一個名為“移動事件”,一個名為“移動”,處理“移動”點擊事件。當(dāng)點擊此按鈕時,調(diào)用“移動事件”按鈕的scrollTo()方法,此按鈕的內(nèi)容即文字“移動事件”向左上移動了一段距離,而Button區(qū)域并沒有發(fā)生改變,觀察Log輸出:
當(dāng)向左上滑動時,ScrollX和ScrollY的值都為負。圖8.1八、View事件分析八、View事件分析
動畫能夠讓一個View進行平移。使用動畫來移動View,主要是操作View的translationX和translationY屬性。既可以采用傳統(tǒng)的View動畫,也可以采用屬性動畫。如果采用屬性動畫的話,為了能夠兼容3.0以下的版本,需要采用開源動畫庫NineOldAndroids。View動畫是對View影像的操作,它并不能真正改變View的位置參數(shù)和高寬,如果希望動畫后的狀態(tài)得以保留還必須將fillAfter屬性設(shè)置為true。
從Android3.0開始,使用屬性動畫可以解決上面的問題,但是大多數(shù)應(yīng)用都需要兼容到Android2.2,在該版本上無法使用屬性動畫,故需要做相應(yīng)的處理。8.2.2使用動畫八、View事件分析
第三種實現(xiàn)View滑動的方法是通過改變布局參數(shù),即改變LayoutParams。這個比較好理解,比如我們想把一個Button向右移動100px,只需要將這個Button的LayoutParams里的marginLeft參數(shù)的值增加100px即可。
通過改變LayoutParams的方式實現(xiàn)View的滑動同樣是一個很靈活的方法,需要根據(jù)不同情況去做不同的處理。
不同的布局文件有不同的LayoutParams,選擇時需根據(jù)自己的布局文件來決定。8.2.3改變布局參數(shù)八、View事件分析
?scrollTo/scrollBy:操作簡單,適合對View內(nèi)容的滑動。
動畫:使用于沒有交互的View和實現(xiàn)復(fù)雜的動畫效果。
改變布局參數(shù):操作稍微復(fù)雜,適用于有交互的View。8.2.4各種滑動方式的對比八、View事件分析
點擊事件的分發(fā)過程由三個方法來共同完成:
1.publicbooleandispatchTouchEvent(MotionEventev);
這種方法用來進行事件的分發(fā)。如果事件能夠傳遞給當(dāng)前的View,那么此方法一定會被調(diào)用,返回結(jié)果受View的onTouchEvent和下級的dispatchTouchEvent方法的影響,表示是否消耗當(dāng)前事件。8.3View的事件分發(fā)機制8.3.1點擊事件的傳遞規(guī)則八、View事件分析2.publicbooleanonInterceptTouchEvent(MotionEventev);
在上述方法的內(nèi)部調(diào)用,用來判斷是否攔截某個事件。如果當(dāng)前View攔截了某個事件,那么在同一個事件序列中,此方法不會被再次調(diào)用,返回結(jié)果表示是否攔截當(dāng)前事件。3.publicbooleanonTouchEvent(MotionEventev);
在dispatchTouchEvent方法中調(diào)用,用來處理點擊事件,返回結(jié)果表示是否消耗。如果不消耗,則在同一個事件序列中,當(dāng)前View無法再次接收到事件。八、View事件分析案例1:自定義一個MyButton繼承Button,重寫其onTouchEvent()方法:八、View事件分析
在Activity中給Button設(shè)置OnTouchListener事件:八、View事件分析
在onTouchListener事件中,返回值為true,運行程序:
可以看出系統(tǒng)只調(diào)用了onTouchListner中的返回值,而沒有調(diào)用MyButton中的onTouchEvent(),修改onTouchListener的返回值為false,圖8.2圖8.3八、View事件分析
當(dāng)一個點擊事件產(chǎn)生后,它的傳遞過程遵循如下順序:Activity->Window->View,即事件總是先傳遞給Activity,Activity再傳遞給Window,最后傳遞給頂級View。頂級View接收到事件后,就會按照事件分發(fā)機制去分發(fā)事件。
案例2:自定義RelativeLayout、LinearLayout、Button,重寫了其對應(yīng)的dispatchTouchEvent、onInterceptTouchEvent以及onTouchEvent方法,添加Log日志:八、View事件分析MyRelativeLayout.java代碼:八、View事件分析MyRelativeLayout.java代碼:八、View事件分析MyButton代碼:八、View事件分析
上面三個自定義View中的onTouchEvent、onInterceptTouchEvent方法值都為false,在Activity中重寫onTouchEvent方法:八、View事件分析xml布局文件代碼:八、View事件分析運行程序,點擊按鈕,觀察Log輸出:圖8.4八、View事件分析
自定義的三個View的onTouchEvent方法返回值都為false,最后Activity的onTouchEvent方法被調(diào)用,修改MyButton的onTouchEvent返回值為true:圖8.5八、View事件分析
關(guān)于時間傳遞的機制,有一些結(jié)論:
(1)同一個事件序列是指從手指接觸屏幕的那一刻起,到手指離開屏幕的那一刻結(jié)束,在這個過程中所產(chǎn)生的一系列事件,這個事件序列以down事件開始,中間包含數(shù)量不定的move事件,最終以up事件結(jié)束。(2)如果某個View一旦決定攔截,那么這一個事件序列都只能由它來處理(如果事件序列能夠傳遞給它的話),并且它的onInterceptTouchEvent不會再被調(diào)用。(3)正常情況下,一個事件序列只能被一個View攔截消耗,但是通過特殊手段可以做到被多個View消耗,比如該View將本該由自己處理的事件通過onTouchEvent強行傳遞給其他View處理。八、View事件分析(4)某個View一旦開始處理事件,如果它不消耗ACTION_DOWN事件,那么同一事件中的其他事件都不會交給它處理,并且事件將重新交給它的父元素去處理。(5)?ViewGroup默認不攔截任何事件,Android源碼中ViewGroup的onInterceptTouchEvent方法默認返回false。(6)View沒有onInterceptTouchEvent方法,一旦有點擊事件傳遞給它,那么它的onTouchEvent方法就會被調(diào)用。(7)?View的onTouchEvent默認都會消耗事件(返回true),除非它是不可點擊的(Clickable和longClickable同時為false)。View的longClickable屬性默認為false,clickable屬性視情況而定,比如Button的clickable屬性默認為true,而TextView的clickable屬性默認為false。八、View事件分析(8)?View的enable屬性不影響onTouchEvent的默認返回值,哪怕一個View是disable狀態(tài),只要它的clickable或者longClickable有一個為true,那么它的onTouchEvent就返回true。(9)?onClick會發(fā)生的前提是當(dāng)前View是可點擊的,并且它收到了down和up的事件。(10)事件傳遞過程是由外向內(nèi)的,即事件總是先傳遞給父元素,然后由父元素傳遞給子元素,通過requestDisallowInterceptTouchEvent方法可以在子元素中干預(yù)父元素的事件分發(fā)過程,但是ACTION_DOWN事件除外。八、View事件分析1.Activity對點擊事件的分發(fā)過程
點擊事件用MotionEvent來表示,當(dāng)一個點擊操作發(fā)生時,事件最先傳遞給當(dāng)事Activity,由Activity的dispatchTouchEvent來進行事件派發(fā),具體的工作是由Activity內(nèi)部的Window來完成的。Window會將事件傳遞給DecorView,DecorView一般就是當(dāng)前界面的頂層容器(即通過setContentView所設(shè)置的View的父容器),通過Activity.getDecorView()可以獲得。8.3.2事件分發(fā)的源碼解析八、View事件分析onUserInteraction為一個空實現(xiàn),那么事件通過getWindow開始交給Activity所附屬的Window進行分發(fā)。如果返回true,整個事件循環(huán)結(jié)束;返回false意味著事件沒被處理;所有View的onTouchEvent都返回了false,那么Activity的onTouchEvent就會被調(diào)用。八、View事件分析Window是個抽象類,而Window的superDispatchTouchE
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年稅務(wù)工作者工作總結(jié)范文(3篇)
- 2024-2025學(xué)年廣東省清遠市八校聯(lián)盟高一上學(xué)期教學(xué)質(zhì)量檢測(二)歷史試卷
- 2025年企業(yè)文化建設(shè)策劃咨詢協(xié)議
- 2025年企業(yè)數(shù)據(jù)保密共享協(xié)議
- 2025年基礎(chǔ)設(shè)施建設(shè)項目合同律師服務(wù)協(xié)議
- 2025年公司員工協(xié)議范本
- 2025年設(shè)備采購租賃合同協(xié)議范本
- 2025年裂隙燈顯微鏡項目立項申請報告模板
- 2025年醫(yī)藥產(chǎn)品銷售合同樣本
- 2025年頻率測量儀器項目立項申請報告模板
- 心電監(jiān)護儀的操作及注意事項 課件
- 運輸管理實務(wù)課件4.5鐵路運費計算1
- 垃圾清運服務(wù)投標(biāo)方案技術(shù)方案
- 化學(xué)品安全員勞動合同
- 民政局版離婚協(xié)議書模板
- 腎病科血栓性微血管病診療規(guī)范2023版
- 六年級英語完形填空60篇含答案及講解
- 鎖骨骨折個案護理
- 農(nóng)民專業(yè)合作社財務(wù)報表(三張報表)
- 新時代中小學(xué)教師職業(yè)行為十項準(zhǔn)則
- 《幼兒園英語口語》
評論
0/150
提交評論