android - implementing zoom effect in imageView and viewPager -


i new here. want implement pinch zoom effect on imageview inside viewpager. code of how zoom image. when implement code inside viewpage didnt work.image got zoomed when scroll image horizontely scrolled whole page. here code.

public object instantiateitem(view collection, final int position) {               view layout = null;             layoutinflater inflater = (layoutinflater) collection.getcontext()                     .getsystemservice(context.layout_inflater_service);             layout = inflater.inflate(r.layout.test, null);             img = (touchimageview) layout.findviewbyid(r.id.slides);             img.setmaxzoom(4f);              bitmap b = bitmapfactory.decodefile(imagesnames.get(position));             img.setimagebitmap(b);             ((viewpager) collection).addview(layout, 0);             return layout;         } 

main.xml

<relativelayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android.com/tools"     android:layout_width="match_parent"     android:layout_height="match_parent"      tools:context=".scanbook" >      <android.support.v4.view.viewpager         android:id="@+id/pager"         android:layout_width="wrap_content"         android:layout_height="wrap_content" />      <progressbar         android:id="@+id/pb"         style="?android:attr/progressbarstylelarge"         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:layout_centerhorizontal="true"         android:layout_centervertical="true" />  </relativelayout> 

customimage.java

/*  * touchimageview.java  * by: michael ortiz  * updated by: patrick lackemacher  * updated by: babay88  * -------------------  * extends android imageview include pinch zooming , panning.  */  package com.absologix.sbk.views;  import android.content.context; import android.graphics.matrix; import android.graphics.pointf; import android.graphics.drawable.drawable; import android.util.attributeset; import android.util.log; import android.view.motionevent; import android.view.scalegesturedetector; import android.view.view; import android.widget.imageview;  public class touchimageview extends imageview {      matrix matrix;      // can in 1 of these 3 states     static final int none = 0;     static final int drag = 1;     static final int zoom = 2;     int mode = none;      // remember things zooming     pointf last = new pointf();     pointf start = new pointf();     float minscale = 1f;     float maxscale = 3f;     float[] m;       int viewwidth, viewheight;     static final int click = 3;     float savescale = 1f;     protected float origwidth, origheight;     int oldmeasuredwidth, oldmeasuredheight;       scalegesturedetector mscaledetector;      context context;      public touchimageview(context context) {         super(context);         sharedconstructing(context);     }      public touchimageview(context context, attributeset attrs) {         super(context, attrs);         sharedconstructing(context);     }     public float getsavescale() {         return savescale;     }      private void sharedconstructing(context context) {         super.setclickable(true);         this.context = context;         mscaledetector = new scalegesturedetector(context, new scalelistener());         matrix = new matrix();         m = new float[9];         setimagematrix(matrix);         setscaletype(scaletype.matrix);          setontouchlistener(new ontouchlistener() {              @override             public boolean ontouch(view v, motionevent event) {                 mscaledetector.ontouchevent(event);                 pointf curr = new pointf(event.getx(), event.gety());                  switch (event.getaction()) {                     case motionevent.action_down:                         last.set(curr);                         start.set(last);                         mode = drag;                         break;                      case motionevent.action_move:                         if (mode == drag) {                             float deltax = curr.x - last.x;                             float deltay = curr.y - last.y;                             float fixtransx = getfixdragtrans(deltax, viewwidth, origwidth * savescale);                             float fixtransy = getfixdragtrans(deltay, viewheight, origheight * savescale);                             matrix.posttranslate(fixtransx, fixtransy);                             fixtrans();                             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 < click && ydiff < click)                             performclick();                         break;                      case motionevent.action_pointer_up:                         mode = none;                         break;                 }                  setimagematrix(matrix);                 invalidate();                 return true; // indicate event handled             }          });     }      public void setmaxzoom(float x) {         maxscale = x;     }     public float getmaxscale() {         return maxscale;     }      private class scalelistener extends scalegesturedetector.simpleonscalegesturelistener {         @override         public boolean onscalebegin(scalegesturedetector detector) {             mode = zoom;             return true;         }          @override         public boolean onscale(scalegesturedetector detector) {             float mscalefactor = detector.getscalefactor();             float origscale = savescale;             savescale *= mscalefactor;             if (savescale > maxscale) {                 savescale = maxscale;                 mscalefactor = maxscale / origscale;             } else if (savescale < minscale) {                 savescale = minscale;                 mscalefactor = minscale / origscale;             }              if (origwidth * savescale <= viewwidth || origheight * savescale <= viewheight)                 matrix.postscale(mscalefactor, mscalefactor, viewwidth / 2, viewheight / 2);             else                 matrix.postscale(mscalefactor, mscalefactor, detector.getfocusx(), detector.getfocusy());              fixtrans();             return true;         }     }      void fixtrans() {         matrix.getvalues(m);         float transx = m[matrix.mtrans_x];         float transy = m[matrix.mtrans_y];          float fixtransx = getfixtrans(transx, viewwidth, origwidth * savescale);         float fixtransy = getfixtrans(transy, viewheight, origheight * savescale);          if (fixtransx != 0 || fixtransy != 0)             matrix.posttranslate(fixtransx, fixtransy);     }      float getfixtrans(float trans, float viewsize, float contentsize) {         float mintrans, maxtrans;          if (contentsize <= viewsize) {             mintrans = 0;             maxtrans = viewsize - contentsize;         } else {             mintrans = viewsize - contentsize;             maxtrans = 0;         }          if (trans < mintrans)             return -trans + mintrans;         if (trans > maxtrans)             return -trans + maxtrans;         return 0;     }      float getfixdragtrans(float delta, float viewsize, float contentsize) {         if (contentsize <= viewsize) {             return 0;         }         return delta;     }      @override     protected void onmeasure(int widthmeasurespec, int heightmeasurespec) {         super.onmeasure(widthmeasurespec, heightmeasurespec);         viewwidth = measurespec.getsize(widthmeasurespec);         viewheight = measurespec.getsize(heightmeasurespec);          //         // rescales image on rotation         //         if (oldmeasuredheight == viewwidth && oldmeasuredheight == viewheight                 || viewwidth == 0 || viewheight == 0)             return;         oldmeasuredheight = viewheight;         oldmeasuredwidth = viewwidth;          if (savescale == 1) {             //fit screen.             float scale;              drawable drawable = getdrawable();             if (drawable == null || drawable.getintrinsicwidth() == 0 || drawable.getintrinsicheight() == 0)                 return;             int bmwidth = drawable.getintrinsicwidth();             int bmheight = drawable.getintrinsicheight();              log.d("bmsize", "bmwidth: " + bmwidth + " bmheight : " + bmheight);              float scalex = (float) viewwidth / (float) bmwidth;             float scaley = (float) viewheight / (float) bmheight;             scale = math.min(scalex, scaley);             matrix.setscale(scale, scale);              // center image             float redundantyspace = (float) viewheight - (scale * (float) bmheight);             float redundantxspace = (float) viewwidth - (scale * (float) bmwidth);             redundantyspace /= (float) 2;             redundantxspace /= (float) 2;              matrix.posttranslate(redundantxspace, redundantyspace);              origwidth = viewwidth - 2 * redundantxspace;             origheight = viewheight - 2 * redundantyspace;             setimagematrix(matrix);         }         fixtrans();     } } 

i have implemented dreddik / androidtouchgallery in project. working fine me. suggest take @ it. little bit modification needed.

it has viewpager touchimageview can zoomed , pan multi-touch.

edit

second option there implement chrisbanes/photoview. has features want.


Comments

Popular posts from this blog

Change php variable from jquery value using ajax (same page) -

Pull out data related to my apps from Android Play Store and iOS App Store -

How can I fetch data from a web server in an android application? -