이상: pointerIndex out of range
4682 단어 outrangeofpointerIndex
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
오류 원본 코드: 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;
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Outlook 2010 세션 관련 메시지 스트리밍이 예는 C#, Visual Studio 2010을 사용하여 개발되었고 Outlook 2010을 기반으로 한 응용 프로그램입니다.메일을 선택하고 리본에서 단추를 누르면 이 세션과 관련된 메일이 열립니다. 기본 코드:...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.