Android - Ziehen und Beschneiden von Problemen

8

Ich versuche mich an einer einfachen Fotomanipulation in einem Bild am oberen Rand von activity innerhalb eines ImageView , das im Durchschnitt eine 200dp height hat und mit der Breite seines Elternteils übereinstimmt.

Ich habe eine benutzerdefinierte onTouchListener -Klasse implementiert, die ein matrix erstellt und das Bild in ImageView

übersetzt

Ziehen :

%Vor%

Dies funktioniert perfekt, es zieht nur das Bild auf der y-Achse . Aber wenn der Benutzer freigibt, möchte ich, dass das Bild bis zu den Grenzen des sichtbaren Bereichs ImageView reduziert wird.

Zuschneiden :

%Vor%

Damit wird das Bild auf die richtige Größe zugeschnitten, aber nur vom oberen Rand des Bildausschnitts aus betrachtet nicht die sichtbaren Grenzen. Mit dem Aufruf der Bitmap -Klassenfunktion createBitmap(int x, int y, int width, int height) wäre meine einzige Annahme, dass view.getTop() es an der Spitze startet.

Also, meine Frage ist: Wie könnte ich den Unterschied zwischen dem oberen Rand der sichtbaren Ansichtsgrenzen und den Hintergrund- / Matrixgrenzen berechnen?

Hinweis: Das Bild zeigt ein Bild (blau) an, das sich am oberen Rand einer Aktivität befindet (die zyanfarbenen Bereiche sind nur die unsichtbaren Grenzen des ImageView , nicht die Aktivität)

Ich möchte betonen, dass ich keine Drittanbieterbibliotheken verwenden möchte, um dies zu erreichen.

Ich bin mehr als bereit, bei Bedarf zusätzlichen Code bereitzustellen.

Aktualisierung:

Vollständige onTouch Methode:

%Vor%     
Bradley Wilson 18.02.2017, 11:03
quelle

2 Antworten

0

Um die Root-Höhe der Aktivität zu berechnen, können wir

verwenden %Vor%

oder Sie können Anzeigewerte als

verwenden %Vor%

Oder fügen Sie einen globalen Listener hinzu

%Vor%

});

    
Prudhvi Raj Kumar 20.02.2017 11:31
quelle
0

Dem Code fehlt ein bestimmter Kontext, aber ich nehme an, dass wenn der Benutzer mit dem Ziehen beginnt, Sie neue savedMatrix und start point erstellen und sie jedes Mal aktualisieren, wenn onTouchListener aufgerufen wird oder ich verstehe überhaupt nicht, wie Ihr Code überhaupt funktioniert / p>

Wenn das der Fall ist, bedeutet das, dass Sie tatsächlich die Übersetzung haben, die Sie in savedMatrix brauchen. Warum also nicht von dort? Ich denke, was Sie brauchen, ist etwas wie

%Vor%

Ich habe es nicht überprüft und kenne die interne Struktur von Matrix nicht gut genug, daher müssen Sie möglicherweise das Vorzeichen von top invertieren.

Nebenbemerkung : Es ist nicht klar, warum Sie in matrix.postTranslate(v.getX(), event.getY() - start.y); v.getX() dort übergeben. Wahrscheinlich funktioniert es nur, weil v.getX() in Ihrem Szenario immer 0 ist.

    
SergGr 27.02.2017 01:27
quelle

Tags und Links