View的事件體系(一)View的基礎(chǔ)知識

1、什么是View

View是Android中所有控件的基類,是一種界面層的控件的一種抽象抛虫,它代表了一個控件。

除了View還有ViewGroup简僧,即為控件組建椰,言外之意是ViewGroup內(nèi)部包含了很多控件,即一組View岛马。

在Android中广凸,ViewGroup也繼承了View,這意味著View本身就可以是單個控件也可以是由多個控件組成的一組控件蛛枚,通過這種關(guān)系就形成了View樹的結(jié)構(gòu)。

2脸哀、View的位置參數(shù)

對應(yīng)View的四個屬性:top是左上角縱坐標(biāo)蹦浦,left是左上角橫坐標(biāo),right是右下角橫坐標(biāo)撞蜂,bottom是右下角縱坐標(biāo)

view的位置坐標(biāo)和父容器的關(guān)系

則可以得到View的寬高和坐標(biāo)的關(guān)系:

width=right-left;

height=bottom-top;

在View的源碼中盲镶,它們對應(yīng)于mLeft,mRight,mTop,mBottom

Left=getLeft(); ? ? ? ?

Right=getRight();?

Top=getTop();

Bottom=getBottom();

從Android3.0開始,View增加了額外的幾個參數(shù):x蝌诡、y溉贿、translationX和translationY,其中浦旱,x和y是View左上角的坐標(biāo)宇色,而translationX和translationY 是View左上角相對于父容器的偏移量。這幾個參數(shù)也是相對于父容器的坐標(biāo)颁湖,并且translationX和translationY的默認值是0宣蠕,和view的四個基本的位置參數(shù)一樣,View也為它們提供了get/set方法甥捺,這幾個參數(shù)的換算方法關(guān)系如下:

x=left+translationX; ? ? ? ?y=top+translationY;

需要注意的是:View在平移的過程中抢蚀,top和left表示的是原始左上角的位置信息,其值并不會發(fā)生改變镰禾,此時發(fā)生改變的是x,y,translationX和translationY這是個參數(shù)皿曲。

3唱逢、MotionEvent和TouchSlop

1、MotionEvent

在手指觸摸屏幕后所產(chǎn)生的一系列事件中屋休,典型的事件類型如下:

ACTION_DOWN——手指剛觸摸屏幕

ACTION_MOVE——手指在屏幕上移動

ACTION_UP——手指從屏幕上松開的一瞬間

正常情況下坞古,一次手指觸摸屏幕的行為會觸發(fā)一系列點擊事件,考慮如下情況:

點擊屏幕后離開松開博投,事件序列為:DOWN——>UP;

點擊屏幕滑動一會再松開绸贡,事件序列為:DOWN->MOVE->........->MOVE->UP.

同時通過MotionEvent對象我們可以得到點擊事件發(fā)生的x和y坐標(biāo),為此毅哗,系統(tǒng)提供了兩組方法:getX/getY和getRawX/getRawY听怕。

getX/getY返回的是相對于當(dāng)前View左上角的x和y坐標(biāo)

getRawX/getRawY返回的是相對于手機屏幕左上角的x和y坐標(biāo)

2、TouchSlop

TouchSlop是系統(tǒng)所能識別出的被認為是滑動的最小距離虑绵。

通過如下方式可獲取此常量:ViewConfiguration.get(getContext()).getScaledTouchSlop(); ? ?

默認值是8dp尿瞭;

4、VelocityTracker翅睛、GestureDetector和Scroller

4.1 VelocityTracker

速度追蹤声搁,用于追蹤手指在滑動過程中的速度,包括水平和豎直方向的速度捕发。

首先疏旨,在View的onTouchEvent方法中追蹤當(dāng)前單擊事件的速度:

VelocityTracker? velocityTracker=VelocityTracker.obtain();

velocityTracker.addMovement(event);

當(dāng)我們想要知道滑動速度時:

velocityTracker.computeCurrentVelocity(1000);

int? xVelocity=(int) velocityTracker.getXVelocity();

int yVelocity=(int)velocityTracker.getYVelocity();

其中,需注意兩點:

1扎酷、獲取速度之前必須先計算速度檐涝,即getXVelocity和getYVelocity這兩個方法調(diào)用前必須先調(diào)用computeCurrentVelocity方法

2、這里的速度一般指一段時間內(nèi)手指所滑過的像素數(shù)法挨,比如將時間間隔設(shè)為1000ms時谁榜,在1s內(nèi)手指在水平方向從左向右滑過100像素,那么水平速度就是100凡纳。速度可以為負數(shù)窃植。

速度的計算公式為:速度=(終點位置-起點位置)/時間段

computeCurrentVelocity這個方法的參數(shù)表示的是一個時間單元或者說時間間隔,它的單位是毫秒荐糜。

當(dāng)不需要使用時巷怜,需重置并回收內(nèi)存:

velocityTracker.clear();

velocityTracker.recycle();

4.2 GestureDetector

手勢檢測,用于輔助檢測用戶的單擊暴氏、滑動丛版、長按、雙擊等行為偏序。

首先页畦,需創(chuàng)建一個GestureDetector對象并實現(xiàn)OnGestureListener接口,根據(jù)需要我們還可以實現(xiàn)OnDoubleTapListener從而能夠監(jiān)聽雙擊行為:

GestureDetector gestureDetector=new GestureDetector(this);

gestureDetector.setIsLongPressEnabled(false);

接著研儒,接管目標(biāo)view的onTouchEvent方法:

boolean consume=gestureDetector.onToucnEvent();

return consume;

可有選擇的實現(xiàn)接口OnGestureListener和OnDoubleTapListener的方法

在日常開發(fā)中豫缨,通常會用到:onSingleTapUp(單擊)独令、onFling(快速滑動)、onScroll(拖動)好芭、onLongPress(長按)和onDoubleTap(雙擊)燃箭。

4.3 Scroller

彈性滑動對象,用于實現(xiàn)View的彈性滑動舍败。

Scroller本身無法讓View彈性滑動招狸,需要和View的computeScroll方法配合使用才能完成這個功能。

它的典型代碼是固定的:

Scroller scroller=new Scroller(mContext);

//緩慢滾動到指定位置

private void smoothScrollTo(int destX,int destY){

int scrollX=getScrollX();

int delta=destX-scrollX;

//1000ms內(nèi)滑向destX邻薯,效果就是慢慢滑動

scroller.startScroller(scrollX,0,delta,0,1000);

invalidate();

}

public void computeScroll(){

if(scroller.computeScrollOffset)
{

scrollTo(scroller.getCurrX(),scroller.getCurrY());

postInvalidate();

}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末裙戏,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子厕诡,更是在濱河造成了極大的恐慌累榜,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件灵嫌,死亡現(xiàn)場離奇詭異壹罚,居然都是意外死亡,警方通過查閱死者的電腦和手機寿羞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門猖凛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人绪穆,你說我怎么就攤上這事形病。” “怎么了霞幅?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長量瓜。 經(jīng)常有香客問我司恳,道長,這世上最難降的妖魔是什么绍傲? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任扔傅,我火速辦了婚禮,結(jié)果婚禮上烫饼,老公的妹妹穿的比我還像新娘猎塞。我一直安慰自己,他們只是感情好杠纵,可當(dāng)我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布荠耽。 她就那樣靜靜地躺著,像睡著了一般比藻。 火紅的嫁衣襯著肌膚如雪铝量。 梳的紋絲不亂的頭發(fā)上倘屹,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天,我揣著相機與錄音慢叨,去河邊找鬼纽匙。 笑死,一個胖子當(dāng)著我的面吹牛拍谐,可吹牛的內(nèi)容都是我干的烛缔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼轩拨,長吁一口氣:“原來是場噩夢啊……” “哼践瓷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起气嫁,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤当窗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后寸宵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體崖面,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年梯影,在試婚紗的時候發(fā)現(xiàn)自己被綠了巫员。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡甲棍,死狀恐怖简识,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情感猛,我是刑警寧澤七扰,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站陪白,受9級特大地震影響颈走,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜咱士,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一立由、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧序厉,春花似錦锐膜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春捞奕,著一層夾襖步出監(jiān)牢的瞬間牺堰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工颅围, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留伟葫,地道東北人。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓院促,卻偏偏與公主長得像筏养,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子常拓,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內(nèi)容