'분류 전체보기'에 해당되는 글 134건

  1. Loader 와 crossdomain.xml //2008/10/01 18:37
  2. ExternalInterface.addCallback //2008/09/05 13:25
  3. event.currentTarget.removeEventListener(event.type, arguments.callee); //2008/08/28 22:57
  4. video.smoothing = true; //2008/08/26 19:08
  5. MouseEvent.DOUBLE_CLICK //2007/10/24 14:23 2
  6. Tween과 Cross Scripting //2011/01/24 16:25
  7. 문자열 byte 수 알아내기
  8. TextField.bottomScroll, TextField.maxcroll //2009/07/17 11:08
  9. 콤포넌트 스킨 변경하기 //2009/01/20 00:41
  10. static을 이용한 클래스 사용 시 주의! //2008/12/30 14:13
  11. onLoadStart의 타이밍 문제 //2007/06/29 01:26
  12. MovieClipLoader listener missing 리스너 오작동 //2007/05/11 17:32
  13. Component Focus //2007/03/30 18:32
  14. Flash 8 | FlashPlayer 8 로컬 보안 해법 //2007/03/22 14:53 1
  15. playheadUpdate //2007/03/21 10:09 1

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

TextField.bottomScroll

TextField.maxcroll


위 속성들은 TextField.autoSize = true 일 때

TextField에 text가 입력되면서 바로 확인하면 아직 갱신 되지 않은 상태로 나타난다.

 

TextField._height는 바로 갱신되어 나타난다.

 

높이나 줄 수를 제한하고 싶을 때는 TextField._height를 이용하는 것이 좋을 것이다.



C:\Program Files\Adobe\Adobe Flash CS3\en\Configuration\Component Source\ActionScript 2.0\FLA

 

위 경로의 소스 fla파일을 열어서 라이브러리의 해당 스킨을 프로젝트 fla파일에 옮겨 수정한다.

 

주의 - 이렇게 라이브러리에서 복사해오면 해당 콤포넌트 심볼의 '첫프레임에 내보내기'에 체크가 되어 있지 않으므로 이를 체크해준다.

클래스(s.as)의 static 변수를 사용하면 해당 swf파일에 s.as의 모든 내용이 임포트된다.

 

이 때문에 con.swf에서 s.as의 static변수를 이용한 a.swf를 로드한 후 수정된 s.as를 사용한 s.swf를 로드하면 이미 구버젼의 s.as가 있기때문에 수정된 s.as파일이 아니라 구버젼의 s.as파일이 적용된다.

 

설명이 복잡하지만, 이미 로드된 as를 덮어씌우지 않는 다는 것을 염두하고 생각하면 이해가 쉽다. 다만 static변수를 1개라도 이용한다면 클래스의 모든 내용(안에서 이용된 클래스들까지도)이 함께 로드된다는걸 주의하면 되겠다.

MovieClipLoader의 리스너 중에서 onLoadStart는 로드 명령을 내리면 바로 실행되지 않고, 약간의 딜레이가 있는 후 (아마도 파일의 일부가 로드되기 시작하는 순간부터 일 것으로 추정) 실행된다.

 

그 때문에, 이전에 공개한 ImageLoader의 버퍼를 세밀하게 작동시켰을 때, 이 부분에서 에러가 난다.

 

로더는 이미 로드 명령을 내렸지만, 로드를 확인하는 버퍼에는 아직 로드 중이 아닌 것으로 확인이되어 (위의 딜레이 때문에),

같은 자리에 다시 로드 명령을 내려버린다. 그러면 이미 로드하던 무비클립이 중복(삭제)이 되어서 리스너가 마비가 되버린다.

 

ImageLoader에서의 리스너 마비는 프로그램 작동 중단의 상태로 이어지게된다. 하나하나 로드를 순서있게 하는 중에 리스너가 멈추게 되면 버퍼에 남은 이미지들을 로드하지 못하기 때문이다.

 

그래서, onLoadStart의 실행이 아니라 로드 명령을 내리는 순간에 dispatcher를 작동시켜서 이를 방지했다.



private function load():Void {
  //버퍼에 남은 이미지가 있고, 로딩중이 아니면 로드시작
  if (buffer.hasNext() && !_isActive) {
   _isActive = true;
   var data:Object = buffer.next();
   var url:String = String(data.url);
   _index = Number(data.index);
   var target:MovieClip = MovieClip(data.target);
   //
   swfLoader.loadClip(url, target);
   dispatchEvent({type:LOAD_START, target:target, index:_index}); // 딜레이를 기다리지 않고 바로 이벤트를 날린다.
  }
 }
 private function onLoadStart(_mc:MovieClip):Void { 
  //dispatchEvent({type:LOAD_START, target:_mc, index:_index});
 }

순차 로딩을 하기위해서 배열에 컨테이너 무비클립을 순서대로 넣어 놓은 후, 버퍼에 의해서 필요없는 무비클립을 배열에서 참조하여 삭제한다.

 

강제적으로 무비클립을 삭제해버리면(로드중인 무비클립을 삭제해 버리면), MovieClipLoader의 리스너가 작동하지 않게된다.

 

순차 로딩에서 리스너가 다운된다면 연속로딩을 할 수 없으므로, 지우고자하는 무비클립중 로드중인 것은 우선 로드시킨 후 삭제 하는 방식으로 구현하였다.

Component Focus

 

이전에 작업했던 플래시에 문제가 있다는 말을 보고 예전 소스를 열어서 살펴 보았다

 

마우스가 플래시영역으로 들어가면 휠이 작동하지 않는다는 내용이었다. 이것저것 테스트해보니 정말로 그 플래시만 포커스를 잡고 있는 것이었다.

 

이리저리 살펴보니 문제는 콤포넌트였다. 콤포넌트가 라이브러리에 등록되어 있으면, 실행중에 사용되지 않더라도 포커스가 제대로 작동하지 않았다.

 

범인은 '버튼'이었고 예전 '콤보박스'의 포커스 문제 이후로 다른 문제였다. (비슷하지만..)

 

- 라이브러리에 콤포넌트(버튼)가 등록되어 있으면 마우스 이벤트를 주지 않은 플래시에도 휠이 작동하지 않는다.

출처 - http://rhinoa.tistory.com/tag/%EB%A1%9C%EC%BB%AC%EB%B3%B4%EC%95%88

 

(방법1) 설정 관리자. (유저가 직접 설정)

설정 관리자의 보안 패널을 방문하면 신뢰할 수 있는 경로를 목록에서 직접 편집, 추가 또는 제거할 수 있습니다(그림 2 참조).





  • 그림 2. Flash Player 설정 관리자의 보안 설정

(방법2) FlashPlayerTrust 구성 파일. (자동 설치 방식)

이것은 신뢰할 수 있는 경로를 나열한 단순한 텍스트 파일입니다. 이 파일은 실행 가능한 설치 프로그램을 사용하여 만들 수 있습니다. 설치 프로그램에서 사용자 컴퓨터에 SWF를 설치할 때 신뢰 구성 파일을 설치하여 SWF를 신뢰하도록 지정할 수 있습니다. 이 작업이 각 SWF를 신뢰한다는 사용자의 결정을 명시적으로 나타내지는 않지만 설치 프로그램(실행 가능한 프로그램)을 실행함으로써 이 프로그램에 대한 사용자의 신뢰를 암시적으로 표시하는 것입니다. Flash Player는 두 위치에서 신뢰 구성 파일을 인식합니다. 하나는 컴퓨터의 모든 사용자에게 적용되고 다른 하나는 현재 사용자에게만 적용됩니다. OS 수준의 관리자 권한이 필요하면 모든 사용자 위치를 선택합니다. 각 위치는 다음과 같습니다.

    • Windows 모든 사용자:

      <system>\Macromed\Flash\FlashPlayerTrust

      (예: c:\WINNT\system32\Macromed\Flash\FlashPlayerTrust)

    • Windows 단일 사용자:

      <app data>\Macromedia\Flash Player\#Security\FlashPlayerTrust

      (예: c:\Documents and Settings\fred\Application Data\Macromedia\Flash Player\#Security\FlashPlayerTrust)

    • Mac OS 모든 사용자:

      <app support>/Macromedia/FlashPlayerTrust

      (예: /Library/Application Support/Macromedia/FlashPlayerTrust)

    • Mac OS 단일 사용자:

      <app data>/Macromedia/Flash Player/#Security/FlashPlayerTrust

      (예: /Users/fred/Library/Preferences/Macromedia/Flash Player/#Security/FlashPlayerTrust)

이 위치는 디렉토리이며 개별 파일이 아닙니다. 이러한 각각의 디렉토리에 원하는 개수의 구성 파일을 설치할 수 있습니다. Flash Player는 디렉토리에서 찾는 모든 파일을 읽습니다. 구성 파일은 FlashPlayerTrust의 하위 디렉토리에 저장할 수 없으며, FlashPlayerTrust 디렉토리에 직접 저장해야 합니다. 개별 구성 파일에 원하는 이름을 지정해도 되지만, 이름 충돌 문제를 방지하려면 설치 프로그램을 통해 해당 제품에만 사용하는 방법으로 구성 파일의 이름을 지정해야 합니다. FlashPlayerTrust 디렉토리는 지정된 시스템에 없을 수도 있으며 그러한 경우에는 설치 프로그램으로 만들어야 합니다.

이 파일의 구문은 매우 단순합니다. 로컬 경로를 한 줄에 한 개씩 무제한으로 포함할 수 있고 공백과 빈 줄을 사용할 수 있습니다. 주석은 # 문자와 함께 사용할 수 있으며 줄 끝에 표시됩니다. 공백을 포함하는 경로에는 작은 따옴표를 사용할 필요가 없으며 사용하면 문제가 발생합니다.

이 파일에는 ASCII가 아닌 문자를 포함할 수 있는 일부 사용자 컴퓨터의 파일 시스템 경로가 있으므로 FlashPlayerTrust 파일에서 사용하는 텍스트 인코딩이 매우 중요합니다. Flash Player는 이 파일의 시작 부분에서 유니코드 BOM(Byte Order Mark: 바이트 순서 표시 문자)을 찾아 UTF-8 및 UTF-16 BOM을 인식하고 파일의 나머지를 UTF-8 또는 UTF-16으로 처리합니다. (예를 들어 Windows 메모장과 Mac TextEdit에서 BOM을 포함하는 유니코드 텍스트 파일을 작성할 수 있으며 다른 여러 가지 텍스트 편집기에서도 동일한 작업을 수행할 수 있습니다.) FlashPlayerTrust 파일의 시작 부분에서 BOM을 찾지 못하면 해당 파일이 컴퓨터의 현재 "코드 페이지"(기본 로컬 인코딩)을 사용하는 것으로 해석됩니다.

 

 

3.FlashPlayerTrust 세부적인 설치 방법

 

FlashPlayerTrust 설치 경로 (windows 2000/XP)

- 전체사용자 적용시

C:\WINDOWS\system32\Macromed\Flash\FlashPlayerTrust\파일명.cfg


- 개인사용자 적용시

C:\Documents and Settings\user\Application Data\Macromedia\Flash Player\#Security\FlashPlayerTrust\파일명.cfg


파일명.cfg 내용 (파일명은 자유롭게)

- 특정파일만 신뢰 할때.
C:\경로\파일명.swf
C:\경로\파일명.html


- 폴더전체를 신뢰할때.
C:\경로\


[시나리오] CD-TITLE 배포시 

CD-TITLE 배포시 문제는 사용자 마다 CD롬의 드라이브 ID가 각각 다르다는 것. (D,E,F,G...)

그렇다고 모든 드라이브를 보안 해제하는건 너무 무책임 하다...

따라서, 예상 가능한 드라이브 밑에 특정 폴더를 만들어 보안 해제하는 방법을 쓰면 되겠다.

 

예)

1. [virusdesign]이라는 폴더를 만들어 개발한 모든 파일을 담는다.(swf,flv,as,,html,xml....등등)

2. virusdesign.cfg 파일을 만든다.

3. virusdesign.cfg 에 보안해제 경로를 적어준다.   

   ( D:\virudesign , E:\virudesign , F:\virudesign , G:\virudesign )

4. 이제 FlashPlayerTrust폴더 경로에 자동설치 해주는 인스톨 파일을 만든다.

(인스톨경로-C:\WINDOWS\system32\Macromed\Flash\FlashPlayerTrust\virusdesign.cfg)

5. CD를 삽입하면 오토런으로 인스톨이 되도록 해주면 더욱 좋을 것이다.

샘플파일-FlashPlayerTrust-goodvirus.zip

 


4. 자동 설치 파일(install) 제작 소프트웨어들.

1.인스톨쉴드(유료)  인스톨쉴드9사용법파워포인트-angeleyes80.zip

2.Nullsoft Scriptable Install System(NSIS)(무료) http://file.naver.com/view.php?fnum=104917

3. Advanced Installer(무료) http://file.naver.com/view.php?fnum=101030

4. Nix Install(무료) http://www.channeld.co.kr/Nixline/product/pro02.html



--------------------------------------------------------------------------------------


5. 추가 TIP


1. flash 8부터는 HTML에서 allowScriptAccess="always"을 해주어야 자바스크립트와 연동이 된다.


2. geturl 또는 fscommand 등... 네트웤 관련 함수들을 사용하지 않는 컨텐츠구성 이라면

위의 방법이 아닌, 플래쉬 프로젝트파일(exe)로 만들어 배포 하는것이 좋다.


3. flash8 보안에 관련된 조금더 자세한 사항를 보려면 http://blog.naver.com/goodvirus/50002738422


4. C:/WINDOWS/system32/Macromed/Flash 밑에 FlashAuthor.cfg 파일은 LocalSecurityPrompt=User 로 바꾸어 항상 최종사용자(user) 입장에서 개발하는 것이 좋다.


5. 간혹, cfg파일을 설치 하였는데, 보안이 해제 안되는 경우?

1. 설정된 디렉토리명 또는 그 하위 디렉토리명이 한글일때, 영문으로 바꿔준다.

2. (1번으로 안될 경우) 브라우져를  모두 껏다가 다시 켠다.

3. (2번으로 안될 경우) 컴퓨터 재부팅 한다.


---------------------------------------------------------------------------------------

가끔 동영상을 flv로 변환한 파일을 재생시키면, complete이벤트가 작동하지 않는 경우가 있다. playhead가 totaltime까지 도달하지 못해서 생기는 현상으로 보여진다.

 

여러개의 flv를 연속 재생시키기위해선 현재 동영상의 마지막을 알아야만 다음 flv를 재생시킬 수 있을텐데, complete가 작동하지 않으면 연속재생이 되지 않기때문에, playheadUpdate이벤트마다, 일정 시간뒤 (약 1초) 다음 flv를 재생시키는 setTimeout를 삭제/호출하면 마지막 playhead가 멈춰있을 경우 일정 시간뒤 다음 flv가 재생된다.

 

이때 주의 해야할 것이, playheadUpdate가 이전flv의 rewind과정에서도 작동을 하여 setTimeout의 삭제가 잘 되지 않는 것이다.

flv.state를 이용해서 playing시에만 setTimeout을 실행하도록 하면 문제가 해결된다.

 

단, 위의 방법은 flv의 다운로드가 늦어져 playhead가 멈춰있는 시간이 일정시간 이상이 되면(재생 중간이라도) 다음 flv가 재생되게 되므로 이를 고려해야한다. 

'Flash > AS2.0' 카테고리의 다른 글

Component Focus //2007/03/30 18:32  (0) 2012.06.05
Flash 8 | FlashPlayer 8 로컬 보안 해법 //2007/03/22 14:53  (1) 2012.06.05
setNewTextFormat , setTextFormat //2007/03/20 00:35  (0) 2012.06.05
crossdomain //2007/03/18 14:44  (0) 2012.06.05
Event  (0) 2012.06.05