Android için Air'deki oryantasyon değişikliği nasıl devre dışı bırakılır

Android için Air ile yaptığım bir oyunla ilgili bir sorunum var. Uygulamaya çalıştığım telefonu kilitleyene ve uygulamanın kilidini açana kadar uygulama kendini doğru şekilde gösteriyor (yatayda kalıyor). Telefon kilitlendiğinde, uygulama dikey modda olacaktır (her zaman yatay olmalıdır).

Tanımlayıcı xml dosyasında tam ekranı doğru olarak, yatay olarak en boy oranını ve otomatik olarak yanlış yönüne ayarladım ancak bu, kilitlendiğinde ve kilidi açıldığında uygulamayı etkilemiyor gibi görünüyor (başka bir senaryoda mükemmel çalışıyor). Tekrar portreye dönecek ve kilidi açıldığında tekrar manzaraya dönmeyecek (bu nedenle otomatik yönlendirme kesinlikle karıştırılmıyor).

Bu sorun yalnızca oyunu çalıştırdığınızda, telefonu kilitlediğinizde ve kilidini açtığınızda tetiklenir. Örneğin, ana düğmeye basacak olursanız uygulama artık odakta kalmayacaksa, kilitleyin ve kilidini açın ve duraklatılmış oyuna geri dönün;

EDIT: Sadece önemli bir keşif yaptım! Bu telefonunuzda ne tür bir kilit ekranı kullandığınıza bağlı gibi görünüyor. Ben bir android 4 galaksi s3 kullanıyorum. Kilit ekranı kullanmamaya başladım ve kilidi açtığımda uygulama yatay kaldı! Bu ilerleme. Ne yazık ki farklı bir 4.0 android telefona sahip olan arkadaşım aynı sorunu bildirdi, bu yüzden sadece benim telefonum değil.

0

8 cevap

Bende de aynı sorun var. Birkaç farklı cihazda test ettim. Kilit ekranı bir şifre gerektiriyorsa, birçoğu gerçekten çöküyor ya da aşırı bir gecikme yaşıyor. Çözümüm, cihaz uykuya daldıktan sonra otomatik yönlendirmeye izin veriyor ve ardından cihaz Manzaraya girdiğinde onu tekrar devre dışı bırakıyor. Cihaz portre modundayken tüm içeriğimi gizlerim. Bilginize Bu kodun tümünü henüz test etmedim, bu yüzden bir şey eksik olabilir.

//Before the device goes to sleep, enable auto-orientation
NativeApplication.nativeApplication.addEventListener(Event.DEACTIVATE, handleDeactivate, false, 0, true);
function handleDeactivate(e:Event):void
{
    stage.autoOrients = true;

    //listen for the device to re-activate
    e.currentTarget.addEventListener(Event.ACTIVATE, handleActivate, false, 0, true);
}

//Once the device is re-activated, check the orientation.
function handleActivate(e:Event):void
{
    e.currentTarget.removeEventListener(Event.ACTIVATE, handleActivate, false, 0, true);

    //if the orientation is portait, just listen for an orientation change
    if (stage.stageHeight > stage.stageWidth)
    {
        //It makes sense that you would just use stage.setAspectRatio(StageAspectRatio.LANDSCAPE) here,
        //however in my experience I've found that setting the aspect ratio here seems to cause an infinite loop of the device attempting to reset the orientation.
        //Instead, I will wait for the user to change orientation, and then lock it in landscape
        stage.addEventListener(StageOrientationEvent.ORIENTATION_CHANGE, onOrientationChange);
    }
    else
    {
        disableAutoOrientation();
    }
}

//Check if the new orientation is landscape. If so, disable orientation changes.
function onOrientationChange():void
{
    if (stage.stageWidth > stage.stageHeight)
    {
        stage.removeEventListener(StageOrientationEvent.ORIENTATION_CHANGE, onOrientationChange);
        disableAutoOrientation();
    }
}

//disable the auto-orientation feature
function disableAutoOrientation():void
{
    stage.autoOrients = false;
}
2
katma

Bunu uygulama tanımlayıcı xml’ine koy

portrait
false
2
katma
Sadece dikey portreyi AspectRatio etiketinin içindeki manzara ile değiştirin.
katma yazar Adrian Pirvulescu, kaynak
uygulama tanımlayıcınızı ve bazı kodları paylaşabilir misiniz?
katma yazar Adrian Pirvulescu, kaynak
Denedim (ve sanırım, başarısız oldum) soruma açıklamak, bunu denedim, zaten manzara olması gerekiyordu ama portre olmamalıydı. Düşünce için teşekkürler.
katma yazar Xaduurv, kaynak
Bir kez daha, AspectRatio etiketinde LANDSCAPE var. Portre, ASLA aslaRRIO etiketinde bulunmadı.
katma yazar Xaduurv, kaynak

Aynı problemi kafama sokuyorum, işte konuya ilişkin bilgi birikimim.

Görebildiğim kadarıyla, neden ana ekrandaki kilit ekranı bir kaplamadır, bu nedenle kilit ekranını göstermek için uygulamanızla birlikte ekran etkinleştirilir ('aktifleştir' olayını alır ve çalışmaya başlar). Cihaz varsayılan olarak kilit ekranında dikey yönde ayar yaparsa (telefonlar çoğunlukla yapar, tabletler çoğunlukla kullanmaz), tercihleriniz ve AIR bildirim dileklerinden bağımsız olarak uygulamanız sürüş boyunca sürüklenir.

Sonuç olarak, uygulamanız nihayet ön plana çıktığında (kullanıcı ekran kilidini açar) portre yönelimlidir. Çözüm, activate olayını alırken istenen yönlendirmeyi el ile ayarlamaktır. ICS'de ek bir tuhaflık var - sistem bildirim çubuğu kilit açma işleminden sonra tekrar görüntüleniyor (artık tam ekran yok) ve aşamayı tam ekran olarak yeniden ayarlamak etkisizdir. Ve alabildiğim kadarıyla. Bir çözüm bulursanız bir bildirim için teşekkür ederiz.

İlgili bir sorun, kilit ekranı görüntülendiğinde, oyununuzun altında çalışmaya başlamasıdır; bu, örneğin bir aksiyon oyunuysa ve hemen giriş gerektiren (örneğin oyunun herhangi bir yerinde) bir şeyin ortasında durduysanız, kötü bir durumdur. :-)). Bunun için bir çözüm bulmak için seversin .

0
katma
Teşekkürler jpop! Sorunumu benden daha iyi ifade etmiş gibisin. Diğer adam anlamadı. Maalesef bu konuda senden daha fazlasını alamadım. En boy oranını, ekran boyutunu, tam ekranı vb. Ayarlamadan başarılı olmadan, bu şeyleri elle değiştirmeyi denedim. Bunun bir Google problemi olduğunu düşünüyorum. Platform seçimimden şüphe duymaya başladım ... Kimse birlik?
katma yazar Xaduurv, kaynak

Kilit ekranından çıktıktan sonra zorla yaşama portre davranışında da aynı problemler yaşamaya başladım. İşe yarayan gibi bir şey kullandım:

stage.addEventListener(StageOrientationEvent.ORIENTATION_CHANGE, onOrientationChange, false, 0, true);

private function onOrientationChange():void
{
    if (stage.stageWidth > stage.stageHeight)
    {
        stage.setAspectRatio(StageAspectRatio.PORTRAIT);
    }
    else
    {
        stage.setAspectRatio(StageAspectRatio.LANDSCAPE);
    }
}

bir cihaz eğer stageWidth'i daha uzun taraf olarak bildirirse ne olacağını tam olarak bilememekteyim ve stageHeight kısa tarafa kadar yani tüm cihazlar yönünü beklediğimiz gibi bildirirse

0
katma
Aslında (!!) sabit bir yönelim için bunu kullandım, şaşırmıştım ama şimdi her zaman dikey olarak stage.addEventListener (Event.ACTIVATE, onActivate, false, 0, true); özel işlev onActivate (e: Olay): void {stage.setAspectRatio (StageAspectRatio.LANDSCAPE); }
katma yazar bikutaa, kaynak

Ben de aynı problemi yaşıyorum ... yumrukla yuvarlanmaya karar verdim ve oyunumu tekrar sıvı düzenine soktum ve her şey yeniden konumlandırıldı ve yeniden boyutlandırıldı. Genel olarak, işe yaradı, ancak manzara kalmayı tercih ederdim. Bunun bir Google olayı olduğunu sanmıyorum, sanırım bir Flash CS6 sorunu. CS5.5'te yayınladığımda bu hata olmadı, ancak AIR'yi oyunuma entegre edebildiğim için CS6'yı aldım. Neden olduğundan emin değilim, ama bu benim gözlemlerim.

0
katma

Etrafta bir sürü zorlanmadan sonra, cihazlarımda güvenilir bir şekilde çalışan basit bir çözüm buldum. Temel olarak sadece uygulamanın aktif olduğunu dinleyin ve ardından yönlendirmesini istediğiniz gibi sıfırlayın.

NativeApplication.nativeApplication.addEventListener(Event.DEACTIVATE, onDeactivate);

private function onDeactivate(e:Event):void
{
    this.addEventListener(Event.ACTIVATE, onActivate);
}

private function onActivate(e:Event):void
{
    this.removeEventListener(Event.ACTIVATE, onActivate);

    if(stage.deviceOrientation == StageOrientation.ROTATED_RIGHT)
        stage.setOrientation(StageOrientation.ROTATED_LEFT);
    else
        stage.setOrientation(StageOrientation.ROTATED_RIGHT);
}
0
katma

Sanırım bu eski bir iş parçacığı ama ben de aynı sorunu yaşadım ve bu benim için sorunu çözdü. Ekstra bir dinleyici biraz kaba ama işe yarıyor.

var default_orientation:String;
default_orientation=stage.orientation;

stage.addEventListener(Event.ENTER_FRAME,check_if_stage_is_rotated);

function check_if_stage_is_rotated(e:Event):void{
    if (stage){
        if(stage.orientation!=default_orientation){
            stage.setOrientation(default_orientation);
        }
    }

}
0
katma

Mobil oyun android uygulamam manzara modunda olmalı, uygulamayı küçültdükten sonra ekranı en üst düzeye çıkardıktan sonra ekran modunda görüntülenecek ve ekran döndürülmeyecek, ancak sorun yükseklik ve genişliğin birbiriyle değiştirilmesi. Bu nedenle, ekranın yarısı yalnızca kalan boş ekran idi. Cihazı kilitleyip kilidini açarsak, otomatik olarak yükseklik ve genişlikler ekran boyutuna göre sığar.

Yukarıdaki sorunu Event.ACTIVATE kullanarak çözdüm, eğer uygulama aktifse genişlik, yükseklik, scaleX ve scaleY değerlerini sıfırlarım. 4.0, 4.1, 4.2 android sürümlerinde iyi çalışıyor ancak 4.4, 5.1 kullandığımız zaman da aynı sorunu gösterecek. Bunu nasıl düzeltebiliriz?

0
katma