2011-03-21 23 views

Respuesta

43

Comprobar los siguientes enlaces que pueden ayudarle a

mejores ejemplos se proporcionan en los links siguientes, que se puede refactorizar para satisfacer sus necesidades.

  1. implementing-the-pinch-zoom-gestur

  2. Android-pinch

  3. GestureDetector.SimpleOnGestureListener

+11

esta pregunta no tendrá ningún valor, una vez que los enlaces bajan. Al menos cita las partes relevantes. –

+2

FYI, esta respuesta no está actualizada. [ScaleGestureDetector] (https://developer.android.com/reference/android/view/ScaleGestureDetector.html) es la respuesta de Android para el zoom de pellizco, desde API 8.Ver [respuesta de Emanuel] (http://stackoverflow.com/a/11722858/199364). – ToolmakerSteve

14

que tiene implantado un zoom pellizco para mi TextView, utilizando this tutorial. El código resultante es la siguiente:

private GestureDetector gestureDetector; 
private View.OnTouchListener gestureListener; 

y en onCreate():

// Zoom handlers 
    gestureDetector = new GestureDetector(new MyGestureDetector()); 
    gestureListener = new View.OnTouchListener() { 

     // We can be in one of these 2 states 
     static final int NONE = 0; 
     static final int ZOOM = 1; 
     int mode = NONE; 

     static final int MIN_FONT_SIZE = 10; 
     static final int MAX_FONT_SIZE = 50; 

     float oldDist = 1f; 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      TextView textView = (TextView) findViewById(R.id.text); 

      switch (event.getAction() & MotionEvent.ACTION_MASK) { 
       case MotionEvent.ACTION_POINTER_DOWN: 
        oldDist = spacing(event); 
        Log.d(TAG, "oldDist=" + oldDist); 
        if (oldDist > 10f) { 
         mode = ZOOM; 
         Log.d(TAG, "mode=ZOOM"); 
        } 
        break; 
       case MotionEvent.ACTION_POINTER_UP: 
        mode = NONE; 
        break; 
       case MotionEvent.ACTION_MOVE: 
        if (mode == ZOOM) { 
         float newDist = spacing(event); 
         // If you want to tweak font scaling, this is the place to go. 
         if (newDist > 10f) { 
          float scale = newDist/oldDist; 

          if (scale > 1) { 
           scale = 1.1f; 
          } else if (scale < 1) { 
           scale = 0.95f; 
          } 

          float currentSize = textView.getTextSize() * scale; 
          if ((currentSize < MAX_FONT_SIZE && currentSize > MIN_FONT_SIZE) 
            ||(currentSize >= MAX_FONT_SIZE && scale < 1) 
            || (currentSize <= MIN_FONT_SIZE && scale > 1)) { 
           textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, currentSize); 
          } 
         } 
        } 
        break; 
       } 
      return false; 
     } 

magia constantes de 1.1 y 0.95 fueron elegidos empíricamente (usando scale variable para este fin hizo que mi tipo TextView se comportan raro).

+5

¿Puedo saber su 'MyGestureDetector()' clase – Praveenkumar

+0

MyGestureDetector() por favor! – renanlf

+1

@Renanlf Eso fue hace más de un año. Lo siento, ni siquiera codigo para android nunca más. Tampoco tengo esas fuentes en ningún lado. – folone

1

He creado un proyecto para pellizcos e básica zoom que es compatible con Android 2.1+

Disponible here

35

para Android 2.2 + (Level8 API), que ca n use ScaleGestureDetector.

se necesita un miembro de:

private ScaleGestureDetector mScaleDetector; 

en su constructor (o onCreate()) se agrega:

mScaleDetector = new ScaleGestureDetector(context, new OnScaleGestureListener() { 
    @Override 
    public void onScaleEnd(ScaleGestureDetector detector) { 
    } 
    @Override 
    public boolean onScaleBegin(ScaleGestureDetector detector) { 
     return true; 
    } 
    @Override 
    public boolean onScale(ScaleGestureDetector detector) { 
     Log.d(LOG_KEY, "zoom ongoing, scale: " + detector.getScaleFactor()); 
     return false; 
    } 
}); 

Puede alterar temporalmente onTouchEvent:

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    mScaleDetector.onTouchEvent(event); 
    return true; 
} 

Si dibuja su Ver a mano, en onScale() probablemente almacene el factor de escala en un miembro, luego invoque invalidate() y use la escala factor al dibujar en su onDraw(). De lo contrario, puede modificar directamente el tamaño de las fuentes o cosas así en onScale().

+1

Información adicional en [Android docs - Arrastrando y Escalando] (https://developer.android. com/training/gestures/scale.html) Observe especialmente el código de ejemplo que muestra cómo combinar la panorámica (desplazamiento) con la escala (zoom de pellizco). – ToolmakerSteve

Cuestiones relacionadas