如何设置捏拉变焦的最大和最小缩放级别?
这是我的代码: //
public class TouchImageView extends ImageView {
private static final String TAG = "Touch";
// These matrices will be used to move and zoom image
Matrix matrix = new Matrix();
Matrix savedMatrix = new Matrix();
static PinchZoomExample sPinchZoomExample = null;
// 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;
static Bitmap sCurrentImage;
// Remember some things for 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 to 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 was handled
}
});
}
public void setImage(Bitmap bm, int displayWidth, int displayHeight , PinchZoomExample pze) {
super.setImageBitmap(bm);
sCurrentImage = bm;
sPinchZoomExample = pze;
//Fit to 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 the 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 the space between the first two 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 the mid point of the first two 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);
}
}
答案 0 :(得分:7)
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));
答案 1 :(得分:2)
在这里查看我的答案。它只需很少的额外编码工作。
答案 2 :(得分:1)
创建临时矩阵(temp),将当前矩阵保存在其中并缩放临时矩阵。然后检查temp matrix的MSCALE_X值。
如果您的临时矩阵的缩放在限制范围内,请对矩阵进行后缩放并将其保存在另一个矩阵(savedMatrixZoom)中。如果超出限制,只需从SavedMatrixZoom加载当前矩阵。
else if (mode == ZOOM) {
float newDist = spacing(event);
Log.d(TAG, "newDist=" + newDist);
if (newDist > 10f) {
matrix.set(savedMatrix);
zoomScale = newDist / oldDist;
Matrix temp = new Matrix();
temp.set(matrix);
temp.postScale(zoomScale, zoomScale, mid.x, mid.y);
mapZoom = getValue(temp, Matrix.MSCALE_X);
if (mapZoom < MAX_ZOOM && mapZoom > MIN_ZOOM) {
matrix.postScale(zoomScale, zoomScale, mid.x, mid.y);
savedMatrixZoom.set(matrix);
} else {
matrix.set(savedMatrixZoom);
}
}
}
希望有所帮助
答案 3 :(得分:1)
if(mapZoom > MAX_ZOOM && (newDist > oldDist) ) {
break;
} else if(mapZoom < MIN_Zoom && (newDist < oldDist) ){
break;
}
matrix.postScale(zoomScale, zoomScale, mid.x, mid.y);
savedMatrixZoom.set(matrix);
它工作正常,但我仍然松散,并且太敏感了。