版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
目錄8.1View基礎(chǔ)8.2View的滑動(dòng)8.3View的事件分發(fā)機(jī)制
八、View事件分析八、View事件分析
View是Android所有控件的基類,不管是簡(jiǎn)單的Button和TextView,還是復(fù)雜的RelativeLayout和ListView,它們的共同基類都是View。View是界面層的控件的父類,是控件的總稱。除了View,還有ViewGroup。從名字來看,ViewGroup就是控件組,ViewGroup內(nèi)部包含了許多控件,它是控件的容器。在Android設(shè)計(jì)中,ViewGroup也繼承了View,這意味著View本身可以是單個(gè)控件也可以是控件組,通過這種關(guān)系就形成了View樹的結(jié)構(gòu)。8.1View基礎(chǔ)8.1.1View是什么八、View事件分析View的位置主要由各頂點(diǎn)決定:Top,Left,Right和Bottom。
這些坐標(biāo)都是相對(duì)于View的父容器來說的,是一種相對(duì)坐標(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:手指在屏幕上移動(dòng);
?Action_Up:手指從屏幕上松開的一瞬間;
在正常情況下,一次手指觸摸屏幕的行為會(huì)觸發(fā)一系列點(diǎn)擊事件,考慮如下幾種情況:
點(diǎn)擊屏幕后立刻松開,事件序列為Down-Up;
點(diǎn)擊屏幕滑動(dòng)一會(huì)再松開,事件序列為Down-Move…Move-Up。8.1.3MotionEvent和TouchSlop八、View事件分析2.TouchSlopTouchSlop是系統(tǒng)所能識(shí)別的被認(rèn)為是滑動(dòng)的最小距離,換句話說,當(dāng)手指在屏幕上滑動(dòng)時(shí),如果兩次滑動(dòng)之間的距離小于這個(gè)常量,那么系統(tǒng)認(rèn)為這是滑動(dòng)操作。這是一個(gè)常量,與設(shè)備有關(guān),在不同的設(shè)備上這個(gè)值可能是不同的,通過如下方式即可獲取這個(gè)常量:ViewConfiguration.get(getContext()).getScaledTouchSlop()??梢岳眠@個(gè)常量做過濾,比如當(dāng)兩次滑動(dòng)事件的距離小于這個(gè)值,未達(dá)到滑動(dòng)距離的臨界值時(shí),就可以認(rèn)為不是滑動(dòng),這樣做可以有更好的用戶體驗(yàn)。八、View事件分析
為了實(shí)現(xiàn)View的滑動(dòng),View提供了專門的方法來實(shí)現(xiàn)這個(gè)功能,那就是scrollTo()和scrollBy()。8.2View的滑動(dòng)8.2.1使用scrollTo()/scrollBy八、View事件分析
從源碼可以看出,scrollBy實(shí)際上調(diào)用scrollTo方法,它是基于當(dāng)前位置的相對(duì)滑動(dòng),而scrollTo則是實(shí)現(xiàn)了基于所傳參數(shù)的絕對(duì)滑動(dòng)。通過源碼可以知道,這種方式的滑動(dòng)主要是通過改變mScrollX和mScrollY來實(shí)現(xiàn)的。八、View事件分析案例:在布局文件中定義兩個(gè)按鈕,一個(gè)名為“移動(dòng)事件”,一個(gè)名為“移動(dòng)”,處理“移動(dòng)”點(diǎn)擊事件。當(dāng)點(diǎn)擊此按鈕時(shí),調(diào)用“移動(dòng)事件”按鈕的scrollTo()方法,此按鈕的內(nèi)容即文字“移動(dòng)事件”向左上移動(dòng)了一段距離,而Button區(qū)域并沒有發(fā)生改變,觀察Log輸出:
當(dāng)向左上滑動(dòng)時(shí),ScrollX和ScrollY的值都為負(fù)。圖8.1八、View事件分析八、View事件分析
動(dòng)畫能夠讓一個(gè)View進(jìn)行平移。使用動(dòng)畫來移動(dòng)View,主要是操作View的translationX和translationY屬性。既可以采用傳統(tǒng)的View動(dòng)畫,也可以采用屬性動(dòng)畫。如果采用屬性動(dòng)畫的話,為了能夠兼容3.0以下的版本,需要采用開源動(dòng)畫庫(kù)NineOldAndroids。View動(dòng)畫是對(duì)View影像的操作,它并不能真正改變View的位置參數(shù)和高寬,如果希望動(dòng)畫后的狀態(tài)得以保留還必須將fillAfter屬性設(shè)置為true。
從Android3.0開始,使用屬性動(dòng)畫可以解決上面的問題,但是大多數(shù)應(yīng)用都需要兼容到Android2.2,在該版本上無法使用屬性動(dòng)畫,故需要做相應(yīng)的處理。8.2.2使用動(dòng)畫八、View事件分析
第三種實(shí)現(xiàn)View滑動(dòng)的方法是通過改變布局參數(shù),即改變LayoutParams。這個(gè)比較好理解,比如我們想把一個(gè)Button向右移動(dòng)100px,只需要將這個(gè)Button的LayoutParams里的marginLeft參數(shù)的值增加100px即可。
通過改變LayoutParams的方式實(shí)現(xiàn)View的滑動(dòng)同樣是一個(gè)很靈活的方法,需要根據(jù)不同情況去做不同的處理。
不同的布局文件有不同的LayoutParams,選擇時(shí)需根據(jù)自己的布局文件來決定。8.2.3改變布局參數(shù)八、View事件分析
?scrollTo/scrollBy:操作簡(jiǎn)單,適合對(duì)View內(nèi)容的滑動(dòng)。
動(dòng)畫:使用于沒有交互的View和實(shí)現(xiàn)復(fù)雜的動(dòng)畫效果。
改變布局參數(shù):操作稍微復(fù)雜,適用于有交互的View。8.2.4各種滑動(dòng)方式的對(duì)比八、View事件分析
點(diǎn)擊事件的分發(fā)過程由三個(gè)方法來共同完成:
1.publicbooleandispatchTouchEvent(MotionEventev);
這種方法用來進(jìn)行事件的分發(fā)。如果事件能夠傳遞給當(dāng)前的View,那么此方法一定會(huì)被調(diào)用,返回結(jié)果受View的onTouchEvent和下級(jí)的dispatchTouchEvent方法的影響,表示是否消耗當(dāng)前事件。8.3View的事件分發(fā)機(jī)制8.3.1點(diǎn)擊事件的傳遞規(guī)則八、View事件分析2.publicbooleanonInterceptTouchEvent(MotionEventev);
在上述方法的內(nèi)部調(diào)用,用來判斷是否攔截某個(gè)事件。如果當(dāng)前View攔截了某個(gè)事件,那么在同一個(gè)事件序列中,此方法不會(huì)被再次調(diào)用,返回結(jié)果表示是否攔截當(dāng)前事件。3.publicbooleanonTouchEvent(MotionEventev);
在dispatchTouchEvent方法中調(diào)用,用來處理點(diǎn)擊事件,返回結(jié)果表示是否消耗。如果不消耗,則在同一個(gè)事件序列中,當(dāng)前View無法再次接收到事件。八、View事件分析案例1:自定義一個(gè)MyButton繼承Button,重寫其onTouchEvent()方法:八、View事件分析
在Activity中給Button設(shè)置OnTouchListener事件:八、View事件分析
在onTouchListener事件中,返回值為true,運(yùn)行程序:
可以看出系統(tǒng)只調(diào)用了onTouchListner中的返回值,而沒有調(diào)用MyButton中的onTouchEvent(),修改onTouchListener的返回值為false,圖8.2圖8.3八、View事件分析
當(dāng)一個(gè)點(diǎn)擊事件產(chǎn)生后,它的傳遞過程遵循如下順序:Activity->Window->View,即事件總是先傳遞給Activity,Activity再傳遞給Window,最后傳遞給頂級(jí)View。頂級(jí)View接收到事件后,就會(huì)按照事件分發(fā)機(jī)制去分發(fā)事件。
案例2:自定義RelativeLayout、LinearLayout、Button,重寫了其對(duì)應(yīng)的dispatchTouchEvent、onInterceptTouchEvent以及onTouchEvent方法,添加Log日志:八、View事件分析MyRelativeLayout.java代碼:八、View事件分析MyRelativeLayout.java代碼:八、View事件分析MyButton代碼:八、View事件分析
上面三個(gè)自定義View中的onTouchEvent、onInterceptTouchEvent方法值都為false,在Activity中重寫onTouchEvent方法:八、View事件分析xml布局文件代碼:八、View事件分析運(yùn)行程序,點(diǎn)擊按鈕,觀察Log輸出:圖8.4八、View事件分析
自定義的三個(gè)View的onTouchEvent方法返回值都為false,最后Activity的onTouchEvent方法被調(diào)用,修改MyButton的onTouchEvent返回值為true:圖8.5八、View事件分析
關(guān)于時(shí)間傳遞的機(jī)制,有一些結(jié)論:
(1)同一個(gè)事件序列是指從手指接觸屏幕的那一刻起,到手指離開屏幕的那一刻結(jié)束,在這個(gè)過程中所產(chǎn)生的一系列事件,這個(gè)事件序列以down事件開始,中間包含數(shù)量不定的move事件,最終以u(píng)p事件結(jié)束。(2)如果某個(gè)View一旦決定攔截,那么這一個(gè)事件序列都只能由它來處理(如果事件序列能夠傳遞給它的話),并且它的onInterceptTouchEvent不會(huì)再被調(diào)用。(3)正常情況下,一個(gè)事件序列只能被一個(gè)View攔截消耗,但是通過特殊手段可以做到被多個(gè)View消耗,比如該View將本該由自己處理的事件通過onTouchEvent強(qiáng)行傳遞給其他View處理。八、View事件分析(4)某個(gè)View一旦開始處理事件,如果它不消耗ACTION_DOWN事件,那么同一事件中的其他事件都不會(huì)交給它處理,并且事件將重新交給它的父元素去處理。(5)?ViewGroup默認(rèn)不攔截任何事件,Android源碼中ViewGroup的onInterceptTouchEvent方法默認(rèn)返回false。(6)View沒有onInterceptTouchEvent方法,一旦有點(diǎn)擊事件傳遞給它,那么它的onTouchEvent方法就會(huì)被調(diào)用。(7)?View的onTouchEvent默認(rèn)都會(huì)消耗事件(返回true),除非它是不可點(diǎn)擊的(Clickable和longClickable同時(shí)為false)。View的longClickable屬性默認(rèn)為false,clickable屬性視情況而定,比如Button的clickable屬性默認(rèn)為true,而TextView的clickable屬性默認(rèn)為false。八、View事件分析(8)?View的enable屬性不影響onTouchEvent的默認(rèn)返回值,哪怕一個(gè)View是disable狀態(tài),只要它的clickable或者longClickable有一個(gè)為true,那么它的onTouchEvent就返回true。(9)?onClick會(huì)發(fā)生的前提是當(dāng)前View是可點(diǎn)擊的,并且它收到了down和up的事件。(10)事件傳遞過程是由外向內(nèi)的,即事件總是先傳遞給父元素,然后由父元素傳遞給子元素,通過requestDisallowInterceptTouchEvent方法可以在子元素中干預(yù)父元素的事件分發(fā)過程,但是ACTION_DOWN事件除外。八、View事件分析1.Activity對(duì)點(diǎn)擊事件的分發(fā)過程
點(diǎn)擊事件用MotionEvent來表示,當(dāng)一個(gè)點(diǎn)擊操作發(fā)生時(shí),事件最先傳遞給當(dāng)事Activity,由Activity的dispatchTouchEvent來進(jìn)行事件派發(fā),具體的工作是由Activity內(nèi)部的Window來完成的。Window會(huì)將事件傳遞給DecorView,DecorView一般就是當(dāng)前界面的頂層容器(即通過setContentView所設(shè)置的View的父容器),通過Activity.getDecorView()可以獲得。8.3.2事件分發(fā)的源碼解析八、View事件分析onUserInteraction為一個(gè)空實(shí)現(xiàn),那么事件通過getWindow開始交給Activity所附屬的Window進(jìn)行分發(fā)。如果返回true,整個(gè)事件循環(huán)結(jié)束;返回false意味著事件沒被處理;所有View的onTouchEvent都返回了false,那么Activity的onTouchEvent就會(huì)被調(diào)用。八、View事件分析Window是個(gè)抽象類,而Window的superDispatchTouchE
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度窗簾生產(chǎn)綠色供應(yīng)鏈體系建設(shè)合同4篇
- 2025年度美容美發(fā)行業(yè)承包消殺協(xié)議書4篇
- 二零二五年度儲(chǔ)藏室使用權(quán)轉(zhuǎn)讓與分割合同4篇
- 2025年度池塘水域租賃與生態(tài)保護(hù)合作合同范本3篇
- 二零二五版門面房買賣及裝修配套服務(wù)合同4篇
- 二零二五年度出租車充電樁安裝與維護(hù)合同4篇
- 城市環(huán)境監(jiān)測(cè)技術(shù)-深度研究
- 二零二五年度智慧農(nóng)業(yè)技術(shù)合作合同4篇
- 太陽系邊緣探索-第1篇-深度研究
- 2025年度女方遭受男方家暴二零二五年度離婚心理康復(fù)支持協(xié)議4篇
- 《天潤(rùn)乳業(yè)營(yíng)運(yùn)能力及風(fēng)險(xiǎn)管理問題及完善對(duì)策(7900字論文)》
- 醫(yī)院醫(yī)學(xué)倫理委員會(huì)章程
- 農(nóng)民專業(yè)合作社財(cái)務(wù)報(bào)表(三張報(bào)表)
- 安宮牛黃丸的培訓(xùn)
- 婦科腫瘤護(hù)理新進(jìn)展Ppt
- 動(dòng)土作業(yè)專項(xiàng)安全培訓(xùn)考試試題(帶答案)
- 大學(xué)生就業(yè)指導(dǎo)(高職就業(yè)指導(dǎo)課程 )全套教學(xué)課件
- 死亡病例討論總結(jié)分析
- 第二章 會(huì)展的產(chǎn)生與發(fā)展
- 空域規(guī)劃與管理V2.0
- JGT266-2011 泡沫混凝土標(biāo)準(zhǔn)規(guī)范
評(píng)論
0/150
提交評(píng)論