Versetzen einer Bitmap nur in vertikaler Richtung

8

Ich möchte eine Bitmap verdrehen (korrigieren Sie mich, wenn das nicht das richtige Wort ist), so dass es scheint, Tiefe zu haben. Eine gute Möglichkeit, sich vorzustellen, worum ich gebeten habe, ist, wie die Credits von Star Wars geneigt sind, um Tiefe zu zeigen.

Ich habe Folgendes versucht:

%Vor%

und

%Vor%

Aber ich hatte nicht viel Erfolg. Die obigen Methoden scheinen die Bitmap immer in ein Parallelogramm zu verwandeln. Gibt es eine Möglichkeit, die Bitmap stattdessen in ein Trapez umzuwandeln?

Hier ist ein Codeschnipsel, den ich aus den Beispielen genommen habe, auf die mich Romain hingewiesen hat.

%Vor%     
mdupls 18.03.2011, 15:28
quelle

3 Antworten

6

Sie können den gewünschten Effekt nicht mit skew () erzielen. Sie können jedoch ein Kameraobjekt und 3D-Rotationen verwenden, um diesen Effekt zu erzielen. Die Kamera erstellt eine Matrix für Sie, die Sie dann auf dem Canvas anwenden können. Beachten Sie, dass das Ergebnis nicht perspektivisch richtig, aber gut genug für Ihren Zweck ist. So werden zum Beispiel 3D-Rotationen in Honeycombs Launcher (und vielen anderen Apps) gemacht.

    
Romain Guy 18.03.2011, 17:11
quelle
12

Ich habe heute viel Zeit damit verbracht (das gleiche Problem zu lösen) und habe den folgenden Code erstellt.

Wichtig zu beachten ist, dass Sie preTranslate () und postTranslate () in die Mitte (oder anderswo) Ihres Canvas-Bereichs setzen müssen. Es scheint, dass es den Mittelpunkt des Bildes verwendet, um die Transformation von statt der oberen linken Ecke (x = 0, y = 0) standardmäßig anzuwenden. Das ist der Grund, warum Sie ein Parallelogramm anstelle von dem erhalten würden, was Sie erwarten würden, ein Trapez (Danke, dass Sie mir die Namen dieser Buchstaben beigebracht haben).

Die andere wichtige Sache, die ich aufgegriffen habe, ist die Funktion Speichern / Wiederherstellen auf der Leinwand / Kamera. Wenn Sie die Rotate-Funktionen nacheinander dreimal hintereinander aufrufen, ohne jedes Mal den Status wiederherzustellen, würden Sie Ihr Objekt bei jedem Zeichnen um und um rotieren. Das mag das sein, was du willst, aber in meinem Fall habe ich es nicht getan. Gleiches gilt für den Canvas-Bereich, da Sie im Grunde die Matrix vom Camera-Objekt auf den Canvas-Bereich anwenden und es muss zurückgesetzt werden, sonst tritt das Gleiche auf.

Hoffe das hilft jemandem, das ist für Anfänger nicht gut dokumentiert. Tipp an alle, die dies lesen, sehen Sie sich den APIDemos-Ordner in den SDK-Beispielen an. Es gibt eine Rotate3dAnimation.java Datei, die das ebenfalls demonstriert.

%Vor%     
CatalystNZ 19.05.2011 04:38
quelle
1

Ich glaube nicht, dass der "Star Wars-Effekt" eine affine Transformation ist, was ich denke sind die einzigen Operationen, die von Matrix unterstützt werden.

    
Matthew Willis 18.03.2011 15:44
quelle

Tags und Links