Richtig Verhinderung Orientierung ändern in Flex Mobile app
Ist jemand in der Lage, das tatsächlich funktioniert-Flex SDK 4.6?
Hier ein kurzes snippet :
<?xml version="1.0" encoding="utf-8"?>
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
addedToStage="onAddedToStage(event)"
title="Title">
<fx:Script>
<![CDATA[
private function onAddedToStage(event:Event):void {
if (stage.autoOrients) {
stage.addEventListener(StageOrientationEvent.ORIENTATION_CHANGING, orientationChanging, false, 0, true);
}
}
private function orientationChanging(event:StageOrientationEvent):void {
if (event.afterOrientation == StageOrientation.DEFAULT || event.afterOrientation == StageOrientation.UPSIDE_DOWN) {
event.preventDefault();
}
}
]]>
</fx:Script>
</s:View>
Was ich versuche zu erreichen ist die Unterstützung von Landscape-Modus in beide Richtungen, so dass, wenn der Benutzer dreht das Gerät um 180 Grad, der Bildschirm sollte auch drehen. Aber es sollte keine Aktion aus, wenn der Benutzer das Gerät dreht, um ein Querformat Orientierungen. Stattdessen sehe ich die Breite änderungen zu navigator-action-bar und manchmal auch Inhalt im Querformat Orientierungen, so scheint die Verhinderung der Veranstaltung ist nicht genug. Ich bin mit dem "offiziellen" Weg Adobe schlägt vor, das problem ist aber, dass es nicht sehr gut funktioniert. Zugegeben, die Bühne nicht ändern, aber es scheint, dass es etwas brennen im navigator wie auch immer, da können Sie sehen, die action bar Breite ändern.
Ich hatte einigen Erfolg mit explizit Einstellung layoutbounds festen Breite in der handler-Methode - dies verhindert, dass die änderung der actionbar Breite, aber es ist nur eine vorübergehende Lösung - wenn die view ist ein Thema, um einen übergang oder eine andere redraw - es wird wieder gerendert mit schlechten Größen. Als ob es etwas war, was darunter war, erzählen Sie, dass es im portrait-Modus, obwohl ich versuche, es zu verhindern.
Bevor Sie detonieren mit einigen dummen Ideen wie "autoOrient = false" nicht. Es ist offensichtlich keine Lösung für dieses problem. Offensichtlich ist es ein bug mit dem Flex-SDK - hat jemand einen Weg finden, es zu beheben oder eine stabile Lösung?
EDIT: anscheinend andere stieß ähnliches Problem:
- http://forums.adobe.com/message/3969531 (das Haupt-Thema ist, über etwas anderes, aber Lesen Sie Magische Roboter Kommentar)
- http://forums.adobe.com/message/4130972
- Das ist seltsam, weil das ist genau das, was ich benutze in meiner Anwendung, und es funktioniert sehr gut. Welche SDK version verwendest du? EDIT : Okay sorry, gerade gemerkt, dass es in der ersten Zeile von Euch Frage! Das ist die version, die ich nutzen, so habe ich keine Ahnung. Haben Sie versucht, es zu tun in Ihrem Antrag Klasse (ich verstehe nicht, warum das etwas ändern würde, aber das ist das einzige, was mir in den Sinn kommt)
- Sind Sie sicher? Können Sie beim erstellen neuer flex-mobilprojekte verwenden Sie mein code in anzeigen, kompilieren und sehen, (es kann auch im debugger, die Sie nicht haben, um es auf dem Gerät). Können Sie fügen Sie relevanten Fragmente aus dem code? Mein Beispiel ist sehr einfach, ohne zusätzlichen code, kein skinning, nichts, noch ist es eindeutig nicht richtig funktionieren - so finde ich es schwer zu glauben, es funktioniert für Sie?
- Yep, nur ersetzt meinen code mit Euch-und es funktioniert auf einem iPad. Ich weiß nicht monitor meine action bar Breite, aber es bleibt genau da, wo es ist. Ich bin das hinzufügen der listener direkt auf die addedToStage meiner ViewNavigatorApplication
- Ich habe versucht, es auch im Hauptfenster der Anwendung Datei - funktioniert immer noch nicht. Es ist eklatant sichtbar im debugger, emulator, wenn Sie drehen Sie es mit debugger-Menü - die Phase nicht ändern, aber die Aktion Balken ändert seine Breite, wenn es im portrait-Modus. Meine Anwendung startet in aspectRatio=Querformat (definiert in xml). Verwenden Sie FB 4.6 SDK 4.6? Windows oder Mac OS?
- Ok, ich habe einige tests gemacht und ja, die action bar, die Größe ändert sich in den emulator und (manchmal ?) auf dem Gerät. Ich habe keine Ahnung, ich unfortunetely keine Zeit haben, näher untersuchen. Sorry 🙁 zur info : FB und Flex 4.6 auf Windows (ich habe eine Vorabversion von FB, aber das sollte nichts ändern)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin mir nicht sicher, ob dies richtig ist, habe ich etwas falsch gemacht, aber nach viel Kampf habe ich gefunden, das eine stabile Lösung:
Erste, was zu beachten ist, dass addedToStage feuert einige Male (2-3) in der mobilen Anwendung. Ich weiß nicht, warum, es gibt keine addChild in meinem code natürlich. Vielleicht ist die AIR-Laufzeitumgebung macht etwas anderes. Also, um zu vermeiden, hinzufügen unnötige Menge von Prozeduren, die übliche Methode ist die entfernen-handler zuerst - es wird nicht alles tun, wenn solche handler sich noch nicht angemeldet hat, aber wenn es ist, es Sie zu entfernen, die zur Aufrechterhaltung der handler count auf 1.
Zweite Sache ist die Priorität der Veranstaltung - es funktioniert nicht auf 0 gesetzt werden muss, um auf etwas großes zu starten, bevor die Sachen in der AIR-Laufzeitumgebung.
Letzte, was - Veranstaltung.stopImmediatePropagation() - nun, wir sind die ersten, die das Ereignis behandeln, können wir nicht verhindern, dass dieses Ereignis gesendet werden, weiter oben in diesem speziellen Szenario.
Dies zusammen macht die Orientierung Verhütung funktioniert perfekt - für mich die Landschaft und die umgekehrte Landschaft (rotated_left, rotated_right) wurden Arbeits-und Umstieg, während der portrait-Modus hat keinen Einfluss auf die Sicht.
Nun, es gibt die Gefahr, hier - möchten Sie vielleicht, um den listener entfernen Sie beim verlassen des Blick (auf die transition animation Ende, anzeigen, deaktivieren oder sowas), weil stopImmediatePropagation wird verhindern, dass das Ereignis behandelt werden, in anderen teilen der Anwendung.
Ich hoffe, dass Adobe (oder Apache-nun, eigentlich) wird näher auf dieses problem-und trace-meine Lösung.
BEARBEITEN
Dort remaisn ein letztes Problem mit dieser Lösung, die, wenn Anwendung gestartet wird, während das Gerät im STANDARD-oder UPSIDE_DOWN Orientierung, in diesem Fall die Anwendung wird im portrait-Modus.
Um dies zu beheben, eine Lösung ist das Seitenverhältnis zu ändern innerhalb addedToStage-handler:
So, ich hatte das gleiche problem Sie hatte. Ich denke, endlich fand ich die Lösung. Heres was ich getan habe:
Erwähnenswert ist, dass in der Anwendung complete handler ich die Bühne.autoOrients wahr, weil in der app.xml Datei habe ich es auf false gesetzt, da ich einen splash-screen und die nicht wollen, dass Benutzer zu re-orientieren den Bildschirm während dieser Zeit. Wirklich das einzige, was ich anders gemacht habe ist das Konto für die StageOrientation.UNBEKANNT und zu verhindern, was auch immer, würde das tun, setzen Sie die Breite auf 1024(für den iPad-Bildschirm, könnte anders sein, für andere tablet-Geräte) in der Haupt-mxml-Datei, und entfernt die stopimmediatepropagation. Hoffe, das hilft.