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
Post a Comment