Scale limits on pinch zoom of android -
how set max , min zoom levels pinch-zoom?
here code: //
public class touchimageview extends imageview { private static final string tag = "touch"; // these matrices used move , zoom image matrix matrix = new matrix(); matrix savedmatrix = new matrix(); static pinchzoomexample spinchzoomexample = null; // 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; static bitmap scurrentimage; // remember things zooming pointf start = new pointf(); pointf mid = new pointf(); float olddist = 1f; context context; public touchimageview(context context) { super(context); super.setclickable(true); this.context = context; matrix.settranslate(1f, 1f); setimagematrix(matrix); setscaletype(scaletype.matrix); setontouchlistener(new ontouchlistener() { @override public boolean ontouch(view v, motionevent rawevent) { wrapmotionevent event = wrapmotionevent.wrap(rawevent); // dump touch event log /* if (viewer.isdebug == true){ dumpevent(event); }*/ // handle touch events here... switch (event.getaction() & motionevent.action_mask) { case motionevent.action_down: savedmatrix.set(matrix); start.set(event.getx(), event.gety()); log.d(tag, "mode=drag"); mode = drag; break; case motionevent.action_pointer_down: olddist = spacing(event); log.d(tag, "olddist=" + olddist); if (olddist > 10f) { savedmatrix.set(matrix); midpoint(mid, event); mode = zoom; log.d(tag, "mode=zoom"); } break; case motionevent.action_up: int xdiff = (int) math.abs(event.getx() - start.x); int ydiff = (int) math.abs(event.gety() - start.y); if (xdiff < 8 && ydiff < 8){ performclick(); spinchzoomexample.displaygallery(); } case motionevent.action_pointer_up: mode = none; log.d(tag, "mode=none"); break; case motionevent.action_move: if (mode == drag) { // ... matrix.set(savedmatrix); matrix.posttranslate(event.getx() - start.x, event.gety() - start.y); } else if (mode == zoom) { float newdist = spacing(event); log.d(tag, "newdist=" + newdist); if (newdist > 10f) { matrix.set(savedmatrix); float scale = newdist / olddist; matrix.postscale(scale, scale, mid.x, mid.y); //canvas canvas = new canvas(); // bitmap bm = bitmap.createbitmap(scurrentimage,0, 0, scurrentimage.getwidth() // , scurrentimage.getheight(), matrix, true); log.d("scale", "scale=" + scale + " " + getwidth() + " " + getheight()); //bm.recycle(); } } break; } setimagematrix(matrix); return true; // indicate event handled } }); } public void setimage(bitmap bm, int displaywidth, int displayheight , pinchzoomexample pze) { super.setimagebitmap(bm); scurrentimage = bm; spinchzoomexample = pze; //fit screen. float scale; if ((displayheight / bm.getheight()) >= (displaywidth / bm.getwidth())){ scale = (float)displaywidth / (float)bm.getwidth(); } else { scale = (float)displayheight / (float)bm.getheight(); } savedmatrix.set(matrix); matrix.set(savedmatrix); matrix.postscale(scale, scale, mid.x, mid.y); setimagematrix(matrix); // center image float redundantyspace = (float)displayheight - (scale * (float)bm.getheight()) ; float redundantxspace = (float)displaywidth - (scale * (float)bm.getwidth()); redundantyspace /= (float)2; redundantxspace /= (float)2; savedmatrix.set(matrix); matrix.set(savedmatrix); matrix.posttranslate(redundantxspace, redundantyspace); //matrix.posttranslate(50, 50); setimagematrix(matrix); } /** determine space between first 2 fingers */ private float spacing(wrapmotionevent event) { // ... float x = event.getx(0) - event.getx(1); float y = event.gety(0) - event.gety(1); return floatmath.sqrt(x * x + y * y); } /** calculate mid point of first 2 fingers */ private void midpoint(pointf point, wrapmotionevent event) { // ... float x = event.getx(0) + event.getx(1); float y = event.gety(0) + event.gety(1); point.set(x / 2, y / 2); } }
private static final float min_zoom = 1.0f; private static final float max_zoom = 5.0f; scale = math.max(min_zoom, math.min(scale, max_zoom));
Comments
Post a Comment