49 votes

Android pinch zoom

Ma mise en page contient des boutons, des zones de texte, etc. Est-il possible de mettre en œuvre le zoom par pincement dans ma mise en page ?

44voto

Vinayak B Points 16555

Réponse actualisée

Le code se trouve ici : official-doc

Réponse périmée

Consultez les liens suivants qui peuvent vous aider

Les meilleurs exemples sont fournis dans les liens ci-dessous, que vous pouvez remanier pour répondre à vos besoins.

  1. Mise en œuvre du geste de zoom par pincement

  2. Android-pinch

  3. GestureDetector.SimpleOnGestureListener

18 votes

Cette réponse n'aura aucune valeur, une fois que les liens auront disparu. Citez au moins les parties pertinentes.

4 votes

Pour info, cette réponse est périmée. ScaleGestureDetector est la réponse d'Android au zoom par pincement, depuis l'API 8. Voir Réponse d'Emanuel .

38voto

Emmanuel Touzery Points 1677

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 remplacez onTouchEvent :

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

Si vous dessinez votre vue à la main, dans le onScale(), vous stockez probablement le facteur d'échelle dans un membre, puis vous appelez invalidate() et utilisez le facteur d'échelle lors du dessin dans votre onDraw(). Sinon, vous pouvez modifier directement la taille des polices ou d'autres choses de ce genre dans la fonction onScale().

1 votes

Informations complémentaires dans Documentation Android - Déplacement et mise à l'échelle Notez en particulier les exemples de code montrant comment combiner le panoramique (défilement) avec la mise à l'échelle (zoom par pincement).

16voto

folone Points 4523

J'ai mis en place un zoom par pincement pour mon TextView en utilisant este tutoriel. 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 (à l'aide de scale variable pour cette fin a fait de mon TextView comportement un peu bizarre).

5 votes

Puis-je connaître votre MyGestureDetector() classe

1 votes

@Renanlf C'était il y a plus d'un an. Désolé, je ne code même plus pour Android. Et je n'ai plus ces sources nulle part.

2 votes

MyGestureDetector() n'est pas pertinente ici ; en raison de la déclaration GestureDetector(GestureDetector.OnGestureListener listener) nous concluons qu'il s'agit d'un enfant mal nommé de GestureDetector.OnGestureListener . Et les événements détectés par cette classe ne sont pas pertinents pour le pinch zooming.

5voto

BoD Points 3490

Il existe également ce projet qui fait l'affaire et qui a parfaitement fonctionné pour moi : https://github.com/chrisbanes/PhotoView

4voto

Labeeb P Points 12645

Dans Android Honeycomb(API Level 11), c'est possible, on peut utiliser setScaleX y setScaleY avec point de pivot
Je l'ai expliqué ici

  1. Zoomer complètement une vue
  2. Pincez le zoom pour une vue complète

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X