Mi diseño contiene botones, vistas de texto, etc. ¿Es posible implementar zoom de pellizco en mi diseño?
zoom de pellizco de Android
código de bytes
Vinayak Bevinakatti
Respuesta actualizada
El código se puede encontrar aquí: doc-oficial
Respuesta desactualizada
Consulta los siguientes enlaces que te pueden ayudar
Los mejores ejemplos se proporcionan en los enlaces a continuación, que puede refactorizar para cumplir con sus requisitos.
-
Esta respuesta será inútil, una vez que los enlaces se caigan. Al menos cite las partes relevantes.
– Lukas Knuth
10 de diciembre de 2015 a las 8:29
-
FYI, esta respuesta está desactualizada. EscalaGestoDetector es la respuesta de Android para pinch-zoom, desde API 8. Vea la respuesta de Emanuel.
– El fabricante de herramientas Steve
20 oct 2016 a las 17:08
Para Android 2.2+ (api level8), puede usar ScaleGestureDetector.
necesitas un miembro:
private ScaleGestureDetector mScaleDetector;
en su constructor (o onCreate()) 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;
}
});
Anula 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, luego llame a invalidate() y use el factor de escala cuando dibuje en su onDraw(). De lo contrario, puede modificar directamente los tamaños de fuente o cosas por el estilo en onScale().
-
Información adicional en Documentos de Android – Arrastrar y escalar Tenga en cuenta especialmente el código de ejemplo que muestra cómo combinar la panorámica (desplazamiento) con la escala (zoom de pellizco).
– El fabricante de herramientas Steve
20 oct 2016 a las 17:12
Jorge
Implementé un pellizco de zoom para mi TextView
utilizando esta 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 se eligieron empíricamente (usando scale
variable para este propósito hizo mi TextView
comportarse un poco raro).
-
¿Puedo saber tu
MyGestureDetector()
clase– Praveenkumar
28 de enero de 2012 a las 11:12
-
@Renanlf Eso fue hace más de un año. Lo siento, ya ni siquiera codifico para Android. Tampoco tengo esas fuentes en ningún lado.
– Jorge
28 de agosto de 2012 a las 14:09
-
MyGestureDetector()
no es relevante aquí; debido a la declaraciónGestureDetector(GestureDetector.OnGestureListener listener)
concluimos que es un nombre inapropiado hijo deGestureDetector.OnGestureListener
. Y los eventos detectados por esa clase son irrelevantes para el zoom de pellizco.– 18446744073709551615
12 de diciembre de 2012 a las 13:25
-
switch (event.getAction() & MotionEvent.ACTION_MASK), en esta línea del código: ACTION_MASK cumple 255 (ff) entonces, ¿cuál es el punto de agregar Motion.ACTION_MASK? ¿Será suficiente cambiar (event.getAction()), si no, por qué? ¿Podría explicarlo?
– respuesta88
24 de marzo de 2014 a las 6:34
-
@folone ¿Podría ayudarme en esta pregunta? Esta pregunta es similar a lo que estoy enfrentando.
– usuario3265443
20/04/2014 a las 21:40
También existe este proyecto que hace el trabajo y funcionó perfectamente para mí:
https://github.com/chrisbanes/PhotoView
En nido de abeja, API nivel 11, es posible, podemos usar setScalaX y setScaleY con punto de pivote
aqui lo he explicado
Ampliar una vista por completo
Pellizcar Zoom para ver completamente
Jason Polites
Creé un proyecto para zoom de pellizco básico compatible con Android 2.1+
Disponible aquí
usuario2288580
Tengo una biblioteca de código abierto que hace esto muy bien. Es una biblioteca de cuatro gestos que viene con una configuración de zoom panorámica lista para usar. Lo puedes encontrar aquí: https://bitbucket.org/warwick/hacergestov3
O puede descargar la aplicación de demostración aquí: https://play.google.com/store/apps/details?id=com.WarwickWestonWright.HacerGestoV3Demo
Esta es una biblioteca de lienzo puro, por lo que se puede usar en prácticamente cualquier escenario. Espero que esto ayude.