Android滑動沖突解決


(1).場景一:外部滑動方向跟內部滑動方向不一致,比如外部左右滑動,內部上下滑動
   ViewPager+Fragment配合使用,會有滑動沖突,但是ViewPager內部處理了這種滑動沖突
   如果采用的不是ViewPager而是ScrollView就必須手動處理滑動事件   
    
   上下滑動時,需要上一級view把消息傳遞進行,因此上一級view的onInterceptTouchEvent方法
return false;左右滑動時需要上一級view執行它的onTouchEvent方法,因此它的onInterceptTouchEvent
方法應該return true;
  
代碼如下:
   public boolean onInterceptTouchEvent(MotionEvent ev) {
   // TODO Auto-generated method stub     boolean result=false;     switch(ev.getAction()){       case MotionEvent.ACTION_DOWN:         //getX()表示以該控件的左上角為0點         //getRawX()表示以屏幕的左上角為0點        firstX=(int) ev.getX();      firstY=(int) ev.getY();      break;       case MotionEvent.ACTION_MOVE:      //手指在屏幕上水平移動的絕對值      int disX=(int) Math.abs(ev.getX()-firstX);      //手指在屏幕上豎直移動的絕對值      int disY=(int) Math.abs(ev.getY()-firstY);      if(disX>disY&&disX>10){       result=true;          }      break;         case MotionEvent.ACTION_UP:      break;       }      return result;   } 
(2).場景二:外部滑動方向跟內部滑動方向一致,內外兩層同時上下或者左右滑動
    根據業務需求來判斷
   
(3).場景三:上面兩種場景的嵌套
 
(4).滑動沖突的解決方式: 
     a.外部解決法:父容器對事件判斷是否攔截
     b.內部解決法:父容器不攔截任何事件,任何的事件都傳遞給子元素,如果子元素需要此事件就消耗掉,否則就由父容器進行處理。
   對於底層的View來說,有一種方法可以阻止父層的View截獲touch事件,就是調用getParent().requestDisallowInterceptTouchEvent(true);
   方法。一旦底層View收到touch的action后調用這個方法那么父層View就不會再調用onInterceptTouchEvent了,也無法截獲以后的action。
   
   public boolean dispatchTouchEvent(MotionEvent event){
     switch(event.getAction()){
      case MotionEvent.ACTION_DOWN:
          //父控件就不會攔截ListView的滑動事件
          parent.requestDisallowInterceptTouchEvent(true);
          break;
      case MOtionEvent.ACTION_MOVE:
         if(父容器需要此類點擊事件){
           parent.requestDisallowInterceptTouchEvent(false);
         }
         break;
      } 
      return super.dispatchTouchEvent(event);
   }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM