在Flash中使用滑鼠右鍵

0 意見

就結論來說,Flash 沒有任何方法可阻擋滑鼠右鍵,除了AIR可自訂右鍵外,在一般瀏覽器中的Flash右鍵一定會出現Flash選單,即使把content menu關掉。

即然Flash Player不能阻擋右鍵,那麼換個想法,瀏覽器是否可擋滑鼠右鍵?,答案當然可行,簡單的想法就是給Flash蓋上一層看不見的元件擋掉右鍵操作,並透過Javascript把右鍵行為傳給Flash

fig_01.jpg

這個做法雖然簡單,但每個Flash都要準備一個覆蓋元件就很麻煩,另一個比較好的做法是直接監聽Flash元件,當有右鍵行為發生時,阻擋瀏覽器事件並改成Flash事件,這種做法簡潔且方便,重點是網路上已有現成的Library可用,www.uza.lt所提供的RightClick Library就可解決這個問題,值得一提的是RightClick使用前必需把wmode改成transparent或opaque,且RightClick只會觸發右鍵行為給Flash,如果要操作Flash內的元件,可搭配MouseRollOver、stage.mouseX、stage.mouseY。

補上一些demo:

UZA demo:http://uza.lt/rightclick/

Adobe captivate demo: http://blogs.adobe.com/captivate/2009/01/Right-Click-BlogDemo.htm

Flash遊戲─快樂神仙:可使用右鍵使用道具 http://kl.linekong.com/

item.JPG



RightClick下載:http://code.google.com/p/custom-context-menu/

Uza's Blog:http://www.uza.lt/

參考文章:http://www.adobe.com/devnet/captivate/articles/rightclick.html



Adobe 發佈 Flash Player 10.1 測試版,修正wmode輸入問題

0 意見

目前Player10.1已可在Adobe Lab下載,這個版本增加了些多功能,包含Microphone的存取、多點觸碰,文字的改善等...,更多的細即可見http://www.adobe.com/devnet/logged_in/jchurch_flashplayer10.1.html

回到wmode,wmode輸入問題是player 9.0.124一直有的問題,在wmode設為transparent或opaque的情況下,Firefox會無法輸入中文,所幸在10.1終於修正,目前輸入法文字框雖然還不在正確的位置,但已可輸入中文了,有興趣的網友可安裝10.1後到這頁進行測試

FF womode issue:http://bugs.adobe.com/jira/browse/FP-501?actionOrder=desc

Flash 10.1介紹:http://www.adobe.com/devnet/logged_in/jchurch_flashplayer10.1.html



Flex Logger的Firebug target

0 意見

之前有介紹過Flex Logger跟ThunderBolt 這兩個Logging Framework,雖然Flex原生的就很好用,但Flex只提供trace Target,不像Thoundbolt有Firebug支援,為了開發方便,筆者寫了一個Flex Logger用的Firebug Target,有興趣可以參考


package idv.gd.utils.logging
{
    import flash.external.ExternalInterface;
    import flash.system.Capabilities;
    
    import mx.core.mx_internal;
    import mx.logging.LogEvent;
    import mx.logging.LogEventLevel;
    import mx.logging.targets.LineFormattedTarget;
    use namespace mx_internal;
    
    /**
     * firebug專用 log target
     * @author GD
     * 
     */    
    public class FirebugTarget extends LineFormattedTarget
    {
        private var formattedMessage:String;
        
        public function FirebugTarget()
        {
            super();
        }
        
        /**
         * 取得格式化後的lineFormatted message (內部method)
         * @param message
         * 
         */        
        override mx_internal function internalLog(message:String):void
        {
            formattedMessage = message;
        }
        
        /**
         * 送出訊息給Firebug
         * @param event
         * 
         */        
        override public function logEvent(event:LogEvent):void
        {
            super.logEvent(event);
            
            var message:String = formattedMessage;
            if (ExternalInterface.available) 
            {
                var level:int = event.level;
                switch (level)
                {
                    case LogEventLevel.DEBUG:
                    {
                        ExternalInterface.call("console.debug", message);
                        break;
                    }
                    case LogEventLevel.ERROR:
                    case LogEventLevel.FATAL:
                    {
                        ExternalInterface.call("console.error", message);
                        break;
                    }
                    case LogEventLevel.INFO:
                    {
                        ExternalInterface.call("console.info", message);
                        break;
                    }
                    case LogEventLevel.WARN:
                    {
                        ExternalInterface.call("console.warn", message);
                        break;
                    }
                    default:
                    {
                        ExternalInterface.call("console.log", message);
                        break;
                    }
                }
            }
            //保留trace
            trace(message);
        }