Veuillez consulter chaque section ci-dessous pour une description de mon problème décrit de trois manières différentes. J'espère que cela aidera les gens à répondre.
Problème : Comment trouver une paire de coordonnées exprimées dans le canevas/espace utilisateur lorsque vous ne disposez que des coordonnées exprimées en termes d'image zoomée, compte tenu du point d'échelle et du facteur d'échelle d'origine ?
Problème en pratique :
J'essaie actuellement de reproduire la fonctionnalité de zoom utilisée dans des applications telles que la galerie / les cartes, lorsque vous pouvez pincer pour zoomer/dézoomer avec le zoom se déplaçant vers le point central du pincement.
En bas, je sauvegarde le point central du zoom (qui est en coordonnées X,Y basées sur l'écran actuel). Je fais ensuite en sorte que cette fonction agisse lorsqu'un geste de "mise à l'échelle" est détecté :
class ImageScaleGestureDetector extends SimpleOnScaleGestureListener {
@Override
public boolean onScale(ScaleGestureDetector detector) {
if(mScaleAllowed)
mCustomImageView.scale(detector.getScaleFactor(), mCenterX, mCenterY);
return true;
}
}
La fonction d'échelle du CustomImageView ressemble à ceci :
public boolean scale(float scaleFactor, float focusX, float focusY) {
mScaleFactor *= scaleFactor;
// Don't let the object get too small or too large.
mScaleFactor = Math.max(MINIMUM_SCALE_VALUE, Math.min(mScaleFactor, 5.0f));
mCenterScaleX = focusX;
mCenterScaleY = focusY;
invalidate();
return true;
}
Le dessin de l'image mise à l'échelle est réalisé en surchargeant la méthode onDraw qui met à l'échelle le canevas autour du centre et y dessine l'image.
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.save();
canvas.translate(mCenterScaleX, mCenterScaleY);
canvas.scale(mScaleFactor, mScaleFactor);
canvas.translate(-mCenterScaleX, -mCenterScaleY);
mIcon.draw(canvas);
canvas.restore();
}
Tout fonctionne bien lorsque l'on met à l'échelle à partir du facteur d'échelle 1, car les coordonnées initiales mCenterX et mCenterY sont basées sur l'écran du périphérique. 10, 10 sur l'appareil correspond à 10, 10 sur le canevas.
Cependant, si vous avez déjà effectué un zoom, la prochaine fois que vous cliquerez sur la position 10, 10, elle ne correspondra plus à 10, 10 dans le canevas en raison de la mise à l'échelle et de la transformation qui ont déjà été effectuées.
Problème d'abstraction :
L'image ci-dessous est un exemple d'une opération de zoom autour du point central A. Chaque case représente la position et la taille de la vue avec ce facteur d'échelle (1, 2, 3, 4, 5).
Dans l'exemple, si vous modifiez l'échelle d'un facteur 2 autour de A et que vous cliquez sur la position B, les valeurs X et Y indiquées pour B seront basées sur la position de l'écran et non sur la position relative à 0,0 du canevas initial.
Je dois trouver un moyen d'obtenir la position absolue de B.