《Android實戰(zhàn)基礎教程》課件第八章_第1頁
《Android實戰(zhàn)基礎教程》課件第八章_第2頁
《Android實戰(zhàn)基礎教程》課件第八章_第3頁
《Android實戰(zhàn)基礎教程》課件第八章_第4頁
《Android實戰(zhàn)基礎教程》課件第八章_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

目錄8.1View基礎8.2View的滑動8.3View的事件分發(fā)機制

八、View事件分析八、View事件分析

View是Android所有控件的基類,不管是簡單的Button和TextView,還是復雜的RelativeLayout和ListView,它們的共同基類都是View。View是界面層的控件的父類,是控件的總稱。除了View,還有ViewGroup。從名字來看,ViewGroup就是控件組,ViewGroup內(nèi)部包含了許多控件,它是控件的容器。在Android設計中,ViewGroup也繼承了View,這意味著View本身可以是單個控件也可以是控件組,通過這種關系就形成了View樹的結構。8.1View基礎8.1.1View是什么八、View事件分析View的位置主要由各頂點決定:Top,Left,Right和Bottom。

這些坐標都是相對于View的父容器來說的,是一種相對坐標。則寬高為: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)所能識別的被認為是滑動的最小距離,換句話說,當手指在屏幕上滑動時,如果兩次滑動之間的距離小于這個常量,那么系統(tǒng)認為這是滑動操作。這是一個常量,與設備有關,在不同的設備上這個值可能是不同的,通過如下方式即可獲取這個常量:ViewConfiguration.get(getContext()).getScaledTouchSlop()??梢岳眠@個常量做過濾,比如當兩次滑動事件的距離小于這個值,未達到滑動距離的臨界值時,就可以認為不是滑動,這樣做可以有更好的用戶體驗。八、View事件分析

為了實現(xiàn)View的滑動,View提供了專門的方法來實現(xiàn)這個功能,那就是scrollTo()和scrollBy()。8.2View的滑動8.2.1使用scrollTo()/scrollBy八、View事件分析

從源碼可以看出,scrollBy實際上調(diào)用scrollTo方法,它是基于當前位置的相對滑動,而scrollTo則是實現(xiàn)了基于所傳參數(shù)的絕對滑動。通過源碼可以知道,這種方式的滑動主要是通過改變mScrollX和mScrollY來實現(xiàn)的。八、View事件分析案例:在布局文件中定義兩個按鈕,一個名為“移動事件”,一個名為“移動”,處理“移動”點擊事件。當點擊此按鈕時,調(diào)用“移動事件”按鈕的scrollTo()方法,此按鈕的內(nèi)容即文字“移動事件”向左上移動了一段距離,而Button區(qū)域并沒有發(fā)生改變,觀察Log輸出:

當向左上滑動時,ScrollX和ScrollY的值都為負。圖8.1八、View事件分析八、View事件分析

動畫能夠讓一個View進行平移。使用動畫來移動View,主要是操作View的translationX和translationY屬性。既可以采用傳統(tǒng)的View動畫,也可以采用屬性動畫。如果采用屬性動畫的話,為了能夠兼容3.0以下的版本,需要采用開源動畫庫NineOldAndroids。View動畫是對View影像的操作,它并不能真正改變View的位置參數(shù)和高寬,如果希望動畫后的狀態(tài)得以保留還必須將fillAfter屬性設置為true。

從Android3.0開始,使用屬性動畫可以解決上面的問題,但是大多數(shù)應用都需要兼容到Android2.2,在該版本上無法使用屬性動畫,故需要做相應的處理。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)復雜的動畫效果。

改變布局參數(shù):操作稍微復雜,適用于有交互的View。8.2.4各種滑動方式的對比八、View事件分析

點擊事件的分發(fā)過程由三個方法來共同完成:

1.publicbooleandispatchTouchEvent(MotionEventev);

這種方法用來進行事件的分發(fā)。如果事件能夠傳遞給當前的View,那么此方法一定會被調(diào)用,返回結果受View的onTouchEvent和下級的dispatchTouchEvent方法的影響,表示是否消耗當前事件。8.3View的事件分發(fā)機制8.3.1點擊事件的傳遞規(guī)則八、View事件分析2.publicbooleanonInterceptTouchEvent(MotionEventev);

在上述方法的內(nèi)部調(diào)用,用來判斷是否攔截某個事件。如果當前View攔截了某個事件,那么在同一個事件序列中,此方法不會被再次調(diào)用,返回結果表示是否攔截當前事件。3.publicbooleanonTouchEvent(MotionEventev);

在dispatchTouchEvent方法中調(diào)用,用來處理點擊事件,返回結果表示是否消耗。如果不消耗,則在同一個事件序列中,當前View無法再次接收到事件。八、View事件分析案例1:自定義一個MyButton繼承Button,重寫其onTouchEvent()方法:八、View事件分析

在Activity中給Button設置OnTouchListener事件:八、View事件分析

在onTouchListener事件中,返回值為true,運行程序:

可以看出系統(tǒng)只調(diào)用了onTouchListner中的返回值,而沒有調(diào)用MyButton中的onTouchEvent(),修改onTouchListener的返回值為false,圖8.2圖8.3八、View事件分析

當一個點擊事件產(chǎn)生后,它的傳遞過程遵循如下順序:Activity->Window->View,即事件總是先傳遞給Activity,Activity再傳遞給Window,最后傳遞給頂級View。頂級View接收到事件后,就會按照事件分發(fā)機制去分發(fā)事件。

案例2:自定義RelativeLayout、LinearLayout、Button,重寫了其對應的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事件分析

關于時間傳遞的機制,有一些結論:

(1)同一個事件序列是指從手指接觸屏幕的那一刻起,到手指離開屏幕的那一刻結束,在這個過程中所產(chǎn)生的一系列事件,這個事件序列以down事件開始,中間包含數(shù)量不定的move事件,最終以up事件結束。(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ā)生的前提是當前View是可點擊的,并且它收到了down和up的事件。(10)事件傳遞過程是由外向內(nèi)的,即事件總是先傳遞給父元素,然后由父元素傳遞給子元素,通過requestDisallowInterceptTouchEvent方法可以在子元素中干預父元素的事件分發(fā)過程,但是ACTION_DOWN事件除外。八、View事件分析1.Activity對點擊事件的分發(fā)過程

點擊事件用MotionEvent來表示,當一個點擊操作發(fā)生時,事件最先傳遞給當事Activity,由Activity的dispatchTouchEvent來進行事件派發(fā),具體的工作是由Activity內(nèi)部的Window來完成的。Window會將事件傳遞給DecorView,DecorView一般就是當前界面的頂層容器(即通過setContentView所設置的View的父容器),通過Activity.getDecorView()可以獲得。8.3.2事件分發(fā)的源碼解析八、View事件分析onUserInteraction為一個空實現(xiàn),那么事件通過getWindow開始交給Activity所附屬的Window進行分發(fā)。如果返回true,整個事件循環(huán)結束;返回false意味著事件沒被處理;所有View的onTouchEvent都返回了false,那么Activity的onTouchEvent就會被調(diào)用。八、View事件分析Window是個抽象類,而Window的superDispatchTouchE

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論