view是android中所有控制項的基類,viewgroup內部包含了許多個控制項,即一組view。在android的設計中,viewgroup也繼承了view,這就意味著view本身就可以是單個控制項也可以是由多個控制項組成的一組控制項,通過這種關係就形成了view樹的結構
我們給出乙個簡略圖,可以直觀的看到整個體系中常用類的繼承結構
view有3中座標系:螢幕座標系、檢視座標系、布局座標系
螢幕座標系:
以螢幕左上方為(0,0)的座標體系,x/y軸的最大值即為物理螢幕解析度的寬和高;
觸控訊息中motionevent.getrawx/getrawy取到的就是螢幕座標值;
檢視座標系:
檢視座標是完全由自身view的寬高決定的座標體系,理論上他是沒有邊界的,不受物理螢幕大小限制;
觸控訊息中motionevent.getx/gety取到的就是檢視座標值;
布局座標系:
子檢視相對于父檢視而言的相對螢幕座標,以父檢視的左上角為(0,0),而不關心父檢視到底位於螢幕何處。
子檢視view的位置主要由它的四個頂點來決定,分別對應於view的四個屬性top、left、right,bottom,其中top是左上角縱座標,left是左上角橫座標,right是右下角橫座標,bottom是有下角縱座標。需要注意的是,這些座標都是相對於view的父容器來說的,因此它是一種
相對座標
**各種係數獲取方法
translationx,translationy是左上角相對父容器的偏移量
motionevent
在手指接觸螢幕後所產生的一系列事件中,典型的事件型別有如下幾種:
touchslop
touchslop是系統所能識別出的被認為是滑動的最小距離,是乙個常量,不同的裝置下可能不同。可以用來過濾使用者是否滑動。
viewconfiguration.get(getcontext()).getscaledtouchslop()
觸控事件的分發,其實就是對motionevent事件的分發過程,乙個motionevent產生後系統需要把這個事件傳遞給乙個具體的view。1、dispatchtouchevent:
用來進行事件的分發2、onintercepttouchevent:
判斷本view是否攔截觸控事件,返回true表示攔截,觸控事件不再下內部view傳遞,直接呼叫本view的ontouchevent來處理觸控事件。反之繼續向下層view傳遞。3、ontouchevent:
觸控事件實際的處理類,用來處理具體的觸控事件(up,down,move),如果返回true表示該事件被消耗,不在向上層傳遞該事件。反之上層view會呼叫ontouchevent來處理該事件
當乙個觸控事件產生後,它的傳遞過程遵循如下順序:activity>window-view1、view1獲取觸控事件,然後向下層傳遞,現在有view1–>view2—>view3 3個view巢狀view1最外層,view3最底層
2、如果中途的view1或者view2沒有呼叫onintercepttouchevent進行攔截(返回false),就一直到最下層view3,最後因為view3沒有下層view就會呼叫view3的ontouchevent方法處理觸控事件,返回true表示已經處理,該事件將被view3消耗。如果false表示不處理,事件將繼續回反給view2的ontouchevent處理,以此類推。
3、如果view1,view2的onintercepttouchevent攔截(返回true),會立即呼叫view1或者view2 的ontouchevent處理,不會向下傳遞,處理方式也和正常一樣。
借用網上找到的偽**表示:
@override
public
boolean
dispatchtouchevent(motionevent ev) else
return consume;
}
View的事件體系
onintercepttouchevent 用於處理事件並改變事件的傳遞方向。處理事件這個不用說了,你在函式內部編寫 處理就可以了。而決定傳遞方向的是返回值,返回為false時事件會傳遞給子控制項的onintercepttouchevent 返回值為true時事件會傳遞給當前控制項的ontouche...
View的事件體系 事件分發機制
viewgroup事件傳遞方法 dispatchtouchevent onintercepttouchevent ontouchevent 1 dispatchtouchevent 當前view接到事件呼叫的方法,返回boolean型別值,會呼叫如下偽 邏輯,所以返回值會受自己的 ontouchev...
Android之View的事件體系
velocitytracker,gesturedetector,scroller 1.velocitytracker 速度追蹤 在ontouch中新增 override public boolean ontouch view v,motionevent event 不過回頭一看,發現書中是放在ont...