Android開發(fā)——觸摸事件TouchEvent詳解及其應(yīng)用

2020.8.8

Activity的功能:
1.管理界面的生命周期
2.接收事件(觸摸事件)

一.觸摸事件傳遞解析

touch事件的傳遞.png

當手指按下時會首先調(diào)用onUserInteraction()方法端衰,這是觸摸事件的開始

  • 事件類型:MotionEvent類來管理
    ACTION_DOWN?按下
    ACTION_MOVE?移動
    ACTION_UP?離開屏幕
    ACTION_CANCEL?被其他應(yīng)用打斷
觸摸事件源碼分析.png

進過上面的觸摸事件分發(fā)過程旅东,如果子控件需要接收觸摸事件十艾,就必須實現(xiàn)onTouchEvent
該方法的返回值會Boolean,當返回值為true時忘嫉,表示這個事件已經(jīng)被消費案腺,就不會繼續(xù)傳遞
當返回值為false是康吵,表示這個事件沒有被消費,就繼續(xù)傳遞

二.觸摸事件的應(yīng)用

當我們的手指按下或者在屏幕上滑動時同辣,系統(tǒng)就會獲取到手指點在屏幕上的位置(x,y)耍铜,如果這個點落在了某個控件內(nèi)部,我們希望對這個控件做出一些改變棕兼,以完成某個效果,由于控件和觸摸點的相對坐標的參考是不同的靶衍,所以下面將介紹兩種方法來判斷觸摸點是否在某個控件內(nèi)部

坐標圖解.png
  • event可以獲取觸摸點的(x,y)茎芋,但該坐標是相對于整個屏幕的
    而view.x和view.y獲取的坐標是相對于容器的,因此需要進行轉(zhuǎn)換靠齊
  • Point(x,y)類專門用來管理點的坐標
    Rect(left,top,right,bottom)類專門用來管理矩形區(qū)域
  • 通過Rect(view.x涛酗,view.y偷厦,view.x+view.width,view.y+view.height)便可創(chuàng)建一個相對于容器的矩形區(qū)域
  • Rect()內(nèi)部有一個方法contains(int x, int y)便可判斷觸摸點是否在矩形區(qū)域即控件內(nèi)部
  1. 將控件轉(zhuǎn)換為相對于整個屏幕的坐標區(qū)域剖笙,而非容器
    以下代碼便可獲取控件相對于屏幕的矩形區(qū)域
val rect=Rect()
view.requestRectangleOnScreen(rect)
rect.right=rect.left+view.width
rect.bottom=rect.top+view.height

注意的是requestRectangleOnScreen()只是獲取了相對于屏幕的x,y坐標请唱,而并沒有獲取到right和bottom,這點很關(guān)鍵十绑,需要自己在進行添加

  1. 將觸摸點轉(zhuǎn)換為相對于容器的坐標,此方法只需要用event獲取的點的y坐標減去bar和狀態(tài)欄的高度即可扳躬,而bar和狀態(tài)欄的高度可以用屏幕的高度減去容器的高度


    高度計算.png
//獲取屏幕尺寸
val display=DisplayMetrics()
//獲取顯示的一個矩陣
windowManager.defaultDisplay.getMetrics(display)
//獲取內(nèi)容繪制區(qū)域的尺寸
val drawRect=Rect()
//通過獲取window上content容器->容器的rect
window.findViewById<ViewGroup>(Window.ID_ANDROID_CONTENT).getDrawingRect(drawRect)
//bar和狀態(tài)的高度即頂部高度
val topHeight=display.heightPixels-drawRect.height()
//將event的坐標進行轉(zhuǎn)換坦报,相對于容器
val point=Point(event.x.toInt(),(event.y-topHeight).toInt())

以上便是兩種進行判斷點是否在控件內(nèi)的方法,但第二種方式的計算頂部高度最好使用懶加載的方式片择,使用的時候才計算,而且只計算一次啰挪,這點很重要

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嘲叔,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子锰什,更是在濱河造成了極大的恐慌丁逝,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嫩码,死亡現(xiàn)場離奇詭異罪既,居然都是意外死亡,警方通過查閱死者的電腦和手機琢感,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門猩谊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來祭刚,“玉大人牌捷,你說我怎么就攤上這事涡驮。” “怎么了撤防?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵棒口,是天一觀的道長辜膝。 經(jīng)常有香客問我漾肮,道長,這世上最難降的妖魔是什么忱辅? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任谭溉,我火速辦了婚禮,結(jié)果婚禮上损搬,老公的妹妹穿的比我還像新娘柜与。我一直安慰自己,他們只是感情好旅挤,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布粘茄。 她就那樣靜靜地躺著签舞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪儒搭。 梳的紋絲不亂的頭發(fā)上芙贫,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天,我揣著相機與錄音魂仍,去河邊找鬼拣挪。 笑死,一個胖子當著我的面吹牛菠劝,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼寓调!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鸠珠,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤秋麸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后灸蟆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡可缚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年帘靡,在試婚紗的時候發(fā)現(xiàn)自己被綠了瓤帚。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡轩勘,死狀恐怖怯邪,靈堂內(nèi)的尸體忽然破棺而出绊寻,到底是詐尸還是另有隱情悬秉,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布驮俗,位于F島的核電站允跑,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏聋丝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一百姓、第九天 我趴在偏房一處隱蔽的房頂上張望况木。 院中可真熱鬧,春花似錦火惊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至按灶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間地沮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工摩疑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留畏铆,地道東北人。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓楷怒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親瓦灶。 傳聞我的和親對象是個殘疾皇子鸠删,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350