Vedere ciascuna sezione di seguito per una descrizione del problema descritta in tre modi diversi. Si spera che dovrebbe aiutare le persone a rispondere.Come trovare la posizione assoluta del clic durante lo zoom
Problema: Come si fa a trovare un paio di coordinata espressa in tela/userspace quando hai solo la coordinata espresso in termini di una foto ingrandita, dato il punto di scala & fattore di scala originale?
Problema nella pratica:
Attualmente sto cercando di replicare la funzionalità di zoom utilizzato in applicazioni come ad esempio la galleria/mappe, quando si può pizzicare per ingrandire/rimpicciolire con lo zoom si muove verso il punto mediano del pizzico.
In basso salvi il punto centrale dello zoom (che è in coordinate X, Y in base alla schermata corrente). Allora ho questa funzione atto quando viene rilevato un gesto "scale":
class ImageScaleGestureDetector extends SimpleOnScaleGestureListener {
@Override
public boolean onScale(ScaleGestureDetector detector) {
if(mScaleAllowed)
mCustomImageView.scale(detector.getScaleFactor(), mCenterX, mCenterY);
return true;
}
}
La funzione scala del CustomImageView questo aspetto:
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;
}
Il disegno dell'immagine scalata si ottiene sovrascrivendo i Metodo onDraw che ridimensiona la tela attorno al centro e disegna l'immagine su di essa.
@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();
}
Questo tutto funziona bene quando scalare da ScaleFactor 1, questo è perché l'iniziale mCenterX e mCenterY sono coordinate che si basano sullo schermo del dispositivo. 10, 10 sul dispositivo è 10, 10 sulla tela.
Tuttavia, dopo aver già eseguito lo zoom, la volta successiva che si fa clic sulla posizione 10, 10 non corrisponderà più a 10, 10 nell'area di disegno a causa del ridimensionamento della trasformazione & già eseguita.
Problema astraendo:
L'immagine seguente è un esempio di un'operazione di zoom attorno punto centrale A. Ogni casella rappresenta la posizione e le dimensioni della vista quando quel fattore di scala (1, 2, 3 , 4, 5).
Nell'esempio se scalato di un fattore di 2 attorno A allora si è fatto clic nella posizione B, X, Y, presentate come B sarebbe basato sulla posizione schermo - non sulla posizione relativa alla 0,0 della tela iniziale.
ho bisogno di trovare un modo di ottenere la posizione assoluta di B.
Il ridimensionamento della vista standard di Android + che imposta il punto di articolazione non eseguirà il lavoro? –
Non sai cosa intendi per "ridimensionamento e impostazione standard del punto di articolazione"? Se tu potessi ampliarlo, sarebbe fantastico. – Graeme
Quello che intendevo è usare 'setScaleX()' e 'setScaleY (()' per il ridimensionamento e 'setPivotX()' e 'setPivotY()' per impostare il centro del ridimensionamento.Sono tutti metodi di una Vista ma io leggi solo che la versione minSdk di questi metodi è 11 (Honeycomb), quindi forse questa informazione è inutile se ti rivolgi alle versioni precedenti. –