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).

So finden Sie die absolute Position des Klicks beim Vergrößern

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

Schreibe einen Kommentar