错误日志:
04-28 14:23:30.680 387-387/com.xxx.xxxx E/MessageQueue-JNI: Exception in MessageQueue callback: handleReceiveCallback
04-28 14:23:30.690 387-387/com.xxx.xxxx E/MessageQueue-JNI: java.lang.IllegalArgumentException: pointerIndex out of range
at android.view.MotionEvent.nativeGetAxisValue(Native Method)
at android.view.MotionEvent.getX(MotionEvent.java:1979)
at android.support.v4.view.MotionEventCompatEclair.getX(MotionEventCompatEclair.java:32)
at android.support.v4.view.MotionEventCompat$EclairMotionEventVersionImpl.getX(MotionEventCompat.java:110)
at android.support.v4.view.MotionEventCompat.getX(MotionEventCompat.java:462)
at android.support.v4.view.ViewPager.onInterceptTouchEvent(ViewPager.java:1987)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1859)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.jav
错误原因:PhotoView和viewPager冲突问题
原因理解:
多次触发触摸屏事件,导致对同一个事件处理的消息过多,当第一个消息已处理完事件并销毁事件时,由于该事件已销毁但还没来得及通知销毁第二个同样的消息,当主线程执行第二个消息时,由于获取不了该事件,所以抛出异常。 解决:用try..catch..包围onTouch() 和 onInterceptTouchEvent()事件处理。
解决方法:
解决方法:重写viewpager的onInterceptTouchEvent()和onTouchEvent()方法,将其try{}catch(){}
/** * PhotoViewPager * @author: mhj * @date: 16/4/28 下午2:29 * 解决连续缩放photoview报错问题 * 主要原因是viewpager和photoview冲突 * 解决方法:重写viewpager的onInterceptTouchEvent()和onTouchEvent()方法,将其try{}catch(){} */ public class PhotoViewPager extends ViewPager { private boolean isLocked; public PhotoViewPager(Context context) { super(context); isLocked = false; } public PhotoViewPager(Context context, AttributeSet attrs) { super(context, attrs); isLocked = false; } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { if (!isLocked) { try { return super.onInterceptTouchEvent(ev); } catch (IllegalArgumentException e) { e.printStackTrace(); return false; } } return false; } @Override public boolean onTouchEvent(MotionEvent event) { return !isLocked && super.onTouchEvent(event); } public void toggleLock() { isLocked = !isLocked; } public void setLocked(boolean isLocked) { this.isLocked = isLocked; } public boolean isLocked() { return isLocked; } }
xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:background="#000" android:layout_height="match_parent" android:orientation="vertical" > <com.xxx.xxxx.view.PhotoViewPager android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="match_parent" > </com.xxx.xxxx.view.PhotoViewPager> </LinearLayout>