Android觸控事件部分細節

2021-10-25 03:10:24 字數 2230 閱讀 8258

今天,用到了乙個可在水平方向滑動listview的item的控制項,是github上的開源控制項,但是用起來總感覺不太好用,水平滑時有時滑不動,因為listview本身是有上下滑動功能的,當我們的手在滑動的時候,水平滑動的同時也有垂直滑動,如果垂直滑動的距離大於水平滑動的距離,則listview會把觸控事件攔截掉,它這樣做是為了保證listview可以上下滑動,可是一開始我們本來是想水平滑動item的,這時就會感覺不爽了,所以我要解決的就是,如果一開是水平滑動的,則後面就算上下滑也不要把觸控事件給listview了,也就是請求父view不要攔截觸控事件。

這下其實也不難,以前學觸控事件時也知道怎麼解決的,但是時間久了也會忘,所以這裡記錄一下,方便以後複習,核心**如下:

private

var downx =

0fprivate

var downy =

0fprivate

var hasmove =

false

override

funontouchevent

(event: motionevent)

: boolean

/** 處理事件突然 */

private

funprocesseventconflict

(event: motionevent)

motionevent.action_move ->

// 獲取滑動的最小距離,因為如果小於這個距離可能是誤操作

val touchslop = viewconfiguration.

get(context)

.scaledtouchslop

// 計算水平和垂直的移動距離。因為移動距離有負數的,所以要用絕對值

val horizontalmove =

abs(event.x - downx)

val verticalmove =

abs(event.y - downy)

// 如果使用者處於滑動狀態了,並且水平滑動的距離比垂直的大,則請求父view不要攔截touch事件if(

(horizontalmove >= touchslop || verticalmove >= touchslop)

&& horizontalmove > verticalmove)

} motionevent.action_up ->

hasmove =

false

/* 因為有時候收不到action_down事件,但是能收到移動事件,所以這裡

在抬起時清空一下資料,方便在移動時判斷是否有收到actiondown事件 */

downx =

0f downy =0f}

}}

可以看到,在ontouchevent方法裡面,我們呼叫了乙個processeventconflict方法來解決事件突然,後面具體的實現滑動控制項的**就沒有寫了。有幾個關鍵點需要提一下:

viewconfiguration.get(context).scaledtouchslop

這是android本身的方法,用於獲取代表滑動的最小距離,這個值可能不同的手機它的取值不一樣,像我的乙個測試手機執行結果是7畫素,也就是說如果你的手指滑動距離不夠7畫素,則應該認為使用者還沒處於滑動狀態,你不能就開始判斷使用者是向左還是向右滑了。比如使用者是想水平方向滑動的,但是一開始操作不好,最開始滑動的幾個畫素是垂直的,如果這時你就認為是垂直的,而按垂直處理那就有問題了,因為使用者有可能接下來手指會慢慢開始往水平方向走。所以在我的需求中,當使用者滑動的距離大於這個最小距離時,我再去比較水平和垂直的滑動距離,如果水平距離大,則我認為使用者是希望水平滑動的,則我請求父view不要攔截到事件,這樣做為父view的listview的垂直滑動就不會進行了,即使我們後面進行上下滑動時listview也不會動了。

移動的距離在計算的時候,是有可能產生負數的,比如從左往右滑,或從右往左滑,距離應該取絕對值。

@suppresslint("clickableviewaccessibility")

override fun ontouchevent(event: motionevent): boolean

看註解的字串「clickableviewaccessibility」也能看出就是因為輔助功能才有的這個警告,什麼是「輔助功能」?在設定裡面,可以開啟輔助功能的,比如一些盲人看不見,它會用手去摸螢幕,會發出語音,這些就是輔助功能,所以大多數情況下我們是不關注這個點的,所以直接加個註解忽略來去除此警告即可。

android觸控語音事件

android中的各種事件是由各種不同的 來完成,比如按鍵事件是由onclicklistener實現監聽,觸控是由ontouchlistener實現監聽的。首先設定監聽,然後傳入要監聽的事件 public class touch913mainactivity extends activity tv....

關於android 的觸控事件

android 觸控motionevent 事件 motionevent 事件物件 一般情況下是在view 的ontouchevent 方法中處理motionevent 事件物件的 1 首先需要獲事件的型別 可以通過getaction android2.2之後加入多點觸控支援後 使用getactio...

Android對onTouch觸控事件的處理

在android對ontouch主要呼叫三個方法對觸控傳遞 1 public boolean dispatchtouchevent motionevent ev 在觸控時,android首先呼叫的是這個方法,其分配何時呼叫onintercepttounch和ontouchevent,單純的返回tru...