Note that there are some explanatory texts on larger screens.

plurals
  1. POHow to disable resizing image in a imagaivew after scaling it?
    primarykey
    data
    text
    <p>I'm writing a application that there are a upper-imageview and a scollview under the imageview.</p> <p>The imageview is used by a class provided by my friend, it supports pinch zoom, but after i zood in the image then i touch the scollview below, the image will resize to fit the imageview's size. </p> <p>It's a big trouble for me to build my app because i want to scroll the information after zooming.</p> <p>Then i try to change the scrollview to be a imageview as well, i find that there is not resizimg between two views.</p> <p>I wonder if it is possible to disable the resizing function for the imageview to implement my idea.</p> <p>The class below is used for the imageview.</p> <p>Thank you for solutions.</p> <pre><code>import android.content.Context; import android.graphics.Bitmap; import android.graphics.Color; import android.graphics.Matrix; import android.graphics.PointF; import android.view.MotionEvent; import android.view.ScaleGestureDetector; import android.view.View; import android.widget.ImageView; public class TouchImageView extends ImageView { Matrix matrix = new Matrix(); // We can be in one of these 3 states static final int NONE = 0; static final int DRAG = 1; static final int ZOOM = 2; int mode = NONE; // Remember some things for zooming PointF last = new PointF(); PointF start = new PointF(); float minScale = 1f; float maxScale = 3f; float[] m; float redundantXSpace, redundantYSpace; float width, height; static final int CLICK = 3; float saveScale = 1f; float right, bottom, origWidth, origHeight, bmWidth, bmHeight; int windowId; ScaleGestureDetector mScaleDetector; Context context; public TouchImageView(Context context,int id) { super(context); super.setClickable(true); this.context = context; this.windowId=id; mScaleDetector = new ScaleGestureDetector(context, new ScaleListener()); setBackgroundColor(Color.BLACK); matrix.setTranslate(1f, 1f); m = new float[9]; setImageMatrix(matrix); setScaleType(ScaleType.MATRIX); setOnTouchListener(new OnTouchListener() { 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; EasyPageActivity.resetView(); 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); } 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(); if(windowId==1){ EasyPageActivity.defineId(1); } if(windowId==2){ EasyPageActivity.defineId(2); } if(windowId==3){ EasyPageActivity.defineId(3); } if(windowId==4){ EasyPageActivity.defineId(4); } if(windowId==5){ EasyPageActivity.defineId(5); } if(windowId==6){ EasyPageActivity.defineId(6); } break; case MotionEvent.ACTION_POINTER_UP: mode = NONE; break; } setImageMatrix(matrix); invalidate(); return true; // indicate event was handled } }); } @Override public void setImageBitmap(Bitmap bm) { super.setImageBitmap(bm); bmWidth = bm.getWidth(); bmHeight = bm.getHeight(); } public void setMaxZoom(float x) { maxScale = x; } private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener { @Override public boolean onScaleBegin(ScaleGestureDetector detector) { mode = ZOOM; return true; } @Override public boolean onScale(ScaleGestureDetector detector) { float mScaleFactor = (float)Math.min(Math.max(.301f, detector.getScaleFactor()), 4); float origScale = saveScale; saveScale *= mScaleFactor; if (saveScale &gt; maxScale) { saveScale = maxScale; mScaleFactor = maxScale / origScale; } else if (saveScale &lt; minScale) { saveScale = minScale; mScaleFactor = minScale / origScale; } right = width * saveScale - width - (2 * redundantXSpace * saveScale); bottom = height * saveScale - height - (2 * redundantYSpace * saveScale); if (origWidth * saveScale &lt;= width || origHeight * saveScale &lt;= height) { matrix.postScale(mScaleFactor, mScaleFactor, width / 2, height / 2); if (mScaleFactor &lt; 1) { matrix.getValues(m); float x = m[Matrix.MTRANS_X]; float y = m[Matrix.MTRANS_Y]; if (mScaleFactor &lt; 1) { if (Math.round(origWidth * saveScale) &lt; width) { if (y &lt; -bottom) matrix.postTranslate(0, -(y + bottom)); else if (y &gt; 0) matrix.postTranslate(0, -y); } else { if (x &lt; -right) matrix.postTranslate(-(x + right), 0); else if (x &gt; 0) matrix.postTranslate(-x, 0); } } } } else { matrix.postScale(mScaleFactor, mScaleFactor, detector.getFocusX(), detector.getFocusY()); matrix.getValues(m); float x = m[Matrix.MTRANS_X]; float y = m[Matrix.MTRANS_Y]; if (mScaleFactor &lt; 1) { if (x &lt; -right) matrix.postTranslate(-(x + right), 0); else if (x &gt; 0) matrix.postTranslate(-x, 0); if (y &lt; -bottom) matrix.postTranslate(0, -(y + bottom)); else if (y &gt; 0) matrix.postTranslate(0, -y); } } return true; } } @Override protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); width = MeasureSpec.getSize(widthMeasureSpec); height = MeasureSpec.getSize(heightMeasureSpec); //Fit to screen. float scale; float scaleX = (float)width / (float)bmWidth; float scaleY = (float)height / (float)bmHeight; scale = Math.min(scaleX, scaleY); matrix.setScale(scale, scale); setImageMatrix(matrix); saveScale = 1f; // Center the image redundantYSpace = (float)height - (scale * (float)bmHeight) ; redundantXSpace = (float)width - (scale * (float)bmWidth); redundantYSpace /= (float)2; redundantXSpace /= (float)2; matrix.postTranslate(redundantXSpace, redundantYSpace); origWidth = width - 2 * redundantXSpace; origHeight = height - 2 * redundantYSpace; right = width * saveScale - width - (2 * redundantXSpace * saveScale); bottom = height * saveScale - height - (2 * redundantYSpace * saveScale); setImageMatrix(matrix); } </code></pre> <p>}</p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

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