web-dev-qa-db-fra.com

android pincer le zoom

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?

47
Bytecode

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.

  1. mise en oeuvre du pincement-zoom-gestur

  2. Android-pincer

  3. GestureDetector.SimpleOnGestureListener

44

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 ().

37
Emmanuel Touzery

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).

15
folone

Il y a aussi ce projet qui fait le travail et a fonctionné parfaitement pour moi: https://github.com/chrisbanes/PhotoView

5
BoD

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

4
Labeeb Panampullan

J'ai créé un projet de base pour pincer-zoom prenant en charge Android 2.1+

Disponible ici

1
Jason Polites

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.

0
user2288580