• User Newbie

    Video e Layer con AS3 ed AIR for Android

    Sto sviluppando un player video per android utilizzando flash ed AIR.
    Il player ha un menu, che in genere compare sopra il video. E fin qui nessun problema.
    I problemi invece nascono quando metto in background la app e poi la riapro: il video riprendere l'esecuzione senza problemi (ho gestito la pausa ed il resume) ma passa in primo piano ed il menu non è più visibile.
    Ho controllato la lista di visualizzazione dello stage su cui sia il video che il menu sono caricati e l'ordine di inserimento è quello giusto!

    Da cosa potrebbe dipendere e come potrei porvi rimedio?

    S.


  • Super User

    Ciao benvenuto sul forum GT, gestisci la profondità dell'oggetto video e caricalo sul livello 0

    
    setChildIndex(mioVideo,0)
    
    

    PS. è sempre bene postare il codice per capirsi meglio.


  • User Newbie

    Ciao, grazie della risposta.
    Purtroppo non si tratta di un problema di profondità: ho riverificato l'ordine degli elementi nella lista di visualizzazione ed è quello corretto (il video sta nella posizione 0, il menu nella 5 - dopo altri elementi).
    Il codice effettivo è un po' problematico da postare, essendo molto lungo e con molte chiamate incrociate (non carica un solo video ma una playlist dinamica); ne posto però uno semplificato che ho trovato in rete e che uso come test che presenta lo stesso bug:

    
    
        public function FullScreenAir()
        {
            super();
            
            // support autoOrients
            stage.align = StageAlign.TOP_LEFT;
            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.addEventListener(StageOrientationEvent.ORIENTATION_CHANGE, handleUI);
            
            addEventListener(Event.ADDED_TO_STAGE, init);
        
        }
        
        private function init(e:Event):void{
        
            e.target.removeEventListener(e.type, arguments.callee);
            
            createVideo(video su uno spazio web/ in formato.mp4);
            createControls();
            
            handleUI();
            
            stage.displayState=StageDisplayState.NORMAL; 
            stage.addEventListener(Event.ACTIVATE, attivato);
        
        
        }
        
        
        private function attivato(e:Event){
            
            if(video) setChildIndex(video,0)
            if(switcher) addChild(switcher);
            trace("attivato");
        }
        
        private function createVideo(url:String):void{
        
            video = new Video();
            
            var videoConnection:NetConnection = new NetConnection(); 
            videoConnection.connect(null); 
            
            var videoStream:NetStream = new NetStream(videoConnection); 
            
            var clientOBJ:Object = new Object();
            
            clientOBJ.onMetaData = metaDataHandler;
            videoStream.client = clientOBJ;
            
            videoStream.addEventListener(AsyncErrorEvent.ASYNC_ERROR, onAsyncError);
            
            addChild(video); 
            
            video.attachNetStream(videoStream); 
            
            videoStream.play(url); 
        
        }
        
        private function metaDataHandler(infoObject:Object):void {
        
        
        
        }
        
        private function onAsyncError(e:AsyncErrorEvent):void {
        
        
        
        }
        
        private function onMetadata(e:Event):void {
        
        
        
        }
        
        
        private function createControls():void{
        
            switcher = new SimpleButton();
            
            var rect:Shape = new Shape();
            
            rect.graphics.beginFill(0xff0000, 1);
            rect.graphics.drawRect(0, 0, 200, 100);
            
            switcher.upState = rect;
            switcher.downState = rect;
            switcher.overState = rect;
            switcher.hitTestState = rect;
            
            
            addChild(switcher);
        
        }
        
        private function handleUI(e:StageOrientationEvent = null):void{
        
            video.x = (stage.stageWidth - video.width) / 2;
            video.y = (stage.stageHeight - video.height) / 2;
            
            switcher.x = video.x+(switcher.width/2);
            switcher.y = video.y+ (switcher.height/2);
        
        }
        
        }
    }
    
    
    
    
    

    In questo esempio viene caricato un video e sopra il video viene disegnato un rettangolo.
    Tutto funzione, fino a quando non di manda l'app in background, magari premendo il tasto Home, e la si richiama. Quando l'app si riattiva, nonostante venga invocato il metodo "attivato" che, a scanso di equivoci, ridispone il video in secondo piano e il rettangolo in primo, il video va a coprire il rettangolo.

    Questo avviene unicamente nella versione tablet!
    Nei debug fatti su pc, utilizzando l'ambiente di test di Flash Professional CS5.5 il problema non si riscontra.
    Ma sul mio tablet (Asus MemoPad 7) si rileva questo problema (ed anche su altri dispositivi).

    Ad esser precisi, quando l'app torna in primo piano, per un attimo si vedono i due elementi nell'ordine giusto, col rettangolo che sovrasta il Video: ma dopo un istante riprende la riproduzione (che in questa versione del codice non si interrompe mai, mentre nel mio codice originale va in pausa alla disattivazione dell'app; ma a quanto pare non è questo a comprometterne il funzionamento); ed è proprio quando ritorna ad essere visualizzato il video che il rettangolo viene coperto.

    Non so come venga gestito il flusso video all'interno dell'oggetto Video, ma l'impressione è che l'oggetto sia alla giusta profondità ma il flusso di immagini sia portato in primo piano.
    A scanso di equivoci ho anche disabilitato il fullscreen e ribadito il displayState a Normal, ma non pare sia quello il problema.

    Spero che adesso il quadro sia completo.

    Grazie ancora.