zoukankan      html  css  js  c++  java
  • Flex【原创】Air桌面应用程序最小化托盘

    如题:Air桌面应用程序最小化托盘功能实现

    1.核心类 : 处理最小化托盘的逻辑

    package 
    {
        import flash.desktop.NativeApplication;
        import flash.desktop.SystemTrayIcon;
        import flash.display.BitmapData;
        import flash.display.Loader;
        import flash.display.NativeMenu;
        import flash.display.NativeMenuItem;
        import flash.display.NativeWindowDisplayState;
        import flash.events.Event;
        import flash.events.IOErrorEvent;
        import flash.events.MouseEvent;
        import flash.events.NativeWindowDisplayStateEvent;
        import flash.net.URLRequest;
        
        import mx.controls.Alert;
        import mx.core.FlexGlobals;
        import mx.core.UIComponent;
        import mx.events.CloseEvent;
        
        import spark.components.Application;
        
        /** 
         * <br>Utils for  Let System to Tray </br>
         * This class describes how to dock an AIR application to the system tray 
         * and then undock it again. 
         * The minimize and close actions of the WindowedApplication are caught, so 
         * that we can introduce our own actions. 
         * 
         * A simple systray menu is presented, to show the usage of that. 
         * 
         * @Author: S.Radovanovic 
         * @Url: http://www.cnblogs.com/loveFlex/
         * @date: 2012-06-18 
         * @author binyy
         * Updated for AIR Beta 3 
         */ 
        public class Systray extends UIComponent
        {
            private static var stu:Systray;
            
            private var _dockImage:BitmapData; 
            private var _app:Application = FlexGlobals.topLevelApplication as Application;
            private const _icon:String = "assets/m_16.png";
            [Bindable]
            [Embed(source="assets/m_24.png")]
            private var _iconClass:Class;
            
            /**closing Application call back function*/
            public var closingApp:Function = null;
            
            /**toolTips*/
            [Bindable]
            public var toolTips:String = "SupweMedia";
            
            public function Systray()
            {
                addEventListener(Event.ADDED_TO_STAGE,onAdded);
            }
            
            private function onAdded(event:Event):void
            {
                createSystemTray();
            }
            
            /**
             * create system to tray util
             * */
            private function createSystemTray():void
            {
                //Use the loader object to load an image, which will be used for the systray //After the image has been loaded into the object, we can prepare the application //for docking to the system tray 
                var loader:Loader = new Loader(); 
                loader.contentLoaderInfo.addEventListener(Event.COMPLETE, prepareForSystray); 
                loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,onIoError);
                loader.load(new URLRequest(_icon)); 
                
                //Catch the closing event so that the user can decide if it wants to dock or really //close the application 
                _app.addEventListener(Event.CLOSING, closingApplication); 
            }
            
            private function onIoError(event:IOErrorEvent):void
            {
                trace(event.text);
            }
            
            /** 
             * Check if the user wants to close the application or dock it 
             */ 
            private function closingApplication(evt:Event):void { 
                //Don't close, so prevent the event from happening 
                evt.preventDefault(); 
                
                //Check what the user really want's to do //Alert.buttonWidth = 110; 
    //            Alert.buttonWidth = 90;
                Alert.buttonHeight = 25;
                Alert.yesLabel = "Close"; 
                Alert.noLabel = "Mini"; 
                Alert.cancelLabel = "Cancel";
                Alert.show("Close or minimize?", "Attention", 11, _app, alertCloseHandler,_iconClass); 
            } 
            
            // Event handler function for displaying the selected Alert button. 
            private function alertCloseHandler(event:CloseEvent):void { 
                if (event.detail == Alert.YES) { 
                    closeApp(event); 
                } else if(event.detail == Alert.NO) { 
                    dock(); 
                } else {}
            } 
            
            
            /** 
             * Check to see if the application may be docked and set basic properties 
             */ 
            public function prepareForSystray(event:Event):void { 
                
                //Retrieve the image being used as the systray icon 
                _dockImage = event.target.content.bitmapData; 
                
                //For windows systems we can set the systray props //(there's also an implementation for mac's, it's similar and you can find it on the net   ) 
                if (NativeApplication.supportsSystemTrayIcon){ 
                    setSystemTrayProperties(); 
                    
                    //Set some systray menu options, so that the user can right-click and access functionality //without needing to open the application 
                    SystemTrayIcon(NativeApplication.nativeApplication .icon).menu = createSystrayRootMenu(); 
                } 
            } 
            
            /** 
             * Create a menu that can be accessed from the systray 
             */ 
            private function createSystrayRootMenu():NativeMenu{ 
                //Add the menuitems with the corresponding actions 
                var menu:NativeMenu = new NativeMenu(); 
                var openNativeMenuItem:NativeMenuItem = new NativeMenuItem("Open"); 
                var exitNativeMenuItem:NativeMenuItem = new NativeMenuItem("Exit"); 
                
                //What should happen when the user clicks on something 
                
                openNativeMenuItem.addEventListener(Event.SELECT, undock); 
                
                exitNativeMenuItem.addEventListener(Event.SELECT, closeApp); 
                
                //Add the menuitems to the menu 
                menu.addItem(openNativeMenuItem); 
                menu.addItem(new NativeMenuItem("",true)); 
                //separator 
                menu.addItem(exitNativeMenuItem); 
                
                return menu; 
            } 
            
            /** 
             * To be able to dock and undock we need to set some eventlisteners 
             */ 
            private function setSystemTrayProperties():void{ 
                //Text to show when hovering of the docked application icon 
                SystemTrayIcon(NativeApplication.nativeApplication.icon).tooltip = toolTips; 
                
                //We want to be able to open the application after it has been docked 
                SystemTrayIcon(NativeApplication.nativeApplication .icon).addEventListener(MouseEvent.CLICK, undock); 
                
                //Listen to the display state changing of the window, so that we can catch the minimize 
                stage.nativeWindow.addEventListener(NativeWindowDisplayStateEvent.DISPLAY_STATE_CHANGING, nwMinimized); //Catch the minimize event 
            } 
            
            /** 
             * Do the appropriate actions after the windows display state has changed. 
             * E.g. dock when the user clicks on minize 
             */ 
            private function nwMinimized(displayStateEvent:NativeWindowDisplayStateEvent):void { 
                
                //Do we have an minimize action? //The afterDisplayState hasn't happened yet, but only describes the state the window will go to, //so we can prevent it! 
                if(displayStateEvent.afterDisplayState == NativeWindowDisplayState.MINIMIZED) { 
                    //Prevent the windowedapplication minimize action from happening and implement our own minimize //The reason the windowedapplication minimize action is caught, is that if active we're not able to //undock the application back neatly. The application doesn't become visible directly, but only after clicking //on the taskbars application link. (Not sure yet what happens exactly with standard minimize) 
                    displayStateEvent.preventDefault(); 
                    
                    //Dock (our own minimize) 
                    dock(); 
                } 
            } 
            
            /** 
             * Do our own 'minimize' by docking the application to the systray (showing the application icon in the systray) 
             */ 
            public function dock():void { 
                //Hide the applcation 
                stage.nativeWindow.visible = false; 
                
                //Setting the bitmaps array will show the application icon in the systray 
                NativeApplication.nativeApplication .icon.bitmaps = [_dockImage]; 
                
                //set toolTips when minisize 
                SystemTrayIcon(NativeApplication.nativeApplication.icon).tooltip = toolTips;
            } 
            
            /** 
             * Show the application again and remove the application icon from the systray 
             */ 
            public function undock(evt:Event):void { 
                //After setting the window to visible, make sure that the application is ordered to the front, //else we'll still need to click on the application on the taskbar to make it visible 
                stage.nativeWindow.visible = true; 
                stage.nativeWindow.orderToFront(); 
                
                //Clearing the bitmaps array also clears the applcation icon from the systray 
                NativeApplication.nativeApplication .icon.bitmaps = []; 
            } 
            
            /** 
             * Close the application 
             */ 
            private function closeApp(evt:Event):void { 
                if(closingApp != null){
                    closingApp.call(this);
                }
                stage.nativeWindow.close(); 
            } 
            
        }
    }

    2:调用方式

    在主应用程序中添加托盘组件:closingHandler为关闭应用时执行的函数,toolTips为光标移动到托盘上的提示文本

    <ascomponent:Systray closingApp="closingHandler" toolTips="I am Binyy">

    此功能还可以拓展,希望大家有什么更好的拓展版本分享一下,3Q~~!

  • 相关阅读:
    运算符
    变量数据类型及其转换
    JAVA基础知识
    关于Eclipse及JDK安装过程中的一些问题
    python并发编程相关概念总结
    python网络编程01
    python网络编程
    python面向对象编程设计与开发
    python面向对象编程实例
    文件、函数、装饰器、迭代器实例
  • 原文地址:https://www.cnblogs.com/loveFlex/p/2593881.html
Copyright © 2011-2022 走看看