View的滑動沖突

前言:滑動沖突是如何產(chǎn)生的呢觉痛?其實在界面中只要內(nèi)外兩層同時可以滑動君旦,這個時候就會產(chǎn)生滑動沖突贡蓖。如何解決滑動沖突呢甩牺?滑動沖突的解決有固定的套路蘑志,只要知道了這個固定套路問題就好解決了。

一:常見的滑動沖突場景

場景1:外部滑動方向和內(nèi)部滑動方向不一致贬派;

主要是將ViewPager和Fragment配合使用所組成的頁面滑動效果急但,主流應(yīng)用幾乎都會使用這個效果。在這個效果中搞乏,可以通過左右滑動來切換頁面波桩,而每個頁面內(nèi)部往往又是一個ListView。本來這種情況下是有滑動沖突的请敦,但是ViewPager內(nèi)部處理了這種滑動沖突镐躲,因此采用ViewPager時我們無須關(guān)注這個問題,如果我們采用的不是ViewPager而是ScrollView等侍筛,那就必須手動處理滑動沖突了萤皂,否則造成的后果就是內(nèi)外兩層只能一層能夠滑動,這是因為兩者之間的滑動事件有沖突匣椰。除了這種典型情況外裆熙,還存在其他的情況,比如外部上下滑動,內(nèi)部左右滑動等窝爪,但是它們屬于同一類滑動沖突弛车。

場景2:外部滑動方向和內(nèi)部滑動方向一致;

場景3:上面兩種情況的嵌套蒲每。

二:滑動沖突的處理規(guī)則

對于場景1,它的處理規(guī)則是:當(dāng)用戶左右滑動時喻括,需要讓外部的View攔截點擊事件邀杏,當(dāng)用戶上下滑動時,需要讓內(nèi)部View攔截點擊事件。這個時候我們就可以根據(jù)它們的特征來解決滑動沖突望蜡,具體來說是:根據(jù)滑動是水平滑動還是數(shù)值滑動來判斷到底有誰來攔截事件唤崭,根據(jù)滑動過程中兩點之間的坐標(biāo)就可以得出到底是水平滑動還是豎直滑動。如何根據(jù)坐標(biāo)來得到滑動的方向呢脖律?可以依據(jù)滑動路徑和水平方向所形成的夾角谢肾,也可以依據(jù)水平方向和豎直上的距離差來判斷,某些特殊時候還可以依據(jù)水平和豎直方向的速度差來判斷小泉。

場景2芦疏,3都是從業(yè)務(wù)的需求上得出相應(yīng)的處理規(guī)則。

三微姊、滑動沖突的解決方式

針對滑動沖突酸茴,這里給出兩種解決滑動沖突的方式:外部攔截法和內(nèi)部攔截法。

1.外部攔截法

所謂外部攔截法是指點擊事情都先經(jīng)過父容器的攔截處理兢交,如果父容器需要此事件就攔截薪捍,如果不需要此事件就不攔截,這樣就可以解決滑動沖突的問題配喳,這種方法比較符合點擊事件的分發(fā)機(jī)制酪穿。外部攔截法需要重寫父容器的onInterceptTouchEvent方法,在內(nèi)部做相應(yīng)的攔截即可晴裹。在onInterceptTouchEvent方法中昆稿,首先是ACTION_DOWN這個事件,父容器必須返回false息拜,即不攔截ACTION_DOWN事件溉潭,這是因為一旦父容器攔截了ACTION_DOWN,那么后續(xù)的ACTION_MOVE和ACTION_UP事件都會直接交由父容器處理少欺,這個時候事件沒法再傳遞給子元素了喳瓣;其次是ACTION_MOVE事件,這個事件可以根據(jù)需要來決定是否攔截赞别,如果父容器需要攔截就返回true畏陕,否則返回false;最后是ACTION_UP事件仿滔,這里必須要返回false惠毁,因為ACTION_UP事件本身沒有太多意義考慮一種情況,假設(shè)事件交由子元素處理崎页,如果父容器在ACTION_UP時返回了true鞠绰,會導(dǎo)致子元素?zé)o法接收到ACTION_UP事件,這個時候子元素中的onClick事件就無法觸發(fā)飒焦,但是父容器比較特殊蜈膨,一旦它開始攔截任何一個事件,那么后續(xù)的事件都會交給它處理,而ACTION_UP作為最后一個事件也必定可以傳遞給父容器翁巍,即便父容器的onInterceptTouchEvent方法在ACTION_UP時返回了false驴一。

2.內(nèi)部攔截法

內(nèi)部攔截法是指父容器不攔截任何事件,所有的事件都傳遞給子元素灶壶,如果子元素要消耗此事件就直接消耗掉肝断,否則就交由父容器進(jìn)行處理,這種方法和Android中的事件分發(fā)機(jī)制不一致驰凛,需要配合requestDisallowInterceptTouchEvent方法才能正常工作胸懈,使用起來較外部攔截法稍顯復(fù)雜。它的偽代碼如下洒嗤,我們需要重寫子元素的dispatchTouchEvent方法:

內(nèi)部攔截

上述代碼就是內(nèi)部攔截法的典型代碼箫荡,當(dāng)面對不同的滑動策略只需要修改里面的條件即可,其他不需要做改動渔隶,除了子元素需要處理之外羔挡,父元素默認(rèn)也要攔截除ACTION_DOWN之外的其他事件,這樣當(dāng)子元素調(diào)用getParent().requestDisallowInterceptTouchEvent(true)方法時间唉,父元素才能繼續(xù)攔截所需要的事件绞灼。為什么父容器不能攔截ACTION_DOWN事件呢?那是因為ACTION_DOWN事件并不接受FLAG_DISALLOW_DOWN這個標(biāo)記位的控制呈野,所以一旦父容器攔截低矮,那么所有的事件都無法傳遞到子元素中,這樣額你不攔截就無法起作用了被冒,父元素要做的如下修改军掂。

父元素做的修改

因為內(nèi)部攔截法沒有外部攔截法簡單易用,所以推薦采用外部攔截法來解決常見的滑動沖突昨悼。

參考鏈接:https://blog.csdn.net/qq_26787115/article/details/53047914

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蝗锥,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子率触,更是在濱河造成了極大的恐慌终议,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件葱蝗,死亡現(xiàn)場離奇詭異穴张,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)两曼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門皂甘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人合愈,你說我怎么就攤上這事叮贩』魇ǎ” “怎么了佛析?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵益老,是天一觀的道長。 經(jīng)常有香客問我寸莫,道長捺萌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任膘茎,我火速辦了婚禮桃纯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘披坏。我一直安慰自己态坦,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布棒拂。 她就那樣靜靜地躺著伞梯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪帚屉。 梳的紋絲不亂的頭發(fā)上谜诫,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機(jī)與錄音攻旦,去河邊找鬼喻旷。 笑死,一個胖子當(dāng)著我的面吹牛牢屋,可吹牛的內(nèi)容都是我干的且预。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼烙无,長吁一口氣:“原來是場噩夢啊……” “哼锋谐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起皱炉,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤怀估,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后合搅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體多搀,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年灾部,在試婚紗的時候發(fā)現(xiàn)自己被綠了康铭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡赌髓,死狀恐怖从藤,靈堂內(nèi)的尸體忽然破棺而出催跪,到底是詐尸還是另有隱情,我是刑警寧澤夷野,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布懊蒸,位于F島的核電站,受9級特大地震影響悯搔,放射性物質(zhì)發(fā)生泄漏骑丸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一妒貌、第九天 我趴在偏房一處隱蔽的房頂上張望通危。 院中可真熱鬧,春花似錦灌曙、人聲如沸菊碟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逆害。三九已至,卻和暖如春增炭,著一層夾襖步出監(jiān)牢的瞬間忍燥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工隙姿, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留梅垄,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓输玷,卻偏偏與公主長得像队丝,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子欲鹏,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

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