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

View的基礎(chǔ)需要掌握:

  1. View的位置參數(shù)
  2. MotionEvent對象和TouchSlop對象
  3. VelocityTracker對象
  4. GestureDetector對象
  5. Scroller對象
  6. ..............

1.View的位置參數(shù)

一备徐、Top, Left, Right, Bottom

View的位置主要由它的四個(gè)頂點(diǎn)來決定,分別對應(yīng)于View的四個(gè)屬性:top,left,right,bottom,其中top是左上角的縱坐標(biāo)脸爱,left是左上角的橫坐標(biāo),right是右下角的橫坐標(biāo),bottom是右下角縱坐標(biāo)。但是大家注意犹撒,這些坐標(biāo)都是相對于View的父容器來說的,因此它是一種相對坐標(biāo)粒褒,View的坐標(biāo)和父容器的關(guān)系如下圖(注:在Android中识颊,X軸和Y軸的正方向分別為右和下)

由此得出View的寬高:

width = right - left
height = bottom - top
//這四個(gè)參數(shù)可以由以下方式獲取
Left = getLeft();
Right = getRight();
Top = getTop();
Bottom = getBottom();

Android3.0后,View增加了x奕坟、y祥款、translationX和translationY這幾個(gè)參數(shù)清笨。其中x和y是View左上角的坐標(biāo),而translationX和translationY是View左上角相對于容器的偏移量刃跛。
他們之間的換算關(guān)系如下:

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

注意:View在平移的過程中函筋,top和left表示的是原始左上角的位置信息不會改變,改變的是x奠伪、y跌帐、translationX和translaY。

二绊率、MotionEvent和TouchSlop

MotionEvent

在手指接觸到屏幕后會產(chǎn)生的一系列點(diǎn)擊事件谨敛,如

ACTION_DOWN:手指剛接觸到屏幕

ACTION_MOVE:手指在屏幕上移動

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

通過MotionEven對象我們可以得到事件發(fā)生的x和y坐標(biāo),我們可以通過getX/getY和getRawX/getRawY得到滤否,它們的區(qū)別是:getX/getY返回的是相對于當(dāng)前View左上角的x和y坐標(biāo)脸狸,getRawX/getRawY返回的是相對于手機(jī)屏幕左上角的x和y坐標(biāo)。

TouchSlop

TouchSloup是系統(tǒng)所能識別出的被認(rèn)為是滑動的最小距離藐俺,這是一個(gè)常量炊甲,與設(shè)備有關(guān),可通過以下方法獲得:

ViewConfiguration.get(getContext()).getScaledTouchSloup()

3. VelocityTracker對象

速度追蹤欲芹,用于追蹤手指在滑動過程中的速度卿啡,包括水平方向速度和豎直方向速度。 使用方法:

1.在View的onTouchEvent方法中追蹤當(dāng)前單擊事件的速度

VelocityRracker velocityTracker = VelocityTracker.obtain();
velocityTracker.addMovement(event);

2.計(jì)算速度菱父,獲得水平速度和豎直速度

velocityTracker.computeCurrentVelocity(1000);
int xVelocity = (int)velocityTracker.getXVelocity();
int yVelocity = (int)velocityTracker.getYVelocity();

注意颈娜,獲取速度之前必須先計(jì)算速度,即調(diào)用computeCurrentVelocity方法浙宜,這里指的速度是指一段時(shí)間內(nèi)手指滑過的像素?cái)?shù)官辽,1000指的是1000毫秒,得到的是1000毫秒內(nèi)滑過的像素?cái)?shù)粟瞬。速度可正可負(fù):

 速度 = (終點(diǎn)位置 - 起點(diǎn)位置) / 時(shí)間段

最后同仆,當(dāng)不需要使用的時(shí)候,需要調(diào)用clear()方法重置并回收內(nèi)存:

velocityTracker.clear();
velocityTracker.recycle();

4. GestureDetector對象

手勢檢測裙品,用于輔助檢測用戶的單擊俗批、滑動、長按清酥、雙擊等行為扶镀。 使用方法

1.創(chuàng)建一個(gè)GestureDetector對象并實(shí)現(xiàn)OnGestureListener接口,根據(jù)需要焰轻,也可實(shí)現(xiàn)OnDoubleTapListener接口從而監(jiān)聽雙擊行為:

GestureDetector mGestureDetector = new GestureDetector(this);
//解決長按屏幕后無法拖動的現(xiàn)象
mGestureDetector.setIsLongpressEnabled(false);

2.在目標(biāo)View的OnTouchEvent方法中添加以下實(shí)現(xiàn)臭觉,便可接管目標(biāo)View的onTouchEvent 方法:

boolean consume = mGestureDetector.onTouchEvent(event);
return consume;

實(shí)現(xiàn)OnGestureListener和OnDoubleTapListener接口中的方法,其中常用的方法有:onSingleTapUp(單擊)、onFling(快速滑動)蝠筑、onScroll(拖動)狞膘、onLongPress(長按)和onDoubleTap(雙擊)。 建議:如果只是監(jiān)聽滑動相關(guān)的什乙,可以自己在onTouchEvent中實(shí)現(xiàn)挽封,如果要監(jiān)聽雙擊這種行為,那么就使用GestureDetector臣镣。

5. Scroller對象

彈性滑動對象辅愿,用于實(shí)現(xiàn)View的彈性滑動,可以實(shí)現(xiàn)有過度的滑動忆某。其本身無法讓View自行滑動点待,需要和View的computeScroll方法配合使用才能完成這個(gè)功能。 使用方法:

Scroller scroller = new Scroller(mContext);
//緩慢移動到指定位置
private void smoothScrollTo(int destX,int destY){
int scrollX = getScrollX();
int delta = destX - scrollX;
//1000ms內(nèi)滑向destX,效果就是慢慢滑動
mScroller.startScroll(scrollX,0,delta,0,1000);
invalidata();
}
@Override
public void computeScroll(){
if(mScroller.computeScrollOffset()){
 scrollTo(mScroller.getCurrX,mScroller.getCurrY());
 postInvalidate();
}
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末弃舒,一起剝皮案震驚了整個(gè)濱河市癞埠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌聋呢,老刑警劉巖苗踪,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異削锰,居然都是意外死亡通铲,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進(jìn)店門喂窟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來测暗,“玉大人央串,你說我怎么就攤上這事磨澡。” “怎么了质和?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵稳摄,是天一觀的道長。 經(jīng)常有香客問我饲宿,道長厦酬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任瘫想,我火速辦了婚禮仗阅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘国夜。我一直安慰自己减噪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著筹裕,像睡著了一般醋闭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上朝卒,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天证逻,我揣著相機(jī)與錄音,去河邊找鬼抗斤。 笑死囚企,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瑞眼。 我是一名探鬼主播洞拨,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼负拟!你這毒婦竟也來了烦衣?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤掩浙,失蹤者是張志新(化名)和其女友劉穎花吟,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體厨姚,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡衅澈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了谬墙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片今布。...
    茶點(diǎn)故事閱讀 39,764評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖拭抬,靈堂內(nèi)的尸體忽然破棺而出部默,到底是詐尸還是另有隱情,我是刑警寧澤造虎,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布傅蹂,位于F島的核電站,受9級特大地震影響算凿,放射性物質(zhì)發(fā)生泄漏份蝴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一氓轰、第九天 我趴在偏房一處隱蔽的房頂上張望婚夫。 院中可真熱鬧,春花似錦署鸡、人聲如沸案糙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽侍筛。三九已至萤皂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間匣椰,已是汗流浹背裆熙。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留禽笑,地道東北人入录。 一個(gè)月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像佳镜,于是被迫代替她去往敵國和親僚稿。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評論 2 354

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