Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>Yes I too had the same problem not with TouchImageView.</p> <p>Too solved the problem what i did is disabled the ViewPager when my view is getting the focus.</p> <pre><code>public class EnableDisableViewPager extends ViewPager { private boolean enabled = true; public EnableDisableViewPager(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean onInterceptTouchEvent(MotionEvent arg0) { if(enabled) return super.onInterceptTouchEvent(arg0); return false; } public boolean isEnabled() { return enabled; } public void setEnabled(boolean enabled) { this.enabled = enabled; } } </code></pre> <p>so in TouchImageView implement your listener to trigger an event whether its zooming or dragging.</p> <p>set listener to your view object in your Activity. So when those event occur just disable the view Pager.</p> <p><strong>Note</strong>: you will also need a mouse up event to enable the viewpager.</p> <p><strong>EDITED</strong></p> <p>This will work only for Zoom, so for ViewPager to swipe pages you should zoom back to original. </p> <p>Add these code to your TouchImageView</p> <pre><code> public class TouchImageView extends ImageView { ... private TouchEventListener touchEventListener; private void sharedConstructing(Context context) { ... setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { ... case MotionEvent.ACTION_UP: ... if(touchEventListener != null) { if(saveScale == 1.0) touchEventListener.onZoomToOriginal(); else touchEventListener.onZoom(); } break; ... } ... } }); } ... public TouchEventListener getTouchEventListener() { return touchEventListener; } public void setTouchEventListener(TouchEventListener touchEventListener) { this.touchEventListener = touchEventListener; } public interface TouchEventListener { void onZoom(); void onZoomToOriginal(); } } </code></pre> <p><strong>BETTER SOLUTION</strong></p> <p>We could achieve this without extending ViewPager to a new Class by using the method given below.</p> <pre><code>requestDisallowInterceptTouchEvent(true); </code></pre> <p>And with this we could swipe without zooming out to original position as we see in Gallery and many other apps.</p> <pre><code>public class TouchImageView extends ImageView { ... private void stopInterceptEvent() { getParent().requestDisallowInterceptTouchEvent(true); } private void startInterceptEvent() { getParent().requestDisallowInterceptTouchEvent(false); } private void sharedConstructing(Context context) { super.setClickable(true); this.context = context; mScaleDetector = new ScaleGestureDetector(context, new ScaleListener()); matrix.setTranslate(1f, 1f); m = new float[9]; setImageMatrix(matrix); setScaleType(ScaleType.MATRIX); setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { mScaleDetector.onTouchEvent(event); matrix.getValues(m); float x = m[Matrix.MTRANS_X]; float y = m[Matrix.MTRANS_Y]; PointF curr = new PointF(event.getX(), event.getY()); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: last.set(event.getX(), event.getY()); start.set(last); mode = DRAG; stopInterceptEvent(); break; case MotionEvent.ACTION_MOVE: if (mode == DRAG) { float deltaX = curr.x - last.x; float deltaY = curr.y - last.y; float scaleWidth = Math.round(origWidth * saveScale); float scaleHeight = Math.round(origHeight * saveScale); if (scaleWidth &lt; width) { deltaX = 0; if (y + deltaY &gt; 0) deltaY = -y; else if (y + deltaY &lt; -bottom) deltaY = -(y + bottom); } else if (scaleHeight &lt; height) { deltaY = 0; if (x + deltaX &gt; 0) deltaX = -x; else if (x + deltaX &lt; -right) deltaX = -(x + right); } else { if (x + deltaX &gt; 0) deltaX = -x; else if (x + deltaX &lt; -right) deltaX = -(x + right); if (y + deltaY &gt; 0) deltaY = -y; else if (y + deltaY &lt; -bottom) deltaY = -(y + bottom); } if(deltaX == 0) startInterceptEvent(); else stopInterceptEvent(); matrix.postTranslate(deltaX, deltaY); last.set(curr.x, curr.y); } break; case MotionEvent.ACTION_UP: mode = NONE; int xDiff = (int) Math.abs(curr.x - start.x); int yDiff = (int) Math.abs(curr.y - start.y); if (xDiff &lt; CLICK &amp;&amp; yDiff &lt; CLICK) performClick(); startInterceptEvent(); break; case MotionEvent.ACTION_POINTER_UP: mode = NONE; break; } setImageMatrix(matrix); invalidate(); return true; // indicate event was handled } }); } } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload