Como desativar a mudança de orientação no Air for Android

Eu tenho um problema com um jogo que venho fazendo para o Android com a Air. O aplicativo se orienta corretamente (permanecendo na paisagem) até eu bloquear o telefone com o qual estou testando e depois desbloqueá-lo. Quando o telefone desbloqueia, o aplicativo estará no modo retrato (sempre deve estar na paisagem).

No arquivo xml do descritor, configurei fullscreen para true, proporção para paisagem e orientação automática para false, mas isso não parece afetar o aplicativo quando está bloqueado e desbloqueado (funciona perfeitamente em qualquer outro cenário). Ele se tornará retrato novamente e não voltará ao cenário quando estiver desbloqueado (portanto, auto-orientar ser falso definitivamente não está sendo importado).

Esse problema só é acionado quando você está executando o jogo e bloqueia o telefone e desbloqueia. Se, por exemplo, você pressionar o botão "Início" para que o aplicativo não esteja mais em foco, bloqueie e desbloqueie e volte ao jogo pausado, ele ainda estará na paisagem.

EDIT: Acabei de fazer uma descoberta importante! Parece que isso depende do tipo de tela de bloqueio que você usa em seu telefone. Eu uso um android 4 galaxy s3. Eu mudei para não usar uma tela de bloqueio e o aplicativo ficou na paisagem quando eu desbloqueei! Isso é progresso. Infelizmente meu amigo que tem um telefone Android 4.0 diferente relatou o mesmo problema, então não é apenas o meu telefone.

0

8 Respostas

Eu tenho o mesmo problema. Eu testei em alguns dispositivos diferentes. A maioria delas falha ou ganha um atraso extremo se a tela de bloqueio exigir uma senha. Minha solução permite a orientação automática depois que o dispositivo adormece e, em seguida, o desativa novamente quando o dispositivo está em Paisagem. Eu escondo todo o meu conteúdo enquanto o dispositivo está no retrato. FYI Eu não testei todo esse código ainda, então pode estar faltando alguma coisa.

//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
adicionado

Coloque isso no descritor de aplicativo xml

portrait
false
2
adicionado
o apenas substituir retrato com paisagem dentro da tag aspectRatio.
adicionado o autor Adrian Pirvulescu, fonte
você pode compartilhar seu descritor de aplicativo e algum código?
adicionado o autor Adrian Pirvulescu, fonte
Como eu tentei (e eu acho que falhou) para explicar na minha pergunta foi que eu já tentei isso, embora seja suposto ser paisagem e não retrato. Obrigado pelo pensamento embora.
adicionado o autor Xaduurv, fonte
Mais uma vez, tenho PAISAGEM na tag aspectRatio. O retrato NUNCA esteve na tag aspectRatio.
adicionado o autor Xaduurv, fonte

Estou dando cabeçadas com o mesmo problema, aqui está meu infodump sobre o assunto.

Tanto quanto eu posso ver, a causa é que a tela de bloqueio é uma sobreposição na tela principal, de modo a mostrar a tela de bloqueio, o visor é ativado, juntamente com o seu aplicativo (ele recebe 'ativar' evento e começa a correr). Se o dispositivo padronizar a orientação retrato na tela de bloqueio (na maioria das vezes, os telefones não o fazem) o seu aplicativo é arrastado para o passeio, considerando suas preferências e desejos de manifestação do AIR.

Como resultado, quando o aplicativo finalmente chega ao primeiro plano (o usuário desbloqueia a tela), ele é orientado para retrato. A solução alternativa é definir manualmente a orientação desejada quando você recebe o evento de ativação. Há uma peculiaridade adicional no ICS - a barra de notificação do sistema reaparece após o desbloqueio (sem tela cheia mais) e a redefinição do estágio para tela cheia não tem efeito. E isso é tanto quanto eu consegui. Gostaria de receber um aviso se você encontrar uma solução.

Um problema relacionado é que quando a tela de bloqueio é exibida, o jogo começa a correr embaixo, o que é uma situação ruim se, por exemplo, é um jogo de ação e você parou no meio de algo que exigia entrada imediata (como em qualquer lugar do jogo) :-)). adoraria encontrar uma solução para isso.

0
adicionado
Obrigado jpop! Você parece ter articulado meu problema melhor do que eu. Aquele outro cara não pareceu entender. Infelizmente eu não cheguei mais longe do que você sobre isso. Eu tentei mudar manualmente essas coisas após o fato sem fracking a proporção, tamanho da tela, tela cheia, etc, sem sucesso. Estou a pensar que este é um problema do Google e, nesse caso, estamos fracked. Estou começando a duvidar da minha escolha de plataforma ... Une alguém?
adicionado o autor Xaduurv, fonte

Eu tive o mesmo problema por muito tempo quanto ao comportamento de retrato forçado depois de retomar da tela de bloqueio Eu usei algo assim que parece funcionar:

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);
    }
}

embora eu não tenha certeza do que aconteceria se um dispositivo relatasse stageWidth como o lado mais longo e stageHeight como o lado mais curto, ou seja, todos os dispositivos relatam a orientação como seria de se esperar

0
adicionado
na verdade (!!) para uma orientação fixa eu usei isso, eu estava confuso também, mas agora é sempre no retrato stage.addEventListener (Event.ACTIVATE, onActivate, false, 0, true); função privada onActivate (e: Event): void {stage.setAspectRatio (StageAspectRatio.LANDSCAPE); }
adicionado o autor bikutaa, fonte

Eu tenho tido exatamente o mesmo problema ... a ponto de eu decidir rolar com o soco e reconstruir meu jogo para um layout fluido e tudo ser reposicionado e redimensionado. No geral, funcionou, mas eu preferia ficar na paisagem. Eu não acho que é uma coisa do Google, eu acho que é um problema do Flash CS6. Esse erro não aconteceu quando eu publiquei no CS5.5, no entanto, obtive o CS6 porque eu podia integrar o AIR no meu jogo. Não sei por que, mas são minhas observações.

0
adicionado

Depois de um monte de mucking, eu encontrei uma solução simples que funciona de forma confiável em meus dispositivos. Basicamente, apenas ouça o aplicativo sendo ativado e, em seguida, redefina a orientação para o que você deseja que seja.

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
adicionado

Eu acho que é um segmento antigo, mas eu tive apenas esse mesmo problema e isso é o que parecia resolver o problema para mim. Um ouvinte extra é um pouco grosseiro, mas funciona.

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
adicionado

Meu aplicativo android de jogos para dispositivos móveis deve estar no modo paisagem , quando eu maximizar depois de minimizar o aplicativo que ele exibirá no modo paisagem e a tela não girada, mas o problema é altura e largura serem intercambiados. Então, foi exibido metade da tela restante apenas foi tela em branco . Se bloquearmos e desbloquearmos o dispositivo, automaticamente a altura e as larguras serão ajustadas de acordo com o tamanho da tela.

Lidei com o problema acima usando Event.ACTIVATE , se o aplicativo estiver ativo, redefino a largura, a altura, a escala X e a escala Y. Em versões 4.0, 4.1, 4.2 do android ele está funcionando bem, mas quando usamos 4.4, 5.1 ele mostra o mesmo problema. Como podemos corrigir isso?

0
adicionado