Экраны дисплея в AIR

Adobe AIR 1.0 и более поздних версий

При помощи класса Screen в Adobe® AIR® можно получить доступ к информации о экранах дисплея, подключенных к компьютеру или другому устройству.

Основные сведения об экранах дисплея в AIR

API-интерфейс экрана содержит один класс, Screen, состоящий из статических членов для получения информации о системном экране и экземпляров для описания конкретного экрана.

К компьютерной системе может быть подключено несколько мониторов или дисплеев, которые могут соответствовать нескольким экранам рабочего стола, расположенным в виртуальном пространстве. Класс AIR Screen предоставляет информацию об экранах, их относительном расположении и доступном пространстве. Если несколько мониторов соответствуют одному и тому же экрану, существует только один экран. Если размер экрана превышает площадь отображения монитора, невозможно определить, какая часть экрана видима в данный момент.

Экран представляет собой независимую область дисплея настольного компьютера. Экраны имеют вид прямоугольников на виртуальном рабочем столе. Верхний левый угол экрана, обозначенного как основной дисплей, представляет собой начало отсчета в системе координат виртуального рабочего стола. Все значения, используемые при описании экрана, выражены в пикселах.

Полноразмерное изображение
При таком расположении экранов на виртуальном рабочем столе существует два экрана. Координаты верхнего левого угла основного экрана (№1) всегда равны (0,0). При изменении приоритета экранов и назначении экрана №2 в качестве основного координаты экрана №1 станут отрицательными. Строки меню, панели задач и доки выходят за границы полезной площади экрана.

Дополнительные сведения о классе, методах, свойствах и событиях API-интерфейса экранов см. в cправочнике ActionScript® 3.0 для платформы Flash® Platform.

Перечисление экранов

Перечислить экраны виртуального рабочего стола можно при помощи следующих методов и свойств экрана:

Метод или свойство

Описание

Screen.screens

Возвращает массив объектов Screen, описывающий доступные экраны. Порядок следования элементов в массиве не имеет значения.

Screen.mainScreen

Возвращает объект Screen основного экрана. В системе Mac OS X основным экраном является экран, отображающий строку меню. В системе Windows основным экраном является системный основной экран.

Screen.getScreensForRectangle()

Возвращает массив объектов Screen, описывающий экраны, входящие в заданный прямоугольник. Прямоугольник, передаваемый этому методу, обозначен при помощи координат виртуального рабочего стола, выраженных в пикселах. Если в заданный прямоугольник не попадает ни один экран, массив будет пуст. При помощи этого метода можно узнать, на каких экранах отображается окно.

Не сохраняйте значения, возвращаемые методами и свойствами класса Screen. Доступные экраны и их расположение могут измениться пользователем или операционной системой в любое время.

В следующем примере API-интерфейс экрана используется для перемещения окна между экранами в ответ на нажатие клавиш со стрелками. Чтобы переместить окно в следующий экран, пример возвращает массив screens и сортирует его по вертикали или по горизонтали (в зависимости от нажатой клавиши со стрелкой). Затем код проходит через отсортированный массив, сопоставляя каждый экран координатам текущего экрана. Чтобы определить экран, на котором отображается окно, пример вызывает метод Screen.getScreensForRectangle(), передавая ему границы окна.

package { 
    import flash.display.Sprite; 
    import flash.display.Screen; 
    import flash.events.KeyboardEvent; 
    import flash.ui.Keyboard; 
    import flash.display.StageAlign; 
    import flash.display.StageScaleMode; 
     
    public class ScreenExample extends Sprite 
    { 
        public function ScreenExample() 
        { 
                stage.align = StageAlign.TOP_LEFT; 
                stage.scaleMode = StageScaleMode.NO_SCALE; 
                 
                stage.addEventListener(KeyboardEvent.KEY_DOWN,onKey); 
        } 
     
        private function onKey(event:KeyboardEvent):void{ 
            if(Screen.screens.length > 1){ 
                switch(event.keyCode){ 
                    case Keyboard.LEFT : 
                        moveLeft(); 
                        break; 
                    case Keyboard.RIGHT : 
                        moveRight(); 
                        break; 
                    case Keyboard.UP : 
                        moveUp(); 
                        break; 
                    case Keyboard.DOWN : 
                        moveDown(); 
                        break; 
                }     
            } 
        }     
                 
        private function moveLeft():void{ 
            var currentScreen = getCurrentScreen(); 
            var left:Array = Screen.screens; 
            left.sort(sortHorizontal); 
            for(var i:int = 0; i < left.length - 1; i++){ 
                if(left[i].bounds.left < stage.nativeWindow.bounds.left){ 
                    stage.nativeWindow.x +=  
                        left[i].bounds.left - currentScreen.bounds.left; 
                    stage.nativeWindow.y += left[i].bounds.top - currentScreen.bounds.top; 
                } 
            }  
        } 
         
        private function moveRight():void{ 
            var currentScreen:Screen = getCurrentScreen(); 
            var left:Array = Screen.screens; 
            left.sort(sortHorizontal); 
            for(var i:int = left.length - 1; i > 0; i--){ 
                if(left[i].bounds.left > stage.nativeWindow.bounds.left){ 
                    stage.nativeWindow.x +=  
                        left[i].bounds.left - currentScreen.bounds.left; 
                    stage.nativeWindow.y += left[i].bounds.top - currentScreen.bounds.top; 
                } 
            }  
        } 
 
        private function moveUp():void{ 
            var currentScreen:Screen = getCurrentScreen(); 
            var top:Array = Screen.screens; 
            top.sort(sortVertical); 
            for(var i:int = 0; i < top.length - 1; i++){ 
                if(top[i].bounds.top < stage.nativeWindow.bounds.top){ 
                    stage.nativeWindow.x += top[i].bounds.left - currentScreen.bounds.left; 
                    stage.nativeWindow.y += top[i].bounds.top - currentScreen.bounds.top; 
                    break; 
                } 
            }  
        } 
 
        private function moveDown():void{ 
            var currentScreen:Screen = getCurrentScreen(); 
             
            var top:Array = Screen.screens; 
            top.sort(sortVertical); 
            for(var i:int = top.length - 1; i > 0; i--){ 
                if(top[i].bounds.top > stage.nativeWindow.bounds.top){ 
                    stage.nativeWindow.x += top[i].bounds.left - currentScreen.bounds.left; 
                    stage.nativeWindow.y += top[i].bounds.top - currentScreen.bounds.top; 
                    break; 
                } 
            }  
        } 
         
        private function sortHorizontal(a:Screen,b:Screen):int{ 
            if (a.bounds.left > b.bounds.left){ 
                return 1; 
            } else if (a.bounds.left < b.bounds.left){ 
                return -1; 
            } else {return 0;} 
        } 
         
        private function sortVertical(a:Screen,b:Screen):int{ 
            if (a.bounds.top > b.bounds.top){ 
                return 1; 
            } else if (a.bounds.top < b.bounds.top){ 
                return -1; 
            } else {return 0;} 
        } 
         
        private function getCurrentScreen():Screen{ 
            var current:Screen; 
            var screens:Array = Screen.getScreensForRectangle(stage.nativeWindow.bounds); 
            (screens.length > 0) ? current = screens[0] : current = Screen.mainScreen; 
            return current; 
        }         
    } 
}