Android Pinch zoom
-
28-10-2019 - |
Pregunta
Mi diseño contiene botones, vistas de text, etc. ¿Es posible implementar el zoom de pellizco en mi diseño?
Solución
** Respuesta anticuada **
Consulte los siguientes enlaces que pueden ayudarlo
Se proporcionan los mejores ejemplos en los enlaces a continuación, que puede refactorizar para cumplir con sus requisitos.
Otros consejos
Para Android 2.2+ (API Level8), puede usar ScaleGestEndetector.
necesitas un miembro:
private ScaleGestureDetector mScaleDetector;
En su constructor (o onCreate ()) usted 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;
}
});
Anulas a OnTouchEvent:
@Override
public boolean onTouchEvent(MotionEvent event) {
mScaleDetector.onTouchEvent(event);
return true;
}
Si dibuja su vista a mano, en Onscale () probablemente almacene el factor de escala en un miembro, entonces llame a Invalidate () y use el factor de escala al dibujar en su OnDraw (). De lo contrario, puede modificar directamente los tamaños de fuentes o cosas así en Onscale ().
Implementé un zoom de pellizco para mi TextView
, usando este tutorial. El código resultante es este:
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;
}
Las constantes mágicas 1.1 y 0.95 fueron elegidas empíricamente (usando scale
variable para este propósito hizo mi TextView
comportarse un poco raro).
También está este proyecto que hace el trabajo y funcionó perfectamente para mí:https://github.com/chrisbanes/photoview
En Honeycomb, API Nivel 11, es posible, podemos usar SetScalax y SetScaley con Pivot Point
Lo he explicado aquí
Zoom de una vista por completo
Pinch zoom para ver completamente
He creado un proyecto para el zoom de pellizco básico que admite Android 2.1+
Disponible aquí
Tengo una biblioteca de código abierto que lo hace muy bien. Es una biblioteca de cuatro gestos que viene con una configuración de zoom de sartén lista de usar. Lo puedes encontrar aquí: https://bitbucket.org/warwick/hacergestov3O puede descargar la aplicación de demostración aquí: https://play.google.com/store/apps/details?id=com.warwickwestonwright.hacergestov3demoEsta es una biblioteca de lienzo puro, por lo que se puede usar en cualquier escenario bonito. Espero que esto ayude.