2013-02-21 3 views
2

J'utilise SurfaceHolder et ScaleGestureDetector pour que la mise à l'échelle fonctionne. Entre le SurfaceHolder.lockCanvas() et le surfaceHolder.unLockCanvasAndPost(canvas), j'effectue une opération de mise à l'échelle.Mise à l'échelle du canevas tout en conservant le centre

canvas.scale(mScaleFactor, mScaleFactor, scalePointX,scalePointY); 

Dans le onScaleMethod, j'effectue les suivantes

public boolean onScale(ScaleGestureDetector detector) { 

      mScaleFactor *= detector.getScaleFactor(); 
      // Don't let the object get too small or too large. 
      mScaleFactor = Math.max(1.0f, Math.min(mScaleFactor, 35f)); 
      scalePointX=(detector.getFocusX()); 
      scalePointY=(detector.getFocusY()); 
      Log.i("Zoom",mScaleFactor+""); 
     return true; 
} 

Mais la toile n'échelle pas au centre entre les deux fingers.How dois-je régler les valeurs de scalePointX et scalePointY pour que le code travail.

Merci

Répondre

0

Je vois cela est tout à fait une vieille question, mais nous allons avoir au moins il a répondu. Le problème dans votre code est que les coordonnées de la mise au point correspondent à la coordonnée du pixel sur laquelle vous avez cliqué. C'est celui que vous obtiendriez normalement d'un événement de mouvement. En d'autres termes, ce n'est pas la coordonnée sur votre image (ou ce que vous mettez à l'échelle).

Voici ma solution:

Je ne me point d'échelle mais traduis respectivement toute la toile. Je tiens les coordonnées de traduction en unités à l'échelle 1.0 (pas d'échelle). Si vous voulez utiliser le centre d'échelle à la place, vous devrez seulement changer les coordonnées de départ au centre au lieu du coin supérieur gauche comme je le fais. Voici une partie de ma fonction onScale (mettre à jour également facteur d'échelle et d'ajouter des restrictions supplémentaires, mais cela est la seule partie qui a à voir avec le maintien du centre):

float sf = mScaleGestureDetector.getScaleFactor(); 
float x = (mScaleGestureDetector.getFocusX()/mScaleFactor) * (1 - sf); 
float y = (mScaleGestureDetector.getFocusY()/mScaleFactor) * (1 - sf); 

mTranslateX += x; 
mTranslateY += y; 

Ce que je fais essentiellement est de convertir les coordonnées du point de mise au point à des unités non mises à l'échelle (la partie de division) et ensuite calculer combien de chaque coordonnée est sorti de l'écran (ou dans l'écran si c'est négatif).

Questions connexes