'Flash'에 해당되는 글 69건

  1. SFont + 폰트 문자 범위 지정(Flex3 SDK) //2009/05/26 13:34
  2. SFont v1.1.1 - 런타임 폰트 공유 클래스 //2009/07/06 15:41
  3. SLoader - 순차적 로더 //2009/04/19 23:07
  4. navigateToURL이 팝업차단에 걸릴 때 //2009/05/08 16:00
  5. RegExp 1 - 최단 일치 검색 //2009/04/29 14:41
  6. 클래스 동적 로드 //2008/12/10 00:07 1
  7. Loader와 LoaderContext 그리고 crossdomain //2008/11/27 20:54
  8. ExternalInterface와 MouseEvent //2008/10/08 20:11
  9. Loader 와 crossdomain.xml //2008/10/01 18:37
  10. ExternalInterface.addCallback //2008/09/05 13:25
  11. event.currentTarget.removeEventListener(event.type, arguments.callee); //2008/08/28 22:57
  12. video.smoothing = true; //2008/08/26 19:08
  13. MouseEvent.DOUBLE_CLICK //2007/10/24 14:23 2
  14. Tween과 Cross Scripting //2011/01/24 16:25
  15. 문자열 byte 수 알아내기


sfont120605.rar



이전 포스트인 (링크)SFont에서의 폰트.swf파일 만들기로는 사용자가 원하는 범위의 문자만을 포함할 수 없다.

 

Flash CS3 단독으로는 이를 수행 할 수 없고,(내가 알기론...) Flex3 SDK를 이용해서 폰트.swf파일을 생성한다면 가능하다.

 

(참고 http://blog.jidolstar.com/414)

(참고 http://blog.naver.com/synchrong/110005825131)

(참고 http://www.action-scripter.com/blog/1092)

 


- Flex3 SDK를 이용해 문자범위를 지정할 수 있는  폰트.swf파일 만들기

 

SDK 설치 (http://blog.naver.com/moviel0ve?Redirect=Log&logNo=130034438959)

 

- SDK로 컴파일 할 폰트.as 파일

package {
        import flash.display.Sprite;
        import flash.text.Font;
       
        public class DinmedRegular extends Sprite       {              
               
                [Embed( mimeType='application/x-font', source='DinmedRegular.ttf', fontName='DinmedRegular', embedAsCFF="false", unicodeRange='U+0041-U+005A')] // 영문 대문자만 임베드
                protected var font:Class;
               
                function DinmedRegular(){
                        Font.registerFont(font);
                }
        }
}

unicodeRange에 임베드할 문자의 유니코드를 입력하면된다.

(유니코드는 (flex3sdk)\frameworks\flash-unicode-table.xml 또는 첨부한 파일을 참고)

위 처럼 폰트를 직접 등록(Font.registerFont(font);)하기 때문에 FontAsset에서는 등록작업을 별도로 하지 않는다.


flex sdk 4.6은 아래 옵션(-static-link-runtime-shared-libraries)을 추가해야 제대로 컴파일 된다.(아마 4버젼 부터 필요한 것으로 추측한다.)

mxmlc -static-link-runtime-shared-libraries DinmedRegular.as


그리고, 현재(2012.06.05) sdk에서는 폰트 임베드시 embedAsCFF="false" 옵션을 반드시 추가해야한다. 

(이것도 sdk 4부터 필요한 것으로 보인다.)

(http://help.adobe.com/en_US/flex/using/WS2db454920e96a9e51e63e3d11c0bf69084-7f5f.html)



- 사용법은 SFont와 같다. 단, Font Class 인자는 공백("")으로 입력한다.

import com.showjean.net.*;
import flash.net.*;
 
var sl:SFont = new SFont();
sl.addEventListener(Event.COMPLETE,completeHandler);
sl.addEventListener(IOErrorEvent.IO_ERROR,__eventHandler);
sl.addEventListener(ProgressEvent.PROGRESS, progressHandler);
sl.load("assets/DinmedRegular.swf", "");
 
 
function completeHandler(event:Event):void {
        trace(event);
 
        var tf:TextFormat=txt.getTextFormat();
        var fn:String=sl.name;
        if (fn == null) {
        } else {
                tf.font=fn;
                txt.embedFonts=true;
                txt.defaultTextFormat=tf;
                txt.text="ABCDEFG12345 "+fn;
        }
}
 
function __eventHandler(event:Event):void {
        trace(event);
}
 
function progressHandler(event:ProgressEvent):void {
        trace("progressHandler: bytesLoaded=" + event.bytesLoaded + " bytesTotal=" + event.bytesTotal);
}




Flash CS4에는 지원한다고 한다. (직접 확인은 하지 않았다.)

-> 확인 결과 CS4에서는 Flex SDK를 직접 연결해서 컴파일 가능하다. SDK로 직접 컴파일 하는 것과 다른 점이라면 fla파일이 있어야 한다는 것.






sfont090706.rar



2.0에서 꽤 까다로웠던 기술인 런타임 폰트 공유(참고 URL)를 3.0에 와서는 훨씬 간단하게 구사할 수 있게 되었다.

 

그를 이용해 일반적인 Loader처럼 폰트 로드/공유할 수 있도록 만든 클래스가 SFont이다.

 

(내부적으로 (link)SLoader를 이용하므로 참고)

 

(참조 블로그 : http://blog.jidolstar.com/468)



- 사용법 : 폰트.swf의 파일경로와 라이브러리의 Font Class를 이용해 로드 후 .name 속성으로 폰트의 이름을 TextFormat에 적용하면된다.

import com.showjean.net.*;
import flash.net.*;
 
var sl:SFont = new SFont();
sl.addEventListener(Event.COMPLETE,completeHandler);
sl.addEventListener(IOErrorEvent.IO_ERROR,__eventHandler);
sl.addEventListener(ProgressEvent.PROGRESS, progressHandler);
sl.load("assets/kroe0554.swf", "kroeger05_54");
 
 
function completeHandler(event:Event):void {
        trace(event);
 
        var tf:TextFormat=txt.getTextFormat();
        var fn:String=sl.name;
        if (fn == null) {
        } else {
                tf.font=fn;
                txt.embedFonts=true;
                txt.defaultTextFormat=tf;
                txt.text="ABCDEFG12345 "+fn;
        }
}
 
function __eventHandler(event:Event):void {
        trace(event);
}
 
function progressHandler(event:ProgressEvent):void {
        trace("progressHandler: bytesLoaded=" + event.bytesLoaded + " bytesTotal=" + event.bytesTotal);
}


- 로드될 공유용 폰트.swf파일을 만드는 법

1. 새 fla파일을 생성하고 라이브러리 메뉴>new Font... 를 선택한다.

 

2. 공유할 폰트를 고르고 Name을 적당히 입력한다.



3. 폰트가 라이브러리에 등록되었다면 Linkage...를 선택한다.




4. Export for ActionScript와 Export in first frame 을 체크하고 Class에 사용할 이름을 넣는다.



5. 컴파일 후 swf파일을 적당한 위치에 놓는다.



- SFont.as : 유저가 사용하는 주클래스로 proxy의 성격을 띤다.

/**
 * SFont -
 *
 * @author: showjean in http://showjean.com/works, mobile , mailto:showjean@hanmail.net
 * @version: 1.0.0
 * @date: 2009.5.22.
 *
 * @comment: 유저가 사용하는 클래스, FontAsset의 proxy 성격을 가지고있다.
 */
package com.showjean.net{
 
        import flash.events.*;
 
        public class SFont extends EventDispatcher {
 
                protected var fontAsset:FontAsset;
 
                function SFont() {
                }
                // _____________________________________________________ public
                /**
                 * 폰트를 로드
                 * url: swf의 위치
                 * linkage: swf 라이브러리의 Font Class
                 */
                public function load(url:String,linkage:String):void {
                        if (fontAsset == null) {
 
                                fontAsset=FontAssetManager.getInstance().getFontAsset(url,linkage);
 
                                // 폰트가 이미 로드된 경우
                                if (fontAsset.isComplete()) {
 
                                        dispatchEvent(new Event(Event.COMPLETE));
 
                                        // 이미 로드에러인 경우
                                } else if (fontAsset.isError()) {
 
                                        dispatchEvent(new Event(IOErrorEvent.IO_ERROR));
 
                                } else {
 
                                        fontAsset.addEventListener(Event.OPEN,__eventHandler);
                                        fontAsset.addEventListener(Event.COMPLETE,__eventHandler);
                                        fontAsset.addEventListener(IOErrorEvent.IO_ERROR,__eventHandler);
                                        fontAsset.addEventListener(ProgressEvent.PROGRESS,__eventHandler);
                                        fontAsset.addEventListener(HTTPStatusEvent.HTTP_STATUS,__eventHandler);
 
                                }
                        }
                }
                /**
                 * 로드를 중지 또는 제거(등록된 폰트가 제거되지는 않는다)
                 */
                public function close():void {
                        dispose();                     
                        fontAsset=null;
                }
                /**
                 * 등록된 폰트의 이름을 반환
                 */
                public function get name():String {
                        return fontAsset ? fontAsset.name : null;
                }
                // _____________________________________________________ protected
                protected function dispose():void {
                        if (fontAsset) {
                                fontAsset.removeEventListener(Event.OPEN,__eventHandler);
                                fontAsset.removeEventListener(Event.COMPLETE,__eventHandler);
                                fontAsset.removeEventListener(IOErrorEvent.IO_ERROR,__eventHandler);
                                fontAsset.removeEventListener(ProgressEvent.PROGRESS,__eventHandler);
                                fontAsset.removeEventListener(HTTPStatusEvent.HTTP_STATUS,__eventHandler);
                                fontAsset.close();
                        }
                }
 
                // ____________________________________________________________ listener
                protected function __eventHandler(event:Event):void {
                        if (event.type == Event.COMPLETE || event.type == IOErrorEvent.IO_ERROR) {
                                dispose();
                        }
                        dispatchEvent(event);
                }
        }
}



- FontAsset : 폰트를 로드, 정보를 저장하는 클래스

/**
 * FontAsset -
 *
 * @author: showjean in http://showjean.com/works, mobile , mailto:showjean@hanmail.net
 * @version: 1.1.1
 * @date: 2009.7.6.
 *
 * @comment: FontAssetManager에서 생성되는 클래스로, font.swf파일을 로드하고 fontname까지 저장하고 있는다.
 */
package com.showjean.net{
 
        import flash.display.*;
        import flash.events.*;
        import flash.system.*;
        import flash.text.*;
        import flash.net.*;
        import flash.utils.*;
 
        public class FontAsset extends EventDispatcher {
 
                protected var __linkage:String;
                protected var __name:String;
                protected var loader:Loader;
 
                function FontAsset() {
                }
                // _____________________________________________________ public
                /**
                 * url: swf의 위치
                 * linkage: swf 라이브러리의 Font Class
                 *
                 * >다른 도메인의 폰트.swf를 로드해 올경우 LoaderContext를 설정한다
                 * >crossdomain.xml이 설정되어 있어야한다.
                 */
                public function load(url:String, linkage:String):void {
                        __linkage = linkage;
                        loader = new SLoader();
 
                        // LoaderContext
                        var context:LoaderContext=new LoaderContext();
                        context.checkPolicyFile=true;
                        context.applicationDomain = ApplicationDomain.currentDomain;
 
                        // 로컬에서 작동하지 않게
                        if ( Security.sandboxType == Security.REMOTE ) {
                                context.securityDomain=SecurityDomain.currentDomain;
                        }
 
                        loader.contentLoaderInfo.addEventListener(Event.OPEN,__completeHandler);
                        loader.contentLoaderInfo.addEventListener(Event.COMPLETE,__completeHandler);
                        loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,__completeHandler);
                        loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS,__completeHandler);
                        loader.contentLoaderInfo.addEventListener(HTTPStatusEvent.HTTP_STATUS, __completeHandler);
 
                        loader.load(new URLRequest(url), context);
                }
                /**
                 * 로드를 중지 또는 제거(등록된 폰트가 제거되지는 않는다)
                 */
                public function close():void {
                        dispose();
                }
                /**
                 * 등록된 폰트의 이름을 반환
                 */
                public function get name():String {
                        return __name;
                }
                /**
                 * 폰트로드가 완료되었는지 확인
                 */
                protected var _isComplete:Boolean = false;
                public function isComplete():Boolean {
                        return _isComplete;
                }
                /**
                 * 폰트로드가 실패했는지 확인
                 */
                protected var _isError:Boolean = false;
                public function isError():Boolean {
                        return _isError;
                }
                // _____________________________________________________ protected
                protected function dispose():void {
                        if (loader) {
                                loader.contentLoaderInfo.removeEventListener(Event.OPEN,__completeHandler);
                                loader.contentLoaderInfo.removeEventListener(Event.COMPLETE,__completeHandler);
                                loader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR,__completeHandler);
                                loader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS,__completeHandler);
                                loader.contentLoaderInfo.removeEventListener(HTTPStatusEvent.HTTP_STATUS, __completeHandler);
 
                                // 폰트를 등록한 후에는 swf파일이 필요없다.
                                try {
                                        if (loader.content) {
                                                loader.unload();
                                        } else {
                                                loader.close();
                                        }
                                } catch (error:Error) {
                                        trace(this, error);
                                }
                                loader = null;
                                prevFontArr = null;
                                //trace(this, "dispose......");
                        }
                }
                protected function getIndexByName(font:Font):int{
                        for (var i:int = 0; i < prevFontArr.length; ++i) {
                                var item:Font = prevFontArr[i] as Font;
                                if (item.fontName == font.fontName) {
                                        return i;                                      
                                }       
                        }
                        return -1;
                }
                // ____________________________________________________________ listener
                protected var prevFontArr:Array
                protected function __completeHandler(event:Event):void {
                        if (event.type == Event.OPEN) {
                               
                                prevFontArr = Font.enumerateFonts(false);
                               
                        } else if (event.type == Event.COMPLETE) {
                                try {
                                       
                                        var className:String = getQualifiedClassName( loader.content );
                                        // flash에서 new Font로 라이브러리에 등록한 파일일 경우.
                                        if (className == "flash.display::MovieClip") {
                                                var fontclass:Class = loader.contentLoaderInfo.applicationDomain.getDefinition(__linkage)  as  Class;
                                                Font.registerFont(fontclass);
                                        } else {
                                                // flex sdk로 폰트를 임베드한 파일일 경우(unicodeRange로 캐릭터 범위를 지정할 수 있다)
                                                // 자동 등록되므로 아무것도 하지 않는다.
                                        }
                                       
                                        // 때에 따라서 배열의 앞쪽 또는 뒤쪽으로 추가되어서 어느쪽으로 추가되었는지 판별
                                        var arr:Array = Font.enumerateFonts(false);
                                       
                                        // 텍스트필드에 수동으로 임베드한 폰트들이 indexOf연산에 -1이 반환되어서 제대로 작동하지 않음
                                        /*for each(var font:Font in arr) {
                                                if (prevFontArr.indexOf(font) == -1) {
                                                        __name = font.fontName;
                                                        break;
                                                }
                                        }*/
                                        for each(var font:Font in arr) {
                                                if (getIndexByName(font) == -1) {
                                                        __name = font.fontName;
                                                        break;
                                                }
                                        }
                                        trace(this, "added font name: ", __name);
 
                                } catch (e:Error) {
                                        trace(this, "error - Font.registerFont............ ", e.toString());
                                        // 폰트 등록 에러일경우 다시 등록하거나, 폰트가 포함되지 않은 swf파일
                                }
                                _isComplete = true;
                                dispose();
 
                        } else if (event.type == IOErrorEvent.IO_ERROR) {
                                _isError = true;
                                dispose();
                        }
 
                        dispatchEvent(event);
                }
        }
}



- FontAssetManager : FontAsset을 관리하는 싱글톤 클래스

/**
 * FontAssetManager -
 *
 * @author: showjean in http://showjean.com/works, mobile , mailto:showjean@hanmail.net
 * @version: 1.0.0
 * @date: 2009.5.22.
 *
 * @comment: SFont에서 이용하는 싱글톤 클래스로, FontAsset이 중복 생성되지 않도록 관리한다.
 */
package com.showjean.net{
 
        public class FontAssetManager {
 
                private static  var instance:FontAssetManager;
 
                protected var _fontsObject:Object=new Object();
 
                // _____________________________________________________ singleton
                /**
                 * 싱글톤 생성자
                 */
                function FontAssetManager( singletonForce:SingletonForce ) {
                }
 
                /**
                 * 싱글톤 클래스 접근 메서드
                 */
                public static function getInstance():FontAssetManager {
                        if ( !instance ) {
                                instance = new FontAssetManager( new SingletonForce() );
                        }
                        return instance;
                }
                // _____________________________________________________ public
                /**
                 * url: swf의 위치
                 * linkage: swf 라이브러리의 Font Class
                 *
                 * url을 object의 속성으로 저장된 FontAsset은 같은 url에 대해서는 하나의 객체만 존재하게 된다.
                 */
                public function getFontAsset(url:String, linkage:String):FontAsset {
                        var asset:FontAsset;
                        if (_fontsObject[url] == undefined) {
                                // 아직 로드전이라면 FontAsset생성, 로드 시작
                                asset = new FontAsset();
                                _fontsObject[url] = asset;
                               
                                try {
                                        asset.load(url, linkage);
                                } catch (e:Error) {
                                        trace(this, e);
                                }
                        } else {
                                // 로드중이거나 로드완료라면
                                asset = _fontsObject[url];
                                //trace(this, "이미 로드중... ", url);
                        }
                        return asset;
                }
        }
}
/**
* @private
* 싱글톤 패턴을 위한 클래스
*/
class SingletonForce {
}








*** 5.25일, SLoader의 next()메서드에서 에러의 소지가 있어 수정.

*** 4.23일, 로드중인 SLoader를 unload()하거나 close() 시키면 이어서 연속 로드가 되지 않는 버그를 수정.

 

이전의 (link)SequenceLoader는 OOP에 적용하기에는 유연하지 못하다는 것을 이번 프로젝트에서 느끼게 되어 새롭게 만든 SLoader.

 

Loader의 동생벌로서 사용법은 같으나 싱글톤인 SequenceCenter의 지배를 받아 로딩이 순차적으로 이루어지는 클래스이다.



- 사용법 : Loader와 같다. 

for (var i:int = 0; i<_len; ++i) {
        var sl:SLoader = new SLoader();
        sl.contentLoaderInfo.addEventListener(Event.COMPLETE,completeHandler);
        sl.load(new URLRequest(url));
}
 
function completeHandler(event:Event):void {
        trace("****", event);
        var ld:Loader = event.target.loader;
        ld.x =50;
        stage.addChild(ld);
}


- SLoader.as

/**
 * SLoader -
 *
 * @author: showjean in http://showjean.com/works, mobile, mailto:showjean@hanmail.net
 * @version: 1.2.2
 * @date: 2009.4.23.
 *
 * @comment:
 */
package com.showjean.net{
 
        import flash.net.*;
        import flash.display.*;
        import flash.events.*;
        import flash.system.*;
 
        public class SLoader extends Loader {
 
                //센터에서 다음 순서를 확인해서 자신이라면 로드시작
                protected var center:SequenceCenter=SequenceCenter.getInstance();
 
                protected var __uindex:int;
                protected var __request:URLRequest;
                protected var __context:LoaderContext;
 
                function SLoader() {
                        _isLoading = false;
                        center.addEventListener(SequenceCenterEvent.NEXT,__nextTurnHandler);
                        __uindex=center.index;// 시퀀스 센터에서 고유의 인덱스를 받아온다.
                }
                // _____________________________________________________ override
 
                // 로드를 하기전 시퀀스센터에 등록, 차례를 기다린다.
                override public function load(request:URLRequest,context:LoaderContext=null):void {
                        __request=request;
                        __context=context;
 
                        center.add(__uindex);
 
                        center.next();
                }
                override public function close():void {
                        dispose();
                        super.close();
                }
                override public function unload():void {
                        dispose();
                        super.unload();
                }
 
                // _____________________________________________________ public
                // _____________________________________________________ protected
                protected function dispose():void {
                        if (center) {
                                // 로딩중 멈추는 것이라면 다음을 로드
                                if(_isLoading && center.isActive){
                                        next();
                                }
                                removeEvent();
                                center.remove(__uindex);
                                center = null;
                                __request = null;
                                __context = null;
                        }
                }
                protected var _isLoading:Boolean
                protected function __load():void {
                        // 센터의 현재(자신)을 제거
                        center.removeEventListener(SequenceCenterEvent.NEXT,__nextTurnHandler);
                        center.shift();
 
                        addEvent();
 
                        center.isActive=true;
                        super.load(__request, __context);
                }
                protected function next():void {
                        if (center) {
                                center.isActive=false;
                                center.next();
                        }
                }
                protected function addEvent():void {
                        _isLoading = true;
                        this.contentLoaderInfo.addEventListener(Event.COMPLETE, __completeHandler);
                        this.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, __ioErrorHandler);
                }
                protected function removeEvent():void {
                        _isLoading = false;
                        this.contentLoaderInfo.removeEventListener(Event.COMPLETE, __completeHandler);
                        this.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, __ioErrorHandler);
                }
                // ____________________________________________________________ listener
                protected function __nextTurnHandler(event:SequenceCenterEvent):void {
                        //다음 로더가 자신이라면
                        if (__uindex == event.index) {
                                event.stopImmediatePropagation();
                                __load();
                        }
                }
                protected function __completeHandler(event:Event):void {
                        removeEvent();
                        next();
                }
                protected function __ioErrorHandler(event:IOErrorEvent):void {
                        removeEvent();
                        next();
                }
        }
}


- SequenceCenter.as

/**
 *  SequenceCenter
 *
 * @author: showjean in http://showjean.com/works, mobile , mailto:showjean@hanmail.net
 * @version: 1.0.2
 * @date: 2009.4.19.
 *
 * @comment: SequenceLoader를 순서대로 실행시키는 싱글톤
 */
package com.showjean.net{
 
        import flash.net.*;
        import flash.events.*;
 
        public class SequenceCenter extends EventDispatcher {
 
                static private  var instance:SequenceCenter=new SequenceCenter();
 
                private var _dataArr:Array;
                private var _isActive:Boolean = false;
                private var _index:int = 0;
 
                function SequenceCenter() {
                        if (instance) {
                                throw new Error("Singleton can only be accessed through Singleton.getInstance()");
                        }
                        _dataArr = new Array();
                }
                static public function getInstance():SequenceCenter {
                        return instance;
                }
                // _______________________________________________ public
                public function set isActive(b:Boolean):void {
                        _isActive = b;
                }
                // 로드 중인지 확인
                public function get isActive():Boolean {
                        return _isActive;
                }
                public function get index():int {
                        return _index++;
                }
                public function remove(idx:int):void {
                        var idx:int = _dataArr.indexOf(idx);
                        if(idx > -1){
                                _dataArr.splice(idx, 1);
                        }
                }
 
                public function add(idx:int):void {
                        _dataArr.push(idx);
                }
                public function shift():void {
                        _dataArr.shift();
                }
                public function next():void {
                        if (_dataArr.length > 0 && isActive==false) {
                                //trace("center next : ", _dataArr[0]);
                                dispatchEvent(new SequenceCenterEvent(SequenceCenterEvent.NEXT, int(_dataArr[0])));
                        }
                } 
 
        }
}


- SequenceCenterEvent.as

/**
 *  SequenceCenterEvent
 *
 * @author: showjean in http://showjean.com/works, mobile , mailto:showjean@hanmail.net
 * @version: 1.0.1
 * @date: 2008.9.26.
 *
 * @comment:
 */
package com.showjean.net{
 
        import flash.events.*;
        import flash.net.*;
        import flash.display.*;
 
        public class SequenceCenterEvent extends Event {
 
                public static  const NEXT:String = "next";
 
                private var _slIndex:int;
                public function SequenceCenterEvent(type:String, idx:int, bubbles:Boolean=false, cancelable:Boolean=false) {
                        super(type, bubbles, cancelable);
                        _slIndex = idx;
                }
                public function get index():int {
                        return _slIndex;
                }
                override public function clone():Event {
                        return new SequenceCenterEvent(this.type,_slIndex,this.bubbles,this.cancelable);
                }
                override public function toString():String {
                        return formatToString("SequenceCenterEvent","type","index","bubbles","cancelable","eventPhase");
                }
 
 
        }
}




as3.0에서

 

navigateToURL로 _blank 타겟의 새창을 열려고 할 경우 익스플로러6에서 (다른 버젼 확인 안 됨) 팝업 차단에 걸리는 경우가 있다.

 

자바스크립트로 해결이 가능한데, 이것도 약간의 문제가 있다.

 

우선은

 

ExternalInterface.call("eval", "window.open('"+url+"')");


위 처럼 url을 자바스크립트를 통해서 새창을 열게되면 팝업차단에 걸리지 않게 되는데, 이상하게 이것도 MouseEvent.MOUSE_DOWN을 통하면 차단된다.

 

(링크 참고 : http://showjean.tistory.com/92)

 

그렇기 때문에, MouseEvent.CLICK을 통해서 위처럼 자바스크립트로 새창을 열면 잘 된다.

 

OK~

 

(target이 특정 이름일 경우에는 모르겠다...)

var pattern:RegExp = /<img.*>/;

 

= "<img"로 시작하고 ">"로 끝나는 문자열. 가장 긴 영역을 검색

 


var str:String = "<img src=asdflkasdfjlasdf ><br /> 우리나라 좋은 나라"


위 패턴으로 "<img src=asdflkasdfjlasdf ><br />" 검색된다.

 


 

img 태그 부분만 검색하고 싶다면 한정 기호 "?"를 이용한다.

 

var pattern:RegExp = /<img.*?>/;


= "<img"로 시작하고 ">"로 끝나는 문자열. 가장 좁은 영역을 검색

 

결과는 "<img src=asdflkasdfjlasdf >"

어떻게 ApplicationDomain을 이용하면 될 수 있을 것 같았는데,

 

물론,

var lc:LoaderContext = new LoaderContext()
lc.applicationDomain = new ApplicationDomain(); // or new ApplicationDomain(ApplicationDomain.currentDomain);
var cls:Class = loader.contentLoaderInfo.applicationDomain.getDefinition("com.SourceClass")  as  Class;
var sc:Object = new cls();

위와 같이, ApplicationDomain.getDifinition()을 이용하면 문제 없지만, 클래스타입을 지정할 수 없고, 내가 원하는 건 직접 new를 통한 클래스 생성이다.

 

시나리오는 이렇다.

 

우선 필요한 클래스가 포함되어 있는 classAssets.swf파일을 생성한다. 의도에 따라서 업데이트가 이루어지는 파일이다.

이 파일을 로드해서 동적으로 클래스를 이용하는 main.swf파일이 있다. 이 파일은 처음 classAssets.swf를 로드 한 후 각각의 필요한 클래스를 생성해서 사용한다.

 

갱신 할 클래스 파일을 classAssets.swf에 포함 시키면 main.swf에서 로드후 자동으로 갱신되어 적용된다.

 

위와 같은 시나리오대로 작동시킬 방법이 우선 한 가지 있다.

 

LoaderContext.applicationDomain을 ApplicationDomain.currentDomain으로 설정하고 classAssets.swf에서 main.swf를 로드하는 것이다. 그렇게 되면, main.swf의 클래스중 classAssets.swf에 포함된 클래스는 부모의 것으로 갱신되게 된다. (F1에서는 이런 경우 에러를 발생시키고 로드가 멈춰진다고 하는데 (어느 것이 틀린건지 아니면 내가 잘 못 안 것인지) 그렇지는 않다.)

 

하지만, 내가 원하는 것은 시나리오대로 main.swf에서 classAssets.swf를 로드하는 방식이다.

 

F1은 RSL로 사용할 수 있다고 유혹하고 있는데...

계속 연구중...

 

                                                                                                                                                                                

 

검색 결과, 자식 .swf로 부모의 클래스를 갱신 할 수 없다고 한다. 그렇다면, 위 시나리오대로의 구현은 불가능하다.

 

ApplicationDomain.currentDomain.getDefinition()을 이용하거나, 위에서 언급했던 역방향으로 구현하는 방법을 조금 더 연구해봐야겠다.

일단은 이렇다.

 

loader.load(request, context); 를 실행했을때 crossdomain으로 허용되지 않은 서버에서 .swf파일을 로드하는 것이라면,

 

다른 이벤트는 작동하지 않고 HTTPStatusEvent.status 가 0으로 반환된다.

 

이미지(일단 .png)는 관계없다.

다른 브라우져에서는 잘 작동하는 것으로 확인됐지만, IE에서는

 

MouseEvent를 MOUSE_DOWN으로 하면 팝업 차단에 걸려서 정상 작동되지 않지만,

(자바스크립트의 flashUrl은 브라우저 새 창을 여는 펑션)

무슨 이유에서인지는 몰라도 CLICK으로 MouseEvent를 변경하면 잘 된다.

 

이것도 모든 서버/ 모든 컴퓨터에서 생기는 문제는 아닌것으로 보인다.

 

어쨌든 해결.

 

//grp.addEventListener(MouseEvent.MOUSE_DOWN, __click);
grp.addEventListener(MouseEvent.CLICK, __click);
// ________________________________________________ listener
protected function __click(event:MouseEvent):void {
        if(ExternalInterface.available){
                ExternalInterface.call("flashUrl", link, target);
        }
}

Loader로 로드한 이미지를 변형(BitmapData 등)을 하려고 할 경우

(loader.content에 접근시 에러발생 SecurityError: Error #2122) 

 

다른 도메인에서 로드한 이미지에대해서는 SecurityError가 발생한다.

 

이를 해결하기 위해서는 이미지가 있는 서버에서 Loader가 있는 서버를 crossdoman.xml에서 허용을 해줘야한다.

 

crossdomain.xml에 추가를 했다면

 

LoaderContext를 이용해서 해당파일을 살펴보도록 지시해야한다.

var loader:Loader = new Loader();
var lc:LoaderContext = new LoaderContext(true);
loader.load(new URLRequest("url"), lc);

ExternalInterface.addCallback("getData", receivedFromJavaScript);

 

// ________________________________________________ listener

protected function receivedFromJavaScript(value:String):void {

  trace(this);

}

위와 같이 ExternalInterface.addCallback에 등록된 메서드에 파라메터가 있다면 자바스크립트에서도 파라메터를 맞춰줘야한다.


function getData() {

    thisMovie("swf_id").getData("");

}


1시간 18분 삽질의 결과....


- 이벤트 리스너 제거


event.currentTarget.removeEventListener(event.type, arguments.callee);


NetStream을 이용할 때 flv의 사이즈가 변동되어도 안티알리아스가 적용되 부드러운 화면으로 보여지게 하기위해서


var video:Video = new Video();

video.smoothing = true; 


ok~!

 

P.S. - 2.0에서는 라이브러리의 Video심볼을 스테이지로 가져와 .smoothing을 설정하면된다.

var mc = new test();

addChild(mc);

mc.buttonMode = true;

mc.doubleClickEnabled = true;

mc.addEventListener(MouseEvent.CLICK, down);

mc.addEventListener(MouseEvent.DOUBLE_CLICK, down);

function down(...rest):void {

 trace(rest);

}


더블클릭 이벤트를 사용하기 위해서는 doubleClickEnabled를 true로 설정 해줘야 한다.

 

그런데 한 가지 문제점은 mc안에 다른 무비클립이 있는 경우 그 무비클립에게도 위와 같은 설정을 해줘야 한다는 것이다.

 

만약 mc안에 mc.inner라는 무비클립이 있다면


var mc = new test();

addChild(mc);

mc.buttonMode = true;

mc.doubleClickEnabled = true;

mc.inner.doubleClickEnabled = true;

mc.addEventListener(MouseEvent.CLICK, down);

mc.addEventListener(MouseEvent.DOUBLE_CLICK, down);

function down(...rest):void {

 trace(rest);

}

이런식으로 말이다. 



삽질은 이제부터 시작이다.

서로 다른 도메인에 존재하는 swf간의 크로스 스크립팅을 이용시 System.security.allowDomain("*"); 을 설정해야 한다.


이 때, 로드하는 swf에 위 설정을 하지 않고 로드 되는 swf에 내장 클래스인 Tween을 이용하면 자식클래스의 설정과 관계없이 "*** 보안 샌드박스 위반 *** 자식 swf에서 부모swf로 접근을 하려 한다"라는 메세지와 함께 오류가 발생하며 작동을 멈추게 된다.


Tween 클래스 이용시 유의할 필요가 있다.

// as2
function getByte(str:String):Number {
	var byte:Number = 0;
	var len:Number = str.length;
	for (var i:Number = 0; i < len; ++i) {
		var code:Number = str.charCodeAt(0);
		// check 2byte character
		if (code < 255) {
			byte = byte + 1;
		} else {
			byte = byte + 2;
		}

	}

	return byte;
}


var ts:String = "!~##$%^&*(()_+=-09876543421`가asdf";
trace(getByte(ts));