Photoview: IllegalArgumentException (pointerIndex out of range) while using many fingers to zoom in and out

Created on 10 Feb 2013  路  34Comments  路  Source: Baseflow/PhotoView

(Android 4.2.1 - Samsung Galaxy Nexus)

java.lang.IllegalArgumentException: pointerIndex out of range
at android.view.MotionEvent.nativeGetAxisValue(Native Method)
at android.view.MotionEvent.getX(MotionEvent.java:1981)
at android.support.v4.view.MotionEventCompatEclair.getX(MotionEventCompatEclair.java:32)
at android.support.v4.view.MotionEventCompat$EclairMotionEventVersionImpl.getX(MotionEventCompat.java:86)
at android.support.v4.view.MotionEventCompat.getX(MotionEventCompat.java:184)
at android.support.v4.view.ViewPager.onInterceptTouchEvent(ViewPager.java:1339)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1817)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1953)
at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1405)
at android.app.Activity.dispatchTouchEvent(Activity.java:2410)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1901)
at android.view.View.dispatchPointerEvent(View.java:7419)
at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3220)
at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3165)
at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4292)
at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4271)
at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4363)
at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:179)
at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method)
at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:171)
at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:4342)
at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:4382)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
at android.view.Choreographer.doCallbacks(Choreographer.java:562)
at android.view.Choreographer.doFrame(Choreographer.java:530)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
at android.os.Handler.handleCallback(Handler.java:725)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5191)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
at dalvik.system.NativeStart.main(Native Method)

bug duplicate

Most helpful comment

It's the android ViewPager's bug
stackoverflow's report: http://stackoverflow.com/questions/6919292/pointerindex-out-of-range-android-multitouch
android's report: http://code.google.com/p/android/issues/detail?id=18990

My simple's method to fix this bug:
You can extends the ViewPager class, your own ViewPager should override the onTouchEvent and the onInterceptTouchEvent methods, and try-catch the IllegalArgumentException exception. Then use your own ViewPager class in layout or others you want.

Examples:

/** Custom your own ViewPager to extends support ViewPager. java source: */
/** Created by azi on 2013-6-21.  */

package com.chaokuadi.android.support.view;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;

public class ViewPagerFixed extends android.support.v4.view.ViewPager {

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

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

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        try {
            return super.onTouchEvent(ev);
        } catch (IllegalArgumentException ex) {
            ex.printStackTrace();
        }
        return false;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        try {
            return super.onInterceptTouchEvent(ev);
        } catch (IllegalArgumentException ex) {
            ex.printStackTrace();
        }
        return false;
    }
}
/** ViewPager layout */
<?xml version="1.0" encoding="utf-8"?>
<com.chaokuaidi.android.support.view.ViewPagerFixed xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/pager"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" />

All 34 comments

Me too facing this issue...Any update on it..like how to fix this..?

Same crash. It happened when i try to scroll to the edge of image when image are zoomed in

same for me...

This happens even when you zoom out a lot.

+1

LGE Nexus 4 showed the same issue.

Solved with this until a better solution comes up.

I got crash like you too.....

It's the android ViewPager's bug
stackoverflow's report: http://stackoverflow.com/questions/6919292/pointerindex-out-of-range-android-multitouch
android's report: http://code.google.com/p/android/issues/detail?id=18990

My simple's method to fix this bug:
You can extends the ViewPager class, your own ViewPager should override the onTouchEvent and the onInterceptTouchEvent methods, and try-catch the IllegalArgumentException exception. Then use your own ViewPager class in layout or others you want.

Examples:

/** Custom your own ViewPager to extends support ViewPager. java source: */
/** Created by azi on 2013-6-21.  */

package com.chaokuadi.android.support.view;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;

public class ViewPagerFixed extends android.support.v4.view.ViewPager {

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

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

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        try {
            return super.onTouchEvent(ev);
        } catch (IllegalArgumentException ex) {
            ex.printStackTrace();
        }
        return false;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        try {
            return super.onInterceptTouchEvent(ev);
        } catch (IllegalArgumentException ex) {
            ex.printStackTrace();
        }
        return false;
    }
}
/** ViewPager layout */
<?xml version="1.0" encoding="utf-8"?>
<com.chaokuaidi.android.support.view.ViewPagerFixed xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/pager"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" />

azibug's solution is working for me. Thx!

@azibug your solution is can work,thanks!

Great, azibug!!!! it work for me, many thanks!

@chrisbanes Isn't this bug already fixed with the HackyViewPager in the sample?

This issue is directly related to #72, using HackyViewPager or HackyDrawerLayout you can ommit the exception and continue to use the application. #72 will aim to fix the cause, and remove the need of using custom layout components definition.

I have the similar problem, using the HackyViewPager, in a Android 2.3.6 device... the problem persists...

@felipepx Are you sure you use right XML definition? Can you paste a stacktrace in this thread? What version of Support v4 library?

@smarek, I saved the log yesterday but accidentally I have deleted it from my desktop. The log was similar to the first post. I'm using the newest version of the library and also using the HackyPagerView. I have tested in my cousin's device, my devices have Android 4.2.2+ :(

sc20130915-225639

private ViewPager mViewPager;

in the onCreate Method:

mViewPager = (HackyViewPager) this.findViewById(R.id.hackyViewPager1);
ReaderAdapter rAdapter = new ReaderAdapter(imagesPaths);
mViewPager.setAdapter(rAdapter);
mViewPager.setOnPageChangeListener(this);

My ReaderAdapter:

    static class ReaderAdapter extends PagerAdapter {
        String[] images;

        public ReaderAdapter(String[] images){
            this.images = images;

        }

        @Override
        public int getCount() {
            return images.length;
        }

        @Override
        public View instantiateItem(ViewGroup container, int position) {
            PhotoView photoView = new PhotoView(container.getContext());
            photoView.setImageBitmap(returnBitmap(images[position]));
            container.setFocusableInTouchMode(true);
            container.addView(photoView, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
            container.setBackgroundColor(Color.BLACK);          
            return photoView;
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView((View) object);
        }

        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view == object;
        }

        public Bitmap returnBitmap(String filepath){
            File imagefile = new File(filepath);
            FileInputStream fis = null;
            try {
                fis = new FileInputStream(imagefile);
                } catch (FileNotFoundException e) {
                e.printStackTrace();
            }

            Bitmap bm = BitmapFactory.decodeStream(fis);
            return bm;
        }

    }

My HackyViewPager:

public class HackyViewPager extends ViewPager {

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

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

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        try {
            return super.onInterceptTouchEvent(ev);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

}

And my layout XML file:

<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2011 Jake Wharton

     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at

          http://www.apache.org/licenses/LICENSE-2.0

     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >

    <uk.co.senab.photoview.HackyViewPager
        android:id="@+id/hackyViewPager1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#000" >
    </uk.co.senab.photoview.HackyViewPager>

    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="36dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:background="#aaffffff"
        android:descendantFocusability="beforeDescendants"
        android:focusableInTouchMode="true"
        android:gravity="center" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:gravity="center"
        android:text="@string/reader_page"
        android:textSize="12dp"
        android:textStyle="bold" />

    <EditText
        android:id="@+id/currentPageText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_marginTop="2dp"
        android:layout_toRightOf="@+id/textView1"
        android:ems="3"
        android:gravity="center"
        android:inputType="number"
        android:textColor="#1c8fdc"
        android:textSize="12dp"
        android:textStyle="bold" >

    </EditText>

    <TextView
        android:id="@+id/pageText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentTop="true"
        android:layout_toRightOf="@+id/currentPageText"
        android:gravity="center"
        android:text="TextView"
        android:textSize="12dp"
        android:textStyle="bold" />

    </RelativeLayout>

</RelativeLayout>

This are working perfectly on my Android 4.2.2+ devices.... the crash only occurs if I'm testing on the Android 2.3.6 device...

@felipepx please obtain the stacktrace, as it is important to me to know, whether your issue is this one or not.
Also are you using latest release (1.2.1) or the dev branch?
I see nothing wrong with your code, maybe just try to use dev version of HackyViewPager, where the methods are onTouchEvent and onInterceptTouchEvent, see the @azibug post above.

I'm using the latest release 1.2.1. I'm using only the Dev Version of HackyViewPager

@felipepx Try please dev version of PhotoView with HackyViewPager from sample in dev and give me know. Thanks

@smarek So far no error occurred using the dev version.... Thanks :+1:

My problem is also resolved with azibug's method, 3ku~~~~

Thanks Azibug, it works fine!

is Dev version = 1.3-SNAPSHOT?
Could you release it on maven central as 1.3?
-SNAPSHOT is for betas/dev versions...

azibug's solution is working for me 2. Thx!

@azibug Thx very much!!!!!!

Can someone help me here. I facing the same issue. I am using HackPageViewer the solution proposed by @azibug but still I am not able to resolve it.

@zahid--ali Can't you just catch and ignore the exception where it pops up?

@azibug nice solution. Works perfect. Thx

an easier solution than @azibug that worked for me is to override dispatchTouchEvent(MotionEvent ev) like this in your activity class that contains the view pager. But I am not sure if its the correct way.

@Override 
public boolean dispatchTouchEvent(MotionEvent ev){
        try {
            return super.dispatchTouchEvent(ev)
        }catch (Exception e){
            e.printStackTrace()
            return true
        }
  }

@UkTheScientist solution doesn't work for me with com.android.support:support-v4:26.1.0 and API 26.

@azibug Thanks, it is working perfectly.

闈炲父鎰熻阿,瀹岀編鐨勮В鍐充簡杩欎釜闂 Thanks a lot, the perfect solved the problem

@azibug how do i fix it for PhotoView, i can extend ViewPager and ignore the exception but that won't change the implementation of PhotoView. Photoview makes use of default ViewPager, how am i going to change that to get it working ?

Was this page helpful?
0 / 5 - 0 ratings

Related issues

hameno picture hameno  路  3Comments

nithinpmolethu picture nithinpmolethu  路  11Comments

fkirc picture fkirc  路  4Comments

macpraveen picture macpraveen  路  4Comments

keeblebogdan picture keeblebogdan  路  5Comments