2010-10-07 5 views
10

Je voulais créer une galerie avec des images. Les images dans la galerie doivent pouvoir être agrandies et recadrées. Je pouvais faire un zoom avant sur une image, mais je n'arrivais pas à régler les limites de zoom et à empêcher l'image de disparaître de l'écran. Je utilisé le code suivant pour agrandir une image: http://code.google.com/p/4chan-image-browser/source/browse/src/se/robertfoss/MultiTouch/TouchImageView.java?spec=svnd3e623ddeb6f9e97d9eba2c7aaa7c4567a3822b5&r=d3e623ddeb6f9e97d9eba2c7aaa7c4567a3822b5ImageView Pinch-zoom Limites d'échelle et limites de panoramique

Première approche: je TouchImageView de fournir des images à la galerie, cela me permet de zoom par pincement, mais ne peux pas faire défiler la galerie. C'est-à-dire que je ne peux pas faire la différence entre 'événement à un seul onglet' et 'onglet pour faire défiler l'événement'.

Deuxième approche: Utilisé ImageView pour fournir des images à la galerie, et si l'utilisateur clique sur l'un des éléments de la galerie afficher l'image sélectionnée dans TouchImageView, où l'utilisateur peut Pinch-Zoom une image. Mais cela m'empêche aussi de faire défiler la vue de la galerie. Et aussi comment définir les limites de zoom et les limites de panoramique sur l'image sélectionnée?

Répondre

3

Vous pouvez définir la limite de zoom en ajoutant ces lignes à ACTION_MOVE, le mode == ZOOM:

float[] f = new float[9]; 
matrix.getValues(f); 

float scaleX = f[Matrix.MSCALE_X]; 
float scaleY = f[Matrix.MSCALE_Y]; 
if (scaleX > MAX_SCALE || scaleY > MAX_SCALE) return true; 

De même, ajouter des lignes à ACTION_MOVE, le mode == DRAG qui prend en compte l'emplacement d'origine de l'image, la longueur traduite, puis comparez-les aux limites.

+0

Vous avez la bonne idée d'appeler 'matrix.getValues ​​(f);'. Cependant, la solution n'est pas de retourner vrai, car cela gèlera simplement l'écran. Si la valeur de mise à l'échelle est sur le point de dépasser MAX_SCALE, définissez plutôt la valeur d'échelle égale à MAX_SCALE. Vérifiez ma réponse ci-dessous pour une implémentation complète en utilisant cette méthode. –

2

J'ai fourni une réponse here qui ajoute le panoramique, le zoom et la détection des limites à ImageView.

20

Cela a résolu le problème de la limite de zoom pour moi. Une fois l'image agrandie/agrandie à la limite, elle s'arrête juste d'aller plus loin. C'est aussi lisse et il n'y a pas de retards. 0.7 et 2.0 sont les niveaux de zoom minimum et maximum.

.... 
} else if (mode == ZOOM) { 
    float[] f = new float[9]; 

    float newDist = spacing(event); 
    if (newDist > 10f) { 
      matrix.set(savedMatrix); 
      float tScale = newDist/dist; 
      matrix.postScale(tScale, tScale, mid.x, mid.y); 
    } 

    matrix.getValues(f); 
    float scaleX = f[Matrix.MSCALE_X]; 
    float scaleY = f[Matrix.MSCALE_Y]; 

    if(scaleX <= 0.7f) { 
      matrix.postScale((0.7f)/scaleX, (0.7f)/scaleY, mid.x, mid.y); 
    } else if(scaleX >= 2.5f) { 
      matrix.postScale((2.5f)/scaleX, (2.5f)/scaleY, mid.x, mid.y); 
    } 
} 
....   
+1

vous sauvez ma journée chérie! devrait être accepté réponse! –

3

ont essayé d'utiliser ce code ci-dessous et bien qu'il fonctionne, je trouve qu'il a été à l'origine de petites valeurs supplémentaires pour accumuler dans Trans X et Y Trans conduisant à l'image en mouvement lentement hors de l'écran.

if(scaleX <= 0.7f) 
      matrix.postScale((0.7f)/scaleX, (0.7f)/scaleY, mid.x, mid.y); 
    else if(scaleX >= 2.5f) 
      matrix.postScale((2.5f)/scaleX, (2.5f)/scaleY, mid.x, mid.y); 

Je fixe ce soit le stockage d'une matrice d'origine dans un flotteur [] (1,0,0,0,1,0,0,0,1) et la réinitialisation de la matrice de retour à chaque fois que ces valeurs scaleX < 1. Espérons que cela aide quelqu'un d'autre un jour :)

if(scaleX <= 1.0f) {         
    float[] originalmatrixvalues = new float[] {1f, 0f, 0f, 0f, 1f, 0f, 0f, 0f, 1f}; 
    matrix.setValues(originalmatrixvalues); 
} else if(scaleX >= 2.5f) { 
    matrix.postScale((2.5f)/scaleX, (2.5f)/scaleY, mid.x, mid.y); 
}