Vergrößern Sie Ihre eigene Leinwand von Inhalten

Bei einigen Gemälden müssen Sie alle Details genauer betrachten. Stellen Sie sich statt eines Gemäldes eine leere Leinwand vor, die mit Bildern, Text und dynamischen Beschreibungen gefüllt werden kann.

Wir haben diesen großartigen Autor dank FlashGameLicense.com, dem Ort zum Kaufen und Verkaufen von Flash-Spielen, gefunden.

Hinweis: Dieses Tutorial hat nichts mit dem HTML5-Canvas-Element zu tun!


Die Demo ist eine Viewer-Anwendung, die ihre Daten aus XML lädt. Der Inhalt wird auf der "Leinwand" platziert und der Benutzer kann in die Leinwand zoomen oder auf eines der Bilder klicken, um es auf dem Bildschirm zu zentrieren. Einstellungen wie Seitengröße, Hintergrundfarbe / Textur und andere Einstellungen werden dynamisch geladen. Als Bonus kann der Benutzer mehrere Seiten erstellen.

In diesem Lernprogramm werden die grundlegenden Konzepte zum Erstellen einer Anwendung wie dieser beschrieben. Es ist ratsam, den Quellcode beim Lesen des Tutorials bei sich zu haben, da nicht jeder Teil erklärt wird. Quellcode steht für die Verwendung mit FlashDevelop oder Flash CS3 Professional und höher zur Verfügung.


Hinweis: Die Anwendung lokal öffnen

Bitte beachten Sie, dass Sie die Anwendung vor dem Öffnen von der Festplatte zur Liste der "vertrauenswürdigen Speicherorte" hinzufügen müssen, die in der unten gezeigten Registerkarte Globale Sicherheitseinstellungen angegeben ist. Andernfalls wird kein Zugriff auf die Bilder von Ihrer Festplatte gewährt. Dies ist beim Hochladen auf eine Website nicht erforderlich, solange sich die Bilder auf demselben Webserver befinden.


Schritt 1: Einrichten der XML-Datei

Falls Sie mit XML nicht vertraut sind, lesen Sie AS3 101: XML von Dru Kepple. Unten sind die XML-Daten dargestellt, die einer Seite entsprechen, die mit einem Bild und einem Textfeld gefüllt ist. Die hier angegebenen Einstellungen gelten für alle Seiten. Wie Sie sehen, ist das Erstellen mehrerer Seiten und das Hinzufügen von Inhalten leicht. Zu Bildern können Sie einen Titel und eine Beschreibung hinzufügen, die angezeigt werden, wenn Sie mit der Maus darüber fahren. Mehrzeiliger Text wird hinzugefügt und Größe und Stil können angepasst werden. Für jedes Textfeld wird eine benutzerdefinierte Schriftart in der .fla-Datei verwendet.

    0x000000 … / Bilder / 580 380 2000 1300 0xEEDEC0 0xC1C59C 10 10     Hallo und willkommen bei der Demonstration der Leinwandanwendung. Als Thema dient hier mein Urlaub in Kopenhagen. anno 2010. Fühlen Sie sich frei, die Texte zu lesen und die Kultur zu schnuppern.  23 470 50   Kirche und See Die schöne Umgebung in Kastelskirken. Church_And_Lake.jpg 1 750 500   

Schritt 2: Die Document- und Canvas-Klasse

Verwenden Sie den folgenden Code, um unsere Anwendung einzurichten. Sie wird von FlashDevelop mit der Vorlage "AS3-Projekt" fast vollständig generiert. Main ist die Dokumentenklasse - die Klasse, die beim Start von Flash zuerst geladen wurde - und innen Segeltuch Wir bauen unsere Anwendung.

 public class Main erweitert Sprite public function Main (): void if (stage) init (); else addEventListener (Event.ADDED_TO_STAGE, init);  private Funktion init (e: Event = null): void removeEventListener (Event.ADDED_TO_STAGE, init); // Einstiegspunkt var canvas: Canvas = new Canvas (this); 

Und eine vereinfachte Version von Canvas. Beachten Sie, dass wir einen Anzeigeobjektcontainer als Parameter verwenden, um dieses zusätzliche Steuerelement zum Hinzufügen / Entfernen des Canvas-Bereichs hinzuzufügen.

 Öffentliche Klasse Canvas erweitert Sprite öffentliche Funktion Canvas (Container: DisplayObjectContainer) // Parameter lokal speichern this.container = container; // Zu container hinzufügen container.addChild (this); 

Schritt 3: Verwenden des Bulk Loader zum Laden von Assets

In dieser Anwendung verwenden wir das so genannte BulkLoader: eine AS3-Bibliothek, die das Laden und Verwalten komplexer Ladeanforderungen einfacher und schneller machen soll. Beim ersten Laden verwenden wir die XML-Datei und ein Hintergrundbild. Der folgende Code zeigt, wie der gestartet wird BulkLoader und fügen Sie der Ladewarteschlange zwei Elemente hinzu. Das Komplett Funktion wird aufgerufen, wenn alle Artikel geladen sind.

 // Init bulk loader loader = neuer BulkLoader ("Canvas"); loader.add ("… /background.jpg", id: "background"); loader.add ("… /settings.xml", id: "xmldata"); // Loader events loader.addEventListener (BulkLoader.COMPLETE, Complete, false, 0, true); loader.addEventListener (BulkLoader.ERROR, HandleError, false, 0, true); // Start loader loader.start ();

Schritt 4: Speichern der geladenen Assets

Wir speichern die geladenen Assets innerhalb der Klasse zur späteren Verwendung. Das BulkLoader bietet eine einfache Möglichkeit, die benötigten Artikel zu packen. Rufen Sie einfach die dem Objekttyp entsprechende Funktion auf und verwenden Sie die ID-Zeichenfolge des Objekts. Statische Variablen werden verwendet, um die XML-Daten global verfügbar zu machen (z. B. Zugriff auf eine statische Variable mit Canvas.viewerWidth). Das Pfad Variable gibt an, wo sich die extern geladenen Bilder befinden sollen. Bilder können aus Sicherheitsgründen nur vom eigenen Webserver geladen werden.

 // Hintergrundbild holen g_background = (loader.getBitmap ("background")). BitmapData; // XML-Daten abrufen xmldata = loader.getXML ("xmldata"); // Statische Variablen für einfachen Zugriff festlegen viewerWidth = int (xmldata.settings.viewer_width); viewerHeight = int (xmldata.settings.viewer_height); viewerBgColor = uint (xmldata.settings.viewer_bg_color); path = String (xmldata.settings.image_path); customFont = new customFontClass (); contentWidth = int (xmldata.settings.content_width); contentHeight = int (xmldata.settings.content_height); // kompletten Listener entfernen loader.removeEventListener (BulkLoader.COMPLETE, Complete); // Alle im Loader gespeicherten Datenreferenzen entfernen loader.clear (); // Loader aus dem Speicher entfernen loader = null; // Viewer einrichten InitialiseViewer ();

Schritt 5: Vorstellung der virtuellen Kamera

Wie Sie vielleicht schon erraten haben, verwendet die Anwendung eine virtuelle Kamera, um einen Teil der Leinwand zu extrahieren und dem Benutzer anzuzeigen. Die Kamera wendet Skalierung und Übersetzung auf einen Anzeigeobjektcontainer an, sodass nur der Bereich unter der Kamera auf dem Bildschirm angezeigt wird. Die folgende Demonstration gibt Ihnen eine bessere Vorstellung davon, wie es funktioniert.

Der Quellcode dieser Demonstration ist auch im Archiv enthalten. Lassen Sie uns dieses Beispiel erklären, indem Sie mit dem Konfigurieren der Einstellungen beginnen. Wir möchten, dass der Betrachterbereich 305 x 230 ist, und der Inhaltsbereich, also die Abmessungen des Blumenbilds, sollte versuchen, das Seitenverhältnis des Betrachterbereichs beizubehalten, damit er sich nicht zu stark verformt. Unsere Blume ist 1000 x 750, was nahe genug ist. Um die gesamte Blume im Betrachterbereich anzuzeigen, muss die Kamera die gleiche Größe haben wie die Blume (1000 x 750).

Der folgende Code legt die Bemaßungseinstellungen fest. In diesem Beispiel sind sie fest codiert, ansonsten werden sie jedoch aus XML übernommen.

 // Einstellungen viewerWidth = 305; Betrachterhöhe = 230; contentWidth = 1000; contentHeight = 750;

Als Nächstes erstellen wir einen Viewer-Container. Die Option scrollRect wird verwendet, um alles außerhalb eines angegebenen Rechtecks ​​abzuschneiden. Dies ist sehr nützlich, da beim Vergrößern nur ein Teil der Leinwand angezeigt werden muss. Dies ist eine auffälligere Lösung, als beispielsweise die Anwendung mit einem schwarzen Rand zu versehen.

 // Viewer-Container viewerContainer = new Sprite (); viewerContainer.scrollRect = new Rectangle (0,0, viewerWidth, viewerHeight); addChild (viewerContainer);

Zum Viewer-Container fügen wir einen weiteren hinzu Sprite namens viewerScroller. Die Funktion von viewerScroller ist einfach als Container für alles zu dienen, das als Inhalt für die Kamera dienen muss. Es erleichtert das Hinzufügen mehrerer Elemente zum Inhaltsbereich.

 // Seiten-Scroller var viewerScroller: Sprite = new Sprite (); viewerContainer.addChild (viewerScroller);

Fügen Sie dem Inhalt Inhalt hinzu viewerScroller. In diesem Fall das Blumenbild.

 // Inhalt Inhalt = new Sprite (); viewerScroller.addChild (Inhalt); var bmp: Bitmap = neues Bild (); content.addChild (bmp);

Nun füge das hinzu Kamera Klasse. Obwohl wir das noch machen müssen Kamera Klasse, nimmt der Konstruktor die Viewer-Dimensionen als Parameter und die Funktion an Anvisieren hat den Inhalt Sprite als Parameter. Wir positionieren die Kamera in der Mitte des Inhalts und geben Sie ein erstes Update.

 // Virtuelle Kamera hinzufügen cam = new Camera (viewerWidth, viewerHeight); cam.SetTarget (viewerScroller); cam.x = contentWidth / 2; cam.y = contentHeight / 2; cam.Update ();

Mit all diesem Code können wir die Kamera rendern und bearbeiten. In einem Event.ENTER_FRAME Schleife könnte man laufen cam.Update () um die Kameraansicht zu aktualisieren. Es ist jedoch effizienter, nur bei einer Änderung zu aktualisieren. Durch Austausch cam.x und cam.y Sie können die Kamera bewegen und ändern cam.scaleX und cam.scaleY Sie können die Skala ändern. Genau das machen die Tastaturtasten im Beispiel.


Schritt 6: Kameraklasse A näherer Blick

Hier werfen wir einen Blick auf das Innere des Kamera. In der Konstruktorfunktion fügen wir einige Grafiken hinzu, die zur Manipulation des Maßstabs der Kamera benötigt werden. Wir speichern die Viewer-Inhaltsdimensionen auch lokal in der Klasse.

 öffentliche Funktion Kamera (Breite: int, Höhe: int, initialZoom: Number = 1) // Sprite verwendet, um der Kamera Breite und Höhe zu geben. g = neue Form (); g.graphics.drawRect (0, 0, 10, 10); g.graphics.endFill (); addChild (g); // Setze die Dimensionen des Viewer-Rechtecks ​​tw = width; th = Höhe; // Anfangszoom this.scaleX = this.scaleY = initialZoom; 

Als nächstes befestigen Sie die Kamera an einem Objekt. Die Kamera wird zum gleichen Maßstab wie das Objekt.

 öffentliche Funktion SetTarget (target: Sprite): void this.target = target; // Kameraabmessungen anpassen g.width = target.width; g.height = Ziel.Höhe; 

Dies ist der interessanteste Teil und der Motor der Kamera. Das Skalieren und Übersetzen wird auf das an der Kamera angebrachte Objekt angewendet, indem es eine neue Transformationsmatrix erhält. Besuche die Matrix Weitere Informationen zur Verwendung von Matrizen finden Sie in der AS3-Dokumentation.

 öffentliche Funktion Update (): void cw = this.width; ch = this.height; tscaleX = tw / cw; tscaleY = th / ch; // Neue Skalierungswerte setzen mat.a = tscaleX; mat.d = tscaleY; // Neue Positionswerte setzen. // Die Kameraposition wird negativ gemacht, weil z. Wenn sich die Kamera nach rechts bewegt, muss die Seite nach links verschoben werden. // cw und ch werden hinzugefügt, um die Seite in die Mitte des Anzeigebereichs zu verschieben // alle Positionen werden entsprechend skaliert mat.tx = (-mat.tx + cw / 2) * tscaleX; mat.ty = (-mat.ty + ch / 2) * tscaleY; target.transform.matrix = mat; 

Schritt 7: Einrichten des Viewers

Wir kehren zu unserer Bewerbung zurück. In diesem Schritt legen wir die Grundlage für so genannte Seite Objekte, die die Leinwand mit Bildern und Text enthalten. Erstellen Sie zunächst einen Hintergrund für die gesamte Anwendung. Die Farbe wird aus XML angegeben.

 // Hintergrund var bg: Sprite = new Sprite (); bg.graphics.beginFill (xmldata.settings.bgcolor); bg.graphics.drawRect (0, 0, stage.stageWidth, stage.stageHeight); bg.graphics.endFill (); addChild (bg);

Wie im Beispiel mit der Kamera und die Blume verwenden wir pageContainer und pageScroller und Kamera. Das sollte ziemlich bekannt aussehen.

Als nächstes fügen Sie alle hinzu Seite Erforderliche Objekte, wie in der XML angegeben. In unserem Beispiel haben wir nur eine Seite erstellt. Notiere dass der Seite Klasse existiert noch nicht, da wir im nächsten Schritt diese erstellen. Seiten ist ein Array, das alle enthalten wird Seite Referenzen zur späteren Verwendung.

Parameter verwendet von Seite sind

  • pageScroller: das Sprite zu dem die Seite wird hinzugefügt
  • p: ein XML-Datenobjekt, das alle Informationen auf einer bestimmten Seite enthält (alle Bilder und Text)
  • g_background: die Hintergrundtextur
 // Seiten hinzufügen pages = new Array (xmldata.page.length ()); für jedes (var p: XML in xmldata.page) var id: int = int (p.attributes () [0]); pages [id] = neue Seite (pageScroller, p, g_background); 

Schritt 8: Seite erstellen

Unten wird der Konstruktor von angezeigt Seite. Wir speichern einfach alle Parameter lokal in der Klasse zur späteren Verwendung.

 öffentliche Funktion Seite (Container: DisplayObjectContainer, Daten: XML, Hintergrund: BitmapData) this.id = id; this.container = container; this.data = data; this.background = Hintergrund; this.title = String (data.attributes () [1]); 

Nun ein bisschen interessanteres Zeug. Das Belastung Die Funktion von Seite Beginnen Sie damit, die zuvor geladene Hintergrundtextur über die Leinwand zu nehmen. Um dies zu erreichen, müssen wir die Größe des Hintergrundbilds, das wir durchlaufen, und die Größe der gesamten Leinwand kennen. Ein ... kreieren Sprite namens g_background die als Grafikcontainer fungiert. Fügen Sie eine durchgehende Hintergrundfarbe hinzu, um zu verhindern, dass Linien zwischen den Bitmap-Bildern angezeigt werden.

 var b: int = background.width; var h: int = Hintergrund.Höhe; var trueWidth: int = Canvas.contentWidth; var trueHeight: int = Canvas.contentHeight; // Hintergrundebene g_background = new Sprite (); addChild (g_background); // Eine Hintergrundfarbe var bg: Sprite = new Sprite (); bg.graphics.beginFill (Canvas.viewerBgColor); bg.graphics.drawRect (0, 0, trueWidth, trueHeight); bg.graphics.endFill (); g_background.addChild (bg);

Beim Einwickeln der Hintergrundtextur werden zwei Schleifen verwendet, nur vertikal und eine horizontal. Es läuft weiter, bis die Kante erreicht ist. Jede einzelne Kachel an einer geraden Position - wie (2,2), (4,2), (4,6) und so weiter - wird mit verwendet scaleX oder scaleY. Dadurch fließt die Textur nahtlos in die nächste über. Die Überprüfung, ob eine Zahl gerade ist, erfolgt mit dem Modulo-Operator (%). Wenn der Rest einer Zahl nach der Division durch 2 gleich Null ist, muss diese Zahl gerade sein. Um die Ränder schneiden wir jede Textur ab, die außerhalb der Inhaltsmaße liegt, wie in angegeben trueWidth und trueHeight. Es ist wichtig, dass die Seite Das Objekt bleibt in dieser Größe. Wenn Sie es vergrößern, ändert sich das Seitenverhältnis und der Bildschirm wird verformt.

 // Schleifenhintergrundbild hinzufügen var i: int, j: int; während (i * b < trueWidth)  j = 0; while (j * h < trueHeight)  // new bitmap var s:Bitmap = new Bitmap(background); // position s.x = i * b; s.y = j * h; // alternate horizontal and vertical flip if (i % 2 != 0)  s.scaleX *= -1; s.x += b;  if (j % 2 != 0)  s.scaleY *= -1; s.y += h;  // clip if (i * b + b > trueWidth || j * h + h> trueHeight) var clipw: int = Math.min (trueWidth - i * b, b); var cliph: int = Math.min (trueHeight - j * h, h); var nbd: BitmapData = neue BitmapData (clipw, cliph); nbd.copyPixels (Hintergrund, neues Rechteck (0, 0, Clipw, Cliph), neuer Punkt ()); s.bitmapData = nbd; if (s.scaleX == -1) s.x - = b - clipw; if (s.scaleY == -1) s.y - = h - cliph;  // Bitmap zur Anzeige der Liste hinzufügen g_background.addChild (s); j ++;  i ++; 

Das Ergebnis des sich wiederholenden Hintergrunds sollte so aussehen. Dunkle Rahmen werden zur besseren Übersicht hinzugefügt.


Schritt 9: Laden von Text

Beginnen wir unsere seitenfüllende Reise mit dem Hinzufügen von Text. Gehen Sie alle XML-Einträge durch, die mit "Text" gekennzeichnet sind, und übergeben Sie ihre Daten an die Text hinzufügen Funktion.

 Texte = neues Array (); für jeden (var Text: XML in data.text) AddText (Text); 

Das Text hinzufügen Funktion sieht so aus. Der erste Teil des Codes überprüft die XML-Daten. Falls einige Felder nicht ausgefüllt sind, wird ein Standardwert angehängt. QuickText ist eine Klasse, mit der ein Textfeld mit bestimmten Optionen erstellt wird. Schließlich muss der Text mit der Mausinteraktion ausgeschlossen werden mouseEnabled = false und mouseChildren = false.

 private Funktion AddText (Text: XML): void if (! text.font) text.font = null; if (! text.size) text.size = 12; if (! text.color) text.color = 0x000000; if (! text.bold) text.bold = 0; if (! text.italic) text.italic = 0; var qt: QuickText = neuer QuickText (text.x, text.y, String (text.content), Canvas.customFont, int (text.size), uint (text.color), Boolean (text.bold), Boolean ( text.italic)); qt.blendMode = BlendMode.LAYER; texts.push (qt); addChild (qt); qt.mouseEnabled = false; qt.mouseChildren = false; 

Das folgende Bild zeigt alle Optionen des QuickText Klasse:

Und das Ergebnis der neuen Seite inklusive Text:


Schritt 10: Laden von Bildern

Der erste Schritt hier ist das Erstellen Bild Objekte, die die XML-Daten, die Bitmap und einen beschreibenden Text enthalten. Listener werden direkt für die Mausinteraktion angewendet. All diese Bild Objekte werden dann in einem Array gespeichert, um später leicht darauf zugreifen zu können.

 // Alle Bilder packen images = new Array (); für jedes (var Bild: XML in data.image) // neues Bildobjekt mit Informationen darin var Bild: Bild = neues Bild (Bild); pictures.push (Bild); // Hörer zu picture hinzufügen picture.addEventListener (MouseEvent.MOUSE_OVER, PictureMouseOver); picture.addEventListener (MouseEvent.MOUSE_OUT, PictureMouseOut); picture.addEventListener (MouseEvent.MOUSE_DOWN, PictureMouseDown); 

Und hier ist die Basisversion von Bild Klasse, nur die XML-Daten halten. Bild erweitert Sprite, wir können es schon irgendwo positionieren. Die Skalierungseinstellung wird vor der Verwendung überprüft, da der Benutzer 0 aus dem XML weglässt und 0 zurückgibt. Der Standardwert für die Skalierung ist 1.

 öffentliche Funktion Bild (Daten: XML) title = data.title; Beschreibung = Daten.Beschreibung; url = data.url; page = data.page; x = Daten.x; y = Daten.y; if (Number (data.scale)! = 0) imgscale = Number (data.scale); 

Erstelle eine neue BulkLoader genau wie beim ersten Mal, aber jetzt, um Bildstapel zu laden. Wir werden 5 Bilder gleichzeitig laden und anzeigen, wenn Sie fertig sind. Es werden so lange neue Bilder abgerufen, bis alle fertig sind. Die Funktion Komplett wird bei Abschluss jeder Charge aufgerufen.

 // Massenlader erstellen. loader = neuer BulkLoader ("page" + id); loader.addEventListener (BulkLoader.COMPLETE, Complete, false, 0, true);

// Gesamtanzahl der Bilder einstellen totalPictures = pictures.length; // Nimm die ersten 5 Bilder oder die Gesamtzahl der Bilder, wenn weniger Bilder vorhanden sind. i = 0; während ich < Math.min(totalPictures,5)) loader.add(String(Canvas.path + pictures[i].url), id: "img" + i ); i++; // Start loader loader.start();

Schritt 11: Laden von Bildern (Fortsetzung)

In diesem Schritt fügen wir die geladenen Daten ein Bild Objekte. Das Artikel Die Eigenschaft des Loaders enthält alle geladenen Objekte. Führen Sie eine Schleife über alle Objekte aus und prüfen Sie, ob sie ein Bild sind. Jeder Bitmap wird dem entsprechenden gegeben Bild Objekt und die Bild wird der Leinwand hinzugefügt. Wir löschen auch das geladene Bild aus der Liste der Loader-Elemente, um Konflikte mit einem späteren Stapel geladener Bilder zu vermeiden.

 // Bildstapel geladen Speichern Sie die Daten in einzelnen Picture-Objekten. i = QuantityPicturesLoaded; für jedes (var-Element: LoadingItem in loader.items) if (item.isImage ()) pictures [i] .SetImage (loader.getBitmap (item.id)); loader.remove (item.id); AddPicture (Bilder [i]); i ++; QuantityPicturesLoaded ++; 

Und einen genaueren Blick auf die SetImage Die Funktion von Bild.

 public function SetImage (ob: Bitmap): void // Wenn keine Bilddaten geladen sind, nichts anzeigen, wenn (ob == null) return; // speichere die Daten in der Klasse img = ob; // Bild anzeigen addChild (img); // Scale img.scaleX = img.scaleY = imgscale; 

Das Hinzufügen eines Bildes zur Leinwand ist so einfach wie das Aufrufen addChild.

 private Funktion AddPicture (Bild: Bild): void addChild (Bild); 

Das Ergebnis wird jetzt zu:


Schritt 12: Seite hinzufügen

Wenn Sie etwas zur Kameraansicht hinzufügen möchten, fügen Sie der Kamera ein untergeordnetes Element hinzu viewerScroller Container. Wir haben das hinzugefügt viewerScroller zu jedem Seite object als Parameter, damit wir es als Kind hinzufügen können, indem wir die Show() Die Funktion von Seite.

 öffentliche Funktion Show (): void container.addChild (this); 

Gehe zurück zum Segeltuch Klasse und rufen Sie die Funktionen Load () und Show () auf, wenn Sie dem Benutzer eine Seite anzeigen möchten. Im Falle der Seite ist bereits geladen, Belastung() wird direkt zurückkehren, so dass keine unnötigen Aktionen ausgeführt werden. Die jetzige Seite Wir zeigen, wird in der Klasse als gespeichert Seite. Diese Referenz wird für die Interaktion mit der Seite wichtig sein.

 private Funktion ShowPage (nr: int): void // Alte Seite ausblenden if (page) page.Hide (); // Neue Seite setzen page = pages [nr]; page.Load (); page.Show (); 

Schritt 13: Zoommodi

Nachdem wir unsere Seite nun mit Bildern und Text erstellt haben, müssen Sie sie skalieren, damit sie in unsere Viewer-Region passt. Wir verwenden die öffentlichen statischen Variablen Zoomen und magnifyStep für diesen Zweck. magnifyStep ist ein Array, das alle unterschiedlichen Skalenwerte der Kamera und enthält Zoomen ist die aktuelle Position von magnifyStep Die Kamera ist auf skaliert. Um zu wissen, welcher Skalierungswert für den Inhalt des Viewers erforderlich ist, müssen wir das Verhältnis zwischen Inhalt und Viewer-Bereichen kennen. Um falschen Seitenverhältnissen Rechnung zu tragen, nehmen wir das minimale Verhältnis zwischen Breite und Höhe wie folgt:

 // Set steplist vergrößern magnifyStepList [0] = Math.min (viewerWidth / contentWidth, viewerHeight / contentHeight);

Wir möchten die Ansicht vergrößern, wenn Sie auf die Leinwand klicken. Fügen Sie dem Trefferfeld von ein Mausereignis hinzu Seite. Das Trefferfeld ist im Grunde nur die Grafik im Hintergrund von Seite und weil es ein ist Sprite wir können Mausinteraktionen darauf legen.

 page.hitField.addEventListener (MouseEvent.MOUSE_DOWN, MouseZoomIn);

Mit einem Mausklick möchten wir, dass die Kamera auf die Zoom-Position verkleinert wird magnifyStepList und bewegen Sie sich zu dem Punkt auf der Leinwand, auf den Sie geklickt haben. Denken Sie an das Beispiel, dass der Zoom auf der Leinwand größer wird, wenn die Kamera kleiner wird (verkleinert). Deshalb verringern wir den ganzzahligen Zoom um den Wert Eins. Die Mausposition, die wir auf der Leinwand angeklickt haben, ist einfach zu verwenden page.mouseX und page.mouseY. Flash konvertiert die Zahlen automatisch so, dass sie lokal erscheinen. Das heißt, wenn die Seite zum Beispiel um 2000% verkleinert wird und Sie halb klicken, gibt sie 1000 px zurück, obwohl die Mausposition bei Skalenkoordinaten viel kleiner ist.

 private Funktion MouseZoomIn (e: MouseEvent): void var pt: Point; if (! cam.bZooming && zoom> 0) // Zoom in einem Schritt zoom--; // Neuer Kamerapunkt. Grenzen korrigieren pt = neuer Punkt (page.mouseX, page.mouseY); CameraBounds (pt); cam.Zoom (pt.x, pt.y, magnifyStepList [Zoom]); 

Schritt 14: Kameraposition korrigieren

Um den Bereich der Kamera in der Leinwand zu halten, müssen wir die Position innerhalb der Kamera korrigieren. Schauen Sie sich das Kamerabeispiel noch einmal an, um dies zu demonstrieren. Die Kamera ist um sich selbst zentriert, so dass die Position horizontal beispielsweise innerhalb bleiben muss 0 + halbe Breite der Kamera und contentWidth - halbe Breite der Kamera. Eine zuverlässige Methode zur Berechnung der Breite der Kamera beim Vergrößern ist contentWidth / 2 * magnifyStepList [zoom], weil die Kamera in ihrem ursprünglichen Zustand die Größe hat contentWidth (gleiche Größe wie die Leinwand).

 private Funktion CameraBounds (pt: Point): void // horizontal if (pt.x < contentWidth/2 * magnifyStepList[zoom]) pt.x = contentWidth/2 * magnifyStepList[zoom]; else if (pt.x > contentWidth - contentWidth / 2 * magnifyStepList [zoom]) pt.x = contentWidth - contentWidth / 2 * magnifyStepList [zoom]; // vertikal if (pt.y < contentHeight/2 * magnifyStepList[zoom]) pt.y = contentHeight/2 * magnifyStepList[zoom]; else if (pt.y > contentHeight - contentHeight / 2 * magnifyStepList [Zoom]) pt.y = contentHeight - contentHeight / 2 * magnifyStepList [Zoom]; 

Im Bild unten sind die Kamera und die Leinwand einmal vergrößert dargestellt. Die roten Linien zeigen die Grenzen, die die Kamera nicht überschreiten darf und innerhalb bleiben muss.


Schritt 15: Zoomen

Das Zoomen erfolgt durch Hinzufügen von Skalen zur Kamera. Wir benutzen die Tweener Klasse und die "easyOutQuint" Übergang, damit dies reibungslos geschieht. bZooming ist eine Variable, um zu sehen, ob die Kamera bereits zoomt oder nicht. Sie können die Seite nicht erneut zoomen, solange sie noch hoch oder runter skaliert ist. Bei jedem Update der Kamera die Funktion Aktualisieren aufgerufen wird, die die Skalierung des Inhalts vornimmt.

 öffentliche Funktion Zoom (newx: int, newy: int, newscale: Number): void bZooming = true; Tweener.addTween (dies ist time: 2, x: newx, y: newy, Übergang: "easeOutQuint") scaleX: newscale, scaleY: newscale, onComplete: function (): void bZooming = false;, onUpdate: Update ); 

Schritt 16: Ein genauerer Blick auf die Bilder

Denken Sie daran, dass wir hinzugefügt haben MouseEvent Zuhörer alle Bilder auf der Seite. Was wir gerne machen würden, ist ein Bild zu vergrößern, wenn eines angeklickt wird, und sicherzustellen, dass es gut in den Betrachterbereich passt. Bilder, die kleiner als der tatsächliche Betrachterbereich sind, dürfen nicht über ihre Auflösung hinaus skaliert werden.

 private Funktion PictureMouseDown (e: MouseEvent): void var newScale: Number; var screenRatio: Number = Canvas.viewerWidth / Canvas.viewerHeight; var imgW: Number = Math.max (e.target.width * 1.05, Canvas.viewerWidth); var imgH: Number = Math.max (e.target.height * 1.05, Canvas.viewerHeight); var imgRatio: Number = e.target.img.width / e.target.img.height // Bildskalierung berechnen if (imgRatio < 1) newScale = imgH / Canvas.contentHeight; else newScale = imgW / Canvas.contentWidth; Canvas.cam.Zoom(e.target.x + e.target.width/2, e.target.y + e.target.height/2, newScale); Canvas.cam.bLocked = true; PictureMouseDisable(); 

Das Grundkonzept hier ist, dass zunächst das Seitenverhältnis eines Bildes bestimmt werden muss. Wenn die Breite eines Bildes höher ist als die Höhe, dann imgRatio < 1 gilt als wahr und umgekehrt, wenn die Höhe größer als die Breite ist. Wir skalieren immer auf den größten Teil eines Bildes, dh wenn das Bild beispielsweise 200x400px ist, werden wir das Bild wie ein 400x400-Quadrat behandeln. Ein weiterer Zusatz hier ist, dass wir das Bild zuerst mit 1.05 skalieren, was bedeutet, dass das Bild 5% größer wird. Auf diese Weise berührt das Bild beim Vergrößern die Seiten nicht. Um den Maßstab eines Bildes im Vergleich zur Inhaltsgröße zu berechnen, teilen wir es durch die Höhe oder Breite des Inhalts.

Ruf den Zoomen Funktion der Kamera und bewegen Sie sich in die Mitte des Bildes, auf das wir uns fokussieren, und wenden die neue Skala an, die wir berechnet haben.

Hier ist der Bildzoomprozess in Aktion dargestellt. Beachten Sie, wie die Kamera innerhalb der Grenzen der Seite gehalten wird und wie das gesamte Bild einschließlich der Beschreibung perfekt in den Bildschirm passt.


Schritt 17: Blättern der Seite

Wenn Sie es nicht bemerkt haben, können Sie beim Vergrößern einer Seite den Mauszeiger an den Bildschirmrand bewegen, um zu blättern und weitere Seiten anzuzeigen. Der unten abgebildete Code kann für Sie etwas bizarr aussehen; Es ist etwas, das ich vor einiger Zeit für eine RTS-Game-Engine geschrieben habe und es seitdem für alles, was Scrollen braucht, wiederverwendet. Grundprinzip ist hier, dass Sie überprüfen, wo sich die Mausposition befindet, und falls sie sich ohne einen bestimmten Bereich um die Größen bewegt (mouse_scroll_areax_reduced und mouse_scroll_areay_reduced) dann bewegt es sich zu einer Seite, die proportional zu der Entfernung innerhalb dieses Bereichs ist. Wenn sich der Mauszeiger nicht innerhalb des Bereichs befindet, wird der Bildlauf durch Ziehen mit der Maus verlangsamt.

 // Erhalte die benötigte Menge an Scolling basierend auf der Mausposition mx = viewerContainer.mouseX; my = viewerContainer.mouseY; if (mx < mouse_scroll_areax && mx > 0) scrollAmountX = ((((mx - mouse_scroll_areax) / mouse_scroll_areax_reduced) * mouse_scroll_factor) + .5) << 0;  else if ((viewerContainer.width - mx) < mouse_scroll_areax && mx < viewerContainer.width)  scrollAmountX = (((1 - (viewerContainer.width - mx) / mouse_scroll_areax_reduced) * mouse_scroll_factor) + .5) << 0;  if (my < mouse_scroll_areay && my > 0) scrollAmountY = (((((mein - mouse_scroll_areay) / mouse_scroll_areay_reduced) * mouse_scroll_factor) + .5) << 0;  else if ((viewerContainer.height - my) < mouse_scroll_areay && my < viewerContainer.height)  scrollAmountY = (((1 - (view