이상: pointerIndex out of range

참고 글:http://stackoverflow.com/questions/6919292/pointerindex-out-of-range-android-multitouch
The original posting is using the pointer id when the getX and getY use the pointer index.
It appears to work when you use the ID for a single touch because the id and the index are both 0. It will mess up if you use a multi-touch because the indexes can change.
Example:
Touch 1 Down.Touch 1 State Index=0. ID=0
Touch 2 Down.Touch 1 State Index=0. ID=0Touch 2 State Index=1. ID=1
Touch 1 Release.Touch 2 State Index=0. ID=1
Try the following code:
final int action = e.getAction();       
final int pointerIndex =(action & MotionEvent.ACTION_POINTER_INDEX_MASK) 
                >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;      
float x = event.getX(pointerIndex);
float y = event.getY(pointerIndex);

 
저 는 ViewPager 1 입 니 다. ScrollView 를 상감 하고 ViewPager 2 를 상감 합 니 다.
상황 이 복잡 합 니 다. ViewPager 1 extends ViewGroup 사용자 정의 구성 요소 onInterceptTouchEvent (MotionEvent ev) 이벤트 에 잘못 보고 되 었 습 니 다.
위 글 에 따 르 면:
Example:
Touch 1 Down.Touch 1 State Index=0. ID=0
Touch 2 Down.Touch 1 State Index=0. ID=0Touch 2 State Index=1. ID=1
Touch 1 Release.Touch 2 State Index=0. ID=1
다 중 터치 가 예상 되 는 경우 MyScrollview 의 getParent (). requestDisallow Intercept TouchEvent (true) 는 ViewPager 1 중 하나의 pointerIndex 를 잃 어 버 려 서 오 류 를 초래 합 니 다.
public class MyScrollview extends  ScrollView {
@Override
  protected void onScrollChanged(int l, int t, int oldl, int oldt) {
   //               
   if (t + getHeight() >= computeVerticalScrollRange()) {
    final ViewParent parent = getParent();
    if (parent != null) {
     parent.requestDisallowInterceptTouchEvent(false);
    }
   } else {
    final ViewParent parent = getParent();
    if (parent != null) {
     parent.requestDisallowInterceptTouchEvent(true);
    }
   }
   super.onScrollChanged(l, t, oldl, oldt);
  }
}

분석:
참고 글:http://blog.csdn.net/com314159/article/details/41245329
异常:pointerIndex out of range_第1张图片
오류 원본 코드:  extends View Group 사용자 정의 구성 요소 onInterceptTouchEvent (MotionEvent ev)
dispatch Touch Event 에서 먼저 차단 처리 하 는 것 은 이론 적 으로 가능 하 다.
실행 가능 한 해결 방안 이 라 고 생각 합 니 다. 상세 한 테스트 를 하지 않 고 다 중 터치 제어 일정한 조건 이 잘못 되 었 습 니 다. 상기 분석 은 추측 일 뿐 구체 적 인 테스트 데 이 터 는 없습니다.
/** 
 * @author ZhiCheng Guo 
 * @version 2014 11 18    12:44:59          bug,   pointerIndex out of range   , 
 *                view 
 */  
public class MutipleTouchViewPager extends ViewPager {  
  
    public MutipleTouchViewPager(Context context) {  
        super(context);  
    }  
  
    public MutipleTouchViewPager(Context context, AttributeSet attrs) {  
        super(context, attrs);  
    }  
    private boolean mIsDisallowIntercept = false;  
    @Override  
    public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) {  
        // keep the info about if the innerViews do  
        // requestDisallowInterceptTouchEvent  
        mIsDisallowIntercept = disallowIntercept;  
        super.requestDisallowInterceptTouchEvent(disallowIntercept);  
    }  
  
    @Override  
    public boolean dispatchTouchEvent(MotionEvent ev) {  
        // the incorrect array size will only happen in the multi-touch  
        // scenario.  
        if (ev.getPointerCount() > 1 && mIsDisallowIntercept) {  
            requestDisallowInterceptTouchEvent(false);  
            boolean handled = super.dispatchTouchEvent(ev);  
            requestDisallowInterceptTouchEvent(true);  
            return handled;  
        } else {  
            return super.dispatchTouchEvent(ev);  
        }  
    }  
}

물론 try catch 도 좋 지만 try catch 를 하지 않 으 면 try catch 를 하지 않 겠 습 니 다.
 
public class PictureChildViewPager extends ViewPager {
public PictureChildViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
public PictureChildViewPager(Context context) {
super(context);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
try {
return super.onInterceptTouchEvent(ev);
} catch (IllegalArgumentException e) {
e.printStackTrace();
return false;
}
}
@Override
public boolean onTouchEvent(MotionEvent arg0) {
try {
return super.onTouchEvent(arg0);
} catch (IllegalArgumentException ex) {
return false;
}
}
}

좋은 웹페이지 즐겨찾기