'Flash/AS3.0'에 해당되는 글 25건

  1. navigateToURL이 팝업차단에 걸릴 때 //2009/05/08 16:00
  2. RegExp 1 - 최단 일치 검색 //2009/04/29 14:41
  3. 클래스 동적 로드 //2008/12/10 00:07 1
  4. Loader와 LoaderContext 그리고 crossdomain //2008/11/27 20:54
  5. ExternalInterface와 MouseEvent //2008/10/08 20:11
  6. Loader 와 crossdomain.xml //2008/10/01 18:37
  7. ExternalInterface.addCallback //2008/09/05 13:25
  8. event.currentTarget.removeEventListener(event.type, arguments.callee); //2008/08/28 22:57
  9. video.smoothing = true; //2008/08/26 19:08
  10. MouseEvent.DOUBLE_CLICK //2007/10/24 14:23 2

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);

}

이런식으로 말이다. 



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