Android-解決事件沖突和處理滑動事件

1.解決事件沖突的主要思路
  • 1.down事件首先會傳遞到onInterceptTouchEvent()方法
  • 2.如果該ViewGroup的OnInterceptTouchEvent()在接收到down事件處理完成之后return false,那么后續(xù)的move,up等事件藤滥,將繼續(xù)會先傳遞給該ViewGroup,之后才和down事件一樣傳遞給最終的目標(biāo)view的onTouchEvent()處理
  • 3.如果該ViewGroup的onTnterceptTouchEvent()在接收到down事件處理完成之后return true,那么后續(xù)的move,up等事件境氢,將不再傳遞給onInterceptTouchEvent()椿猎,而是和down事件一樣傳遞給該ViewGroup的onTouchEvent()處理食棕,注意,目標(biāo)view
    將接收不到任何事件
  • 4.如果最終需要處理事件的view的onTouchEvent()返回了false ,那么該事件將被傳遞至其上一層次的view的onTouchEvent()處理
  • 5.如果最終需要處理事件的view 的onTouchEvent()返回了true,那么后續(xù)事件將可以繼續(xù)傳遞給該view的onTouchEvent()處理
2.主要方法:外部攔截法和內(nèi)部攔截法
  • 2.1外部攔截法:情景:一個ViewPager嵌套了一個Listview馁痴,一個是左右滑動谊娇,一個上下滑動。這個時候我們可以用外部攔截法,來處理沖突济欢。在父容器ViewPager中赠堵,重寫onInterceptTouchEvent()方法,判斷當(dāng)左右滑動時就攔截事件法褥,上下滑動就不攔截茫叭,將事件交由子元素Listview來處理。首先我們需要重寫一個ViewPager半等,叫MyViewPager揍愁,然后重寫onInterceptTouchEvent()方法。具體代碼如下:

    public class MyViewPager extends ViewPager {
        private int startX;
        private int startY;
       public MyViewPager(Context context) {
          super(context);
    }
    
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
       switch (ev.getAction())
       {
           case MotionEvent.ACTION_DOWN:
              startX= (int) ev.getX();
               startY= (int) ev.getY();
               break;
           case MotionEvent.ACTION_MOVE:
    
               int dX= (int) (ev.getX()-startX);
               int dY= (int) (ev.getY()-startX);
               if(Math.abs(dX)>Math.abs(dY)){//左右滑動
                   return true;
               }else {//上下滑動
                  return false;
               }
           case MotionEvent.ACTION_UP:
               break;
       }
       return super.onInterceptTouchEvent(ev);
      }
    }
    
  • 2.2內(nèi)部攔截法:情景:一個ViewPager嵌套了一個ViewPager杀饵,兩個都是左右滑動莽囤。這個時候我們可以用內(nèi)部攔截法,來處理沖突切距。即重寫子元素的dispatchTouchEvent()方法朽缎,并調(diào)用getParent().requestDisallowInterceptTouchEvent(true)是父容器不能攔截子元素需要的事件。下面來看具體代碼:

    public boolean dispatchTouchEvent(MotionEvent event) {
      ...
    
       switch (action) {
            case MotionEvent.ACTION_MOVE:
                        getParent().requestDisallowInterceptTouchEvent(true);
    
               break;
           case MotionEvent.ACTION_MOVE:
               if(子元素需要處理此事件)
                          getParent().requestDisallowInterceptTouchEvent(true);
    
               break;
          case MotionEvent.ACTION_UP: {
               break;
       }
       ...
       return super.dispatchTouchEvent(event);
     ;
    }
    

案例二:

public class HorizontalScrollViewPager extends ViewPager{

public HorizontalScrollViewPager(Context context) {
    super(context);
}

public HorizontalScrollViewPager(Context context, AttributeSet attrs) {
    super(context,attrs);
}

private float startX;
private float startY;
/**
 * 事件分發(fā)
 */
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
   // getParent().requestDisallowInterceptTouchEvent(true); //把事件傳遞給自己
    switch(ev.getAction()) {
        case MotionEvent.ACTION_DOWN:
            //一定要把事件給自己
            getParent().requestDisallowInterceptTouchEvent(true);
            //1.記錄起始坐標(biāo)
            startX = ev.getX();
            startY = ev.getY();
            break;
        case MotionEvent.ACTION_MOVE:
            //1.來到新的坐標(biāo)
            float endX = ev.getX();
            float endY = ev.getY(); ev.getRawX();
            //2.計算偏移量
            float distanceX = endX - startX;
            float distanceY = endY - startY;
            //3.判斷滑動方向
            if(Math.abs(distanceX) > Math.abs(distanceY)) {
                //水平方向滑動
                //1.如果第0個位置谜悟,并且滑動方向是從左到右滑動
                //getParent().requestDisallowInterceptTouchEvent(false);
                if(getCurrentItem() == 0 && distanceX >0 ) {
                    getParent().requestDisallowInterceptTouchEvent(false);
                }
               // 2.如果是頁簽頁面的最后一個位置话肖,并且滑動方向是從右向左滑動
                //getParent().requestDisallowInterceptTouchEvent(false);
                else if (getCurrentItem() == (getAdapter().getCount()-1) && distanceX <0) {
                    getParent().requestDisallowInterceptTouchEvent(false);
                }
               // 3.其他中間部分
               // getParent().requestDisallowInterceptTouchEvent(true);*/
                else {
                    getParent().requestDisallowInterceptTouchEvent(true);
                }
            } else {
                //豎值方向滑動
                getParent().requestDisallowInterceptTouchEvent(false);
            }
            break;
        case MotionEvent.ACTION_UP:
            break;
    }
    return super.dispatchTouchEvent(ev);
  }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市葡幸,隨后出現(xiàn)的幾起案子狼牺,更是在濱河造成了極大的恐慌,老刑警劉巖礼患,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異掠归,居然都是意外死亡缅叠,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進店門虏冻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肤粱,“玉大人,你說我怎么就攤上這事厨相×炻” “怎么了?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵蛮穿,是天一觀的道長庶骄。 經(jīng)常有香客問我,道長践磅,這世上最難降的妖魔是什么单刁? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮府适,結(jié)果婚禮上羔飞,老公的妹妹穿的比我還像新娘肺樟。我一直安慰自己,他們只是感情好逻淌,可當(dāng)我...
    茶點故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布么伯。 她就那樣靜靜地躺著,像睡著了一般卡儒。 火紅的嫁衣襯著肌膚如雪田柔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天朋贬,我揣著相機與錄音凯楔,去河邊找鬼。 笑死锦募,一個胖子當(dāng)著我的面吹牛摆屯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播糠亩,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼虐骑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了赎线?” 一聲冷哼從身側(cè)響起廷没,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎垂寥,沒想到半個月后颠黎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡滞项,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年狭归,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片文判。...
    茶點故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡过椎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出戏仓,到底是詐尸還是另有隱情疚宇,我是刑警寧澤,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布赏殃,位于F島的核電站敷待,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏嗓奢。R本人自食惡果不足惜讼撒,卻給世界環(huán)境...
    茶點故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧根盒,春花似錦钳幅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至册赛,卻和暖如春钠导,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背森瘪。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工牡属, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人扼睬。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓逮栅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親窗宇。 傳聞我的和親對象是個殘疾皇子措伐,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,747評論 2 361

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