Ma mise en page contient des boutons, des vues de texte, etc. Est-il possible d'appliquer un zoom par pincement à ma mise en page?
Consultez les liens suivants qui peuvent vous aider
Les meilleurs exemples sont fournis dans les liens ci-dessous, que vous pouvez modifier pour répondre à vos besoins.
Pour Android 2.2+ (api level8), vous pouvez utiliser ScaleGestureDetector.
vous avez besoin d'un membre:
private ScaleGestureDetector mScaleDetector;
dans votre constructeur (ou onCreate ()) vous ajoutez:
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;
}
});
Vous substituez onTouchEvent:
@Override
public boolean onTouchEvent(MotionEvent event) {
mScaleDetector.onTouchEvent(event);
return true;
}
Si vous dessinez votre vue à la main, dans onScale (), vous stockez probablement le facteur d'échelle dans un membre, appelez invalidate () et utilisez-le pour dessiner dans votre onDraw () . Sinon, vous pouvez modifier tailles de police ou des choses comme ça dans onScale ().
J'ai implémenté un zoom de pincement pour ma TextView
, en utilisant this tutorial. Le code résultant est le suivant:
private GestureDetector gestureDetector;
private View.OnTouchListener gestureListener;
et dans 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;
}
Les constantes magiques 1.1 et 0.95 ont été choisies de manière empirique (utiliser la variable scale
à cette fin a rendu ma TextView
se comporter un peu bizarre).
Il y a aussi ce projet qui fait le travail et a fonctionné parfaitement pour moi: https://github.com/chrisbanes/PhotoView
En nid d’abeille, API niveau 11, c’est possible.
Je l'ai expliqué ici
Zoomer complètement une vue
Pincez Zoom pour la voir complètement
J'ai créé un projet de base pour pincer-zoom prenant en charge Android 2.1+
Disponible ici
J'ai une bibliothèque open source qui le fait très bien. Il s'agit d'une bibliothèque de quatre gestes dotée d'un paramètre de zoom panoramique prêt à l'emploi. Vous pouvez le trouver ici: https://bitbucket.org/warwick/hacergestov3 Vous pouvez également télécharger l'application de démonstration ici: https://play.google.com/store/apps/details ? id = com.WarwickWestonWright.HacerGestoV3Demo Il s’agit d’une pure bibliothèque de canevas pouvant être utilisée dans n'importe quel scénario . J'espère que cela vous aidera.