Restringir panorámica y zoom

Hola Estoy intentando crear una aplicación donde puedas hacer zoom y desplazarte alrededor de un mapa del sitio del campus. Tengo que trabajar, pero se han encontrado con problemas de restricción de cuánto puede pan y zoom.I necesidad de ayuda para establecer panorámica y zoom límites.
Cualquier ayuda sería muy apreciada,

Gracias por adelantado
Aquí está el código.

package com.scott; import android.app.Activity; import android.graphics.Matrix; import android.graphics.PointF; import android.os.Bundle; import android.util.FloatMath; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnTouchListener; import android.widget.Button; import android.widget.ImageView; public class Touch extends Activity implements OnTouchListener,OnClickListener { private static final String TAG = "Touch"; Matrix matrix = new Matrix(); Matrix savedMatrix = new Matrix(); static final int NONE = 0; static final int DRAG = 1; static final int ZOOM = 2; int mode = NONE; PointF start = new PointF(); PointF mid = new PointF(); float oldDist = 1f; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.touch); ImageView view = (ImageView) findViewById(R.id.imageView); view.setOnTouchListener(this); Button buttonClose =(Button)findViewById(R.id.buttonClose); buttonClose.setOnClickListener(this); } @Override public boolean onTouch(View v, MotionEvent event) { ImageView view = (ImageView) v; dumpEvent(event); 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: 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); } } break; } view.setImageMatrix(matrix); return true; } private void dumpEvent(MotionEvent event) { String names[] = { "DOWN", "UP", "MOVE", "CANCEL", "OUTSIDE", "POINTER_DOWN", "POINTER_UP", "7?", "8?", "9?" }; StringBuilder sb = new StringBuilder(); int action = event.getAction(); int actionCode = action & MotionEvent.ACTION_MASK; sb.append("event ACTION_").append(names[actionCode]); if (actionCode == MotionEvent.ACTION_POINTER_DOWN || actionCode == MotionEvent.ACTION_POINTER_UP) { sb.append("(pid ").append( action >> MotionEvent.ACTION_POINTER_ID_SHIFT); sb.append(")"); } sb.append("["); for (int i = 0; i < event.getPointerCount(); i++) { sb.append("#").append(i); sb.append("(pid ").append(event.getPointerId(i)); sb.append(")=").append((int) event.getX(i)); sb.append(",").append((int) event.getY(i)); if (i + 1 < event.getPointerCount()) sb.append(";"); } sb.append("]"); Log.d(TAG, sb.toString()); } private float spacing(MotionEvent event) { float x = event.getX(0) - event.getX(1); float y = event.getY(0) - event.getY(1); return FloatMath.sqrt(x * x + y * y); } private void midPoint(PointF point, MotionEvent event) { float x = event.getX(0) + event.getX(1); float y = event.getY(0) + event.getY(1); point.set(x / 2, y / 2); } @Override public void onClick(View src) { switch(src.getId()){ case R.id.buttonClose: finish(); break; } } } 

Bueno, probablemente podría usar esto para ajustar con postTranslate, este método debe ser llamado después de que usted es propio postScale y postTranslate

 private void adjustPan(){ float[] matrixValues = new float[9]; matrix.getValues(matrixValues); float currentY = matrixValues[Matrix.MTRANS_Y]; float currentX = matrixValues[Matrix.MTRANS_X]; float currentScale = matrixValues[Matrix.MSCALE_X]; float currentHeight = bitmap.getHeight() * currentScale; float currentWidth = bitmap.getWidth() * currentScale; float newX = currentX; float newY = currentY; RectF drawingRect = new RectF(newX, newY, newX + currentWidth, newY + currentHeight); float diffUp = Math.min(displayRect.bottom - drawingRect.bottom, displayRect.top - drawingRect.top); float diffDown = Math.max(displayRect.bottom - drawingRect.bottom, displayRect.top - drawingRect.top); float diffLeft = Math.min(displayRect.left - drawingRect.left, displayRect.right - drawingRect.right); float diffRight = Math.max(displayRect.left - drawingRect.left, displayRect.right - drawingRect.right); float x = 0, y = 0; if (diffUp > 0) y += diffUp; if (diffDown < 0) y += diffDown; if (diffLeft > 0) x += diffLeft; if (diffRight < 0) x += diffRight; if(currentWidth < displayRect.width()) x = -currentX + (displayRect.width() - currentWidth) / 2; if(currentHeight<displayRect.height()) y = -currentY + (displayRect.height() - currentHeight) / 2; matrix.postTranslate(x, y); } 

Donde displayRect es un RectF que debe verse algo como esto:

  displayRect = new RectF(); displayRect.set(0, 0, displaywidth, displayheight); 

En cuanto a youre max min zoom que necesita algo como esto antes youre postScale:

  float[] f = new float[9]; matrix.getValues(f); float currentScale = f[Matrix.MSCALE_X]; if (scale * currentScale > maxZoom) scale = maxZoom / currentScale; else if (scale * currentScale < minZoom) scale = minZoom / currentScale; 

Donde minZoom es:

 minZoom = Math.min(displayRect.width()/bitmap.getWidth(), displayRect.height()/bitmap.getHeight()); 

Y maxZoom es lo que te gusta que sea.

Espero que esto fue algo útil.

(Original tomado de en alguna parte, no puede encontrar el acoplamiento ahora tho)

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.