So finden Sie die absolute Position des Klicks beim Vergrößern
Finden Sie jeden Abschnitt weiter unten für eine Beschreibung meines Problems beschrieben, die in drei getrennte Wege. Hoffentlich sollte den Menschen helfen, zu beantworten.
Problem: Wie finden Sie ein paar von Koordinaten, ausgedrückt in canvas - /userspace, wenn man nur die Koordinate ausgedrückt in einem gezoomten Bild, da die ursprüngliche Skala point & scale Faktor?
Problem in der Praxis:
Ich bin derzeit versuchen zu replizieren, die zoom-Funktionen in apps wie die Galerie /maps, wenn Sie können kneifen, um zu vergrößern/verkleinern mit der zoom-Richtung ist der Mittelpunkt der Prise.
Auf sich ich speichern den Mittelpunkt der zoom (das ist in X -, Y-Koordinaten basierend auf dem aktuellen Bild). Dann habe ich diese Funktion handeln, wenn eine "Waage" - Geste erkannt wird:
class ImageScaleGestureDetector extends SimpleOnScaleGestureListener {
@Override
public boolean onScale(ScaleGestureDetector detector) {
if(mScaleAllowed)
mCustomImageView.scale(detector.getScaleFactor(), mCenterX, mCenterY);
return true;
}
}
Die skalieren-Funktion des CustomImageView wie folgt Aussehen:
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;
}
Die Zeichnung des skalierten Bild erreicht man durch überschreiben der onDraw-Methode, die Skalen der Leinwand, um das Zentrum und zeichnen das Bild.
@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();
}
Das ganze funktioniert Prima, wenn die Skalierung von ScaleFactor 1, ist dies, weil die erste mCenterX und mCenterY sind Koordinaten, die auf dem Bildschirm des Geräts. 10, 10 in das Gerät 10, 10 auf die Leinwand.
Nachdem Sie bereits gezoomt, aber dann das nächste mal, wenn Sie klicken Sie auf position 10, 10, es wird nicht mehr entsprechen, 10, 10 im canvas-Bereich wegen der Skalierung & Transformation, die bereits durchgeführt werden.
Problem in der Abstraktion:
Dem Bild unten ist ein Beispiel für ein zoom-Betrieb rund um das centre point A. Jede box repräsentiert die position und Größe des views als Skalierungsfaktor (1, 2, 3, 4, 5).
In dem Beispiel, wenn Sie skaliert mit dem Faktor 2, um Einen dann klickte man auf position B, X, Y berichtet als B wäre auf der Grundlage der position auf dem Bildschirm - nicht auf die position relativ zu der position 0,0 des ursprünglichen Leinwand.
Muss ich einen Weg finden Sie immer die absolute position B.
InformationsquelleAutor der Frage Graeme | 2011-11-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
So, nach Neuzeichnen von dem problem hab ich die Lösung gefunden, die ich suchte. Es ist schon ein paar iteration ist aber hier, wie ich arbeitete es aus:
Wissen Sie die Werte für
Bx
undBy
weil Sie immer konstant, egal was der scale Faktor (Sie wissen, dass dieser Wert in Leinwand-space und user-space).Wissen Sie
Ax
&Ay
im user-space, so finden Sie die Entfernung zwischenAx
zuBx
undAy
zuBy
. Diese Messung wird im user-space, to wandeln Sie es in ein canvas-Platz Messen einfach dividiert durch den Skalierungsfaktor. (Mal Umgerechnet auf die Leinwand-Raum, können Sie sehen, diese Linien in rot, orange und gelb).Als Punkt
B
ist konstant, der Abstand zwischen ihm und den Rändern konstant sind (Diese sind dargestellt durch Blaue Linien). Dieser Wert entspricht im user-space und canvas-Raum.Kennen Sie die Breite der Leinwand in der Leinwand-den Raum, so dass durch Subtraktion dieser beiden Leinwand-Weltraum-Messungen (
Ax
zuBx
undBx
zuEdge
) von der gesamten Breite, die Sie mit Links sind die Koordinaten für den Punkt A, in Leinwand-Raum:Den obigen code und Bild beschreiben, wenn Sie klicken oben Links auf das ursprüngliche Zentrum. Ich verwendet die gleiche Logik zu finden, egal in welchem Quadranten es liegt in und umgestaltet werden, um die folgenden:
InformationsquelleAutor der Antwort Graeme
Hier ist meine Lösung basiert auf Graeme ' s Antwort:
die Parameter Ax und Ay sind die Punkte, die user touch per onTouch(), ich im Besitz meiner statische matrix-Instanz in MatrixContext Klasse zu halten, die bisherigen skaliert/übersetzten Werte.
InformationsquelleAutor der Antwort Keanu Pang
Wirklich Leid, das ist eine kurze Antwort in Eile. Aber habe ich das vor kurzem auch - ich fand http://code.google.com/p/android-multitouch-controller/ zu tun, was Sie wollen (ich denke - ich hatte zu überfliegen dein post gelesen). Hoffe, das hilft. Ich werde eine richtige Aussehen heute Abend, wenn diese nicht helfen, und sehen, ob ich noch helfen kann.
InformationsquelleAutor der Antwort Martyn